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 Value * generateTypeCastFromLoweredTypeToArray(Module *module, BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
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,
54 map<VuoPort *, size_t> &indexOfParameter, map<VuoPort *, size_t> &indexOfEventParameter,
VuoCompilerConstantsCache *constantsCache);
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);
75 static Value *
generateWaitForSemaphore(Module *module, BasicBlock *block, Value *semaphoreValue, Value *timeoutValue);
76 static Value *
generateWaitForSemaphore(Module *module, BasicBlock *block, AllocaInst *semaphoreVariable, Value *timeoutValue);
83 static void generateWaitForDispatchGroup(Module *module, BasicBlock *block, Value *dispatchGroupValue, dispatch_time_t timeout=DISPATCH_TIME_FOREVER);
107 static Value *
generateCreateNodeContext(Module *module, BasicBlock *block,
bool hasInstanceData,
bool isComposition,
size_t outputEventCount);
129 static Value *
generateGetDataForPort(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue);
130 static Value *
generateGetNodeIndexForPort(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue);
131 static Value *
generateGetTypeIndexForPort(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue);
133 static void generateScheduleTriggerWorker(Module *module, BasicBlock *block, Value *queueValue, Value *contextValue, Value *workerFunctionValue,
int minThreadsNeeded,
int maxThreadsNeeded, Value *eventIdValue, Value *compositionStateValue,
int chainCount);
134 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);
135 static void generateGrantThreadsToChain(Module *module, BasicBlock *block,
int minThreadsNeeded,
int maxThreadsNeeded, Value *eventIdValue, Value *compositionStateValue,
size_t chainIndex);
136 static void generateGrantThreadsToSubcomposition(Module *module, BasicBlock *block, Value *eventIdValue, Value *compositionStateValue, Value *chainIndexValue, Value *subcompositionIdentifierValue);
141 static void generateLockNode(Module *module, BasicBlock *&block, Value *compositionStateValue,
size_t nodeIndex, Value *eventIdValue);
142 static void generateLockNode(Module *module, BasicBlock *&block, Value *compositionStateValue, Value *nodeIndexValue, Value *eventIdValue);
144 static void generateUnlockNode(Module *module, BasicBlock *block, Value *compositionStateValue,
size_t nodeIndex);
145 static void generateUnlockNode(Module *module, BasicBlock *block, Value *compositionStateValue, Value *nodeIndexValue);
147 static void generateSetArrayElement(Module *module, BasicBlock *block, Value *arrayValue,
size_t elementIndex, Value *value);
148 static Value *
generateGetArrayElement(Module *module, BasicBlock *block, Value *arrayValue,
size_t elementIndex);
149 static Value *
generateGetArrayElement(Module *module, BasicBlock *block, Value *arrayValue, Value *elementIndexValue);
156 static void generateStringMatchingCode(Module *module, Function *
function, BasicBlock *initialBlock, BasicBlock *finalBlock, Value *inputStringValue, map<
string, pair<BasicBlock *, BasicBlock *> > blocksForString,
VuoCompilerConstantsCache *constantsCache);
157 static void generateIndexMatchingCode(Module *module, Function *
function, BasicBlock *initialBlock, BasicBlock *finalBlock, Value *inputIndexValue, vector< pair<BasicBlock *, BasicBlock *> > blocksForIndex);
161 static Value *
generateMemoryAllocation(Module *module, BasicBlock *block, Type *elementType, Value *elementCountValue);
163 static void generateMemoryCopy(Module *module, BasicBlock *block, Value *sourceAddress, Value *destAddress,
size_t bytes);
164 static Value *
generateTypeCast(Module *module, BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
167 static void generateRegisterCall(Module *module, BasicBlock *block, Value *argument, Function *freeFunction);
172 static void generateFreeCall(Module *module, BasicBlock *block, Value *argument);
174 static void generateNullCheck(Module *module, Function *
function, Value *valueToCheck, BasicBlock *initialBlock, BasicBlock *&nullBlock, BasicBlock *¬NullBlock);
180 static void generateSendInputPortsUpdated(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue,
bool receivedEvent,
bool receivedData, Value *portDataSummaryValue);
181 static void generateSendInputPortsUpdated(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *receivedEventValue, Value *receivedDataValue, Value *portDataSummaryValue);
182 static void generateSendOutputPortsUpdated(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *sentEventValue, Value *sentDataValue, Value *portDataSummaryValue);
183 static void generateSendPublishedOutputPortsUpdated(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *sentDataValue, Value *portDataSummaryValue);
184 static void generateSendEventFinished(Module *module, BasicBlock *block, Value *compositionStateValue, Value *eventIdValue);
185 static void generateSendEventDropped(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue);
190 static Value *
generateGetNodeContext(Module *module, BasicBlock *block, Value *compositionStateValue,
size_t nodeIndex);
191 static Value *
generateGetNodeContext(Module *module, BasicBlock *block, Value *compositionStateValue, Value *nodeIndexValue);
193 static void generateAddNodeMetadata(Module *module, BasicBlock *block, Value *compositionStateValue, Value *nodeIdentifierValue, Function *compositionCreateContextForNodeFunction, Function *compositionSetPortValueFunction, Function *compositionGetPortValueFunction, Function *compositionFireTriggerPortEventFunction, Function *compositionReleasePortDataFunction);
194 static void generateAddPortMetadata(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *portNameValue,
size_t typeIndex, Value *initialValueValue);
198 static Value *
generateGetInputPortString(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *interprocessSerializationValue);
199 static Value *
generateGetOutputPortString(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue, Value *interprocessSerializationValue);
204 static Value *
generateCreatePublishedInputWorkerContext(Module *module, BasicBlock *block, Value *compositionStateValue, Value *inputPortIdentifierValue, Value *valueAsStringValue, Value *isCompositionRunningValue);
207 static void generatePrint(Module *module, BasicBlock *block,
string formatString, Value *value=NULL);
208 static void generatePrint(Module *module, BasicBlock *block,
string formatString,
const vector<Value *> &values);
247 static Function *
getNodeEventFunction(Module *module,
string moduleKey,
bool isSubcomposition,
bool isStateful,
248 Type *instanceDataType,
const vector<VuoPort *> &modelInputPorts,
const vector<VuoPort *> &modelOutputPorts,
249 const map<VuoPort *, json_object *> &detailsForPorts,
const map<VuoPort *, string> &displayNamesForPorts,
250 const map<VuoPort *, string> &defaultValuesForInputPorts,
const map<VuoPort *, VuoPortClass::EventBlocking> &eventBlockingForInputPorts,
251 map<VuoPort *, size_t> &indexOfParameter, map<VuoPort *, size_t> &indexOfEventParameter,
VuoCompilerConstantsCache *constantsCache);
266 static void copyParameterAttributes(Module *module,
const AttributeList &srcAttributes,
size_t srcStartParam,
size_t srcNumParams, Function *dstFunction,
size_t dstStartParam);
267 static void copyParameterAttributes(Module *module,
const AttributeList &srcAttributes,
size_t srcStartParam,
size_t srcNumParams, CallInst *dstCall,
size_t dstStartParam);