25 static PointerType * getDispatchQueueType(Module *module);
26 static StructType * getDispatchObjectElementType(Module *module);
27 static StructType * getGraphvizGraphType(Module *module);
28 static PointerType * getPointerToFileType(Module *module);
29 static PointerType * getVuoShaderType(Module *module);
30 static PointerType * getVuoImageType(Module *module);
31 static Type * getVuoImageColorDepthType(Module *module);
33 static void generateSubmissionToDispatchQueue(Module *module, BasicBlock *block, Value *dispatchQueueValue, Function *workerFunction, Value *contextValue,
bool isSynchronous);
35 static Value * generateConversionToDispatchObject(Module *module, BasicBlock *block, Value *dispatchObjectVariable);
37 static Value * generateGetArrayElementVariable(Module *module, BasicBlock *block, Value *arrayValue,
size_t elementIndex);
38 static Value * generateGetArrayElementVariable(Module *module, BasicBlock *block, Value *arrayValue, Value *elementIndexValue);
39 static Value * generateGetStructPointerElementVariable(Module *module, BasicBlock *block, Value *structPointer,
size_t elementIndex);
41 static Value * generateTypeCastFromIntegerToPointer(Module *module, BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
42 static Value * generateTypeCastFromFloatingPointToPointer(Module *module, BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
43 static Value * generateTypeCastFromPointerToInteger(Module *module, BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
44 static Value * generateTypeCastFromPointerToFloatingPoint(Module *module, BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
45 static Value * generateTypeCastFromLoweredTypeToStruct(BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
46 static Value * generateTypeCastFromLoweredTypeToVector(BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
47 static void generateRetainOrReleaseCall(Module *module, BasicBlock *block, Value *argument,
bool isRetain);
49 static Function * getNodeFunction(Module *module,
string moduleKey,
string functionName,
bool hasCompositionStateArg,
bool hasInstanceDataArg,
bool hasInstanceDataReturn,
bool hasEventArgs,
50 Type *instanceDataType,
51 const vector<VuoPort *> &modelInputPorts,
const vector<VuoPort *> &modelOutputPorts,
52 const map<VuoPort *, json_object *> &detailsForPorts,
const map<VuoPort *, string> &displayNamesForPorts,
53 const map<VuoPort *, string> &defaultValuesForInputPorts,
const map<VuoPort *, VuoPortClass::EventBlocking> &eventBlockingForInputPorts,
56 static Function * getVuoRegisterFunction(Module *module);
57 static Function * getVuoRetainFunction(Module *module);
58 static Function * getVuoReleaseFunction(Module *module);
60 static Value * generateStderr(Module *module, BasicBlock *block);
62 static bool isParameterPassedByValue(Function *
function,
int parameterIndex);
77 static Value *
generateWaitForSemaphore(Module *module, BasicBlock *block, Value *semaphoreValue, Value *timeoutValue);
78 static Value *
generateWaitForSemaphore(Module *module, BasicBlock *block, AllocaInst *semaphoreVariable, Value *timeoutValue);
85 static void generateWaitForDispatchGroup(Module *module, BasicBlock *block, Value *dispatchGroupValue, dispatch_time_t timeout=DISPATCH_TIME_FOREVER);
97 static Value *
generateCreatePortContext(Module *module, BasicBlock *block, Type *dataType,
bool isTrigger, std::string triggerQueueName);
110 static Value *
generateCreateNodeContext(Module *module, BasicBlock *block,
bool hasInstanceData,
bool isComposition,
size_t outputEventCount);
133 static Value *
generateGetDataForPort(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue);
135 static Value *
generateGetNodeIndexForPort(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue);
136 static Value *
generateGetTypeIndexForPort(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue);
138 static void generateScheduleTriggerWorker(Module *module, BasicBlock *block, Value *queueValue, Value *contextValue, Value *workerFunctionValue,
int minThreadsNeeded,
int maxThreadsNeeded, Value *eventIdValue, Value *compositionStateValue,
int chainCount);
139 static void generateScheduleChainWorker(Module *module, BasicBlock *block, Value *queueValue, Value *contextValue, Value *workerFunctionValue,
int minThreadsNeeded,
int maxThreadsNeeded, Value *eventIdValue, Value *compositionStateValue,
size_t chainIndex, vector<size_t> upstreamChainIndices);
140 static void generateGrantThreadsToChain(Module *module, BasicBlock *block,
int minThreadsNeeded,
int maxThreadsNeeded, Value *eventIdValue, Value *compositionStateValue,
size_t chainIndex);
141 static void generateGrantThreadsToSubcomposition(Module *module, BasicBlock *block, Value *eventIdValue, Value *compositionStateValue, Value *chainIndexValue, Value *subcompositionIdentifierValue);
145 static void generateSetArrayElement(Module *module, BasicBlock *block, Value *arrayValue,
size_t elementIndex, Value *value);
146 static Value *
generateGetArrayElement(Module *module, BasicBlock *block, Value *arrayValue,
size_t elementIndex);
147 static Value *
generateGetArrayElement(Module *module, BasicBlock *block, Value *arrayValue, Value *elementIndexValue);
154 static void generateIndexMatchingCode(Module *module, Function *
function, BasicBlock *initialBlock, BasicBlock *finalBlock, Value *inputIndexValue, vector< pair<BasicBlock *, BasicBlock *> > blocksForIndex);
158 static Value *
generateMemoryAllocation(Module *module, BasicBlock *block, Type *elementType, Value *elementCountValue);
159 static Value *
generateTypeCast(Module *module, BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
162 static void generateRegisterCall(Module *module, BasicBlock *block, Value *argument, Function *freeFunction);
166 static void generateFreeCall(Module *module, BasicBlock *block, Value *argument);
168 static void generateNullCheck(Module *module, Function *
function, Value *valueToCheck, BasicBlock *initialBlock, BasicBlock *&nullBlock, BasicBlock *¬NullBlock);
174 static void generateSendInputPortsUpdated(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue,
bool receivedEvent,
bool receivedData, Value *portDataSummaryValue);
175 static void generateSendInputPortsUpdated(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *receivedEventValue, Value *receivedDataValue, Value *portDataSummaryValue);
176 static void generateSendOutputPortsUpdated(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *sentEventValue, Value *sentDataValue, Value *portDataSummaryValue);
177 static void generateSendPublishedOutputPortsUpdated(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *sentDataValue, Value *portDataSummaryValue);
178 static void generateSendEventFinished(Module *module, BasicBlock *block, Value *compositionStateValue, Value *eventIdValue);
179 static void generateSendEventDropped(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue);
184 static Value *
generateGetNodeContext(Module *module, BasicBlock *block, Value *compositionStateValue,
size_t nodeIndex);
185 static Value *
generateGetNodeContext(Module *module, BasicBlock *block, Value *compositionStateValue, Value *nodeIndexValue);
187 static void generateAddNodeMetadata(Module *module, BasicBlock *block, Value *compositionStateValue, Value *nodeIdentifierValue, Function *compositionCreateContextForNodeFunction, Function *compositionSetPortValueFunction, Function *compositionGetPortValueFunction, Function *compositionFireTriggerPortEventFunction, Function *compositionReleasePortDataFunction);
188 static void generateAddPortMetadata(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *portNameValue,
size_t typeIndex, Value *initialValueValue);
192 static Value *
generateGetInputPortString(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *interprocessSerializationValue);
193 static Value *
generateGetOutputPortString(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *interprocessSerializationValue);
198 static Value *
generateCreatePublishedInputWorkerContext(Module *module, BasicBlock *block, Value *compositionStateValue, Value *inputPortIdentifierValue, Value *valueAsStringValue, Value *isCompositionRunningValue);
201 static void generatePrint(Module *module, BasicBlock *block,
string formatString, Value *value=NULL);
202 static void generatePrint(Module *module, BasicBlock *block,
string formatString,
const vector<Value *> &values);
240 static Function *
getNodeEventFunction(Module *module,
string moduleKey,
bool isSubcomposition,
bool isStateful,
241 Type *instanceDataType,
const vector<VuoPort *> &modelInputPorts,
const vector<VuoPort *> &modelOutputPorts,
242 const map<VuoPort *, json_object *> &detailsForPorts,
const map<VuoPort *, string> &displayNamesForPorts,
243 const map<VuoPort *, string> &defaultValuesForInputPorts,
const map<VuoPort *, VuoPortClass::EventBlocking> &eventBlockingForInputPorts,
257 static Value *
convertArgumentToParameterType(Value *argument, Function *
function,
int parameterIndex, Value **secondArgument, Module *module, BasicBlock *block);
258 static Value *
convertArgumentToParameterType(Value *argument, FunctionType *functionType,
int parameterIndex,
bool isPassedByValue, Value **secondArgument, Module *module, BasicBlock *block);