Vuo  2.3.2
VuoCompilerCodeGenUtilities.hh
Go to the documentation of this file.
1 
10 #pragma once
11 
13 class VuoCompilerType;
14 class VuoPort;
15 class VuoType;
16 
17 #include "VuoPortClass.hh"
18 
23 {
24 private:
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);
32 
33  static void generateSubmissionToDispatchQueue(Module *module, BasicBlock *block, Value *dispatchQueueValue, Function *workerFunction, Value *contextValue, bool isSynchronous);
34 
35  static Value * generateConversionToDispatchObject(Module *module, BasicBlock *block, Value *dispatchObjectVariable);
36 
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);
40 
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);
48 
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);
55 
56  static Function * getVuoRegisterFunction(Module *module);
57  static Function * getVuoRetainFunction(Module *module);
58  static Function * getVuoReleaseFunction(Module *module);
59 
60  static Value * generateStderr(Module *module, BasicBlock *block);
61 
62 public:
63  static PointerType * getDispatchSemaphoreType(Module *module);
64  static PointerType * getDispatchGroupType(Module *module);
65  static StructType * getDispatchObjectType(Module *module);
66  static StructType * getNodeContextType(Module *module);
67  static StructType * getPortContextType(Module *module);
68  static StructType * getCompositionStateType(Module *module);
69  static StructType * getJsonObjectType(Module *module);
70  static PointerType * getCompositionInstanceDataType(Module *module);
71 
72  static Value * generateCreateDispatchSemaphore(Module *module, BasicBlock *block, int initialValue=1);
73  static Value * generateWaitForSemaphore(Module *module, BasicBlock *block, Value *semaphoreValue);
74  static Value * generateWaitForSemaphore(Module *module, BasicBlock *block, AllocaInst *semaphoreVariable);
75  static Value * generateWaitForSemaphore(Module *module, BasicBlock *block, Value *semaphoreValue, Value *timeoutValue);
76  static Value * generateWaitForSemaphore(Module *module, BasicBlock *block, AllocaInst *semaphoreVariable, Value *timeoutValue);
77  static void generateSignalForSemaphore(Module *module, BasicBlock *block, Value *semaphoreValue);
78  static void generateSignalForSemaphore(Module *module, BasicBlock *block, AllocaInst *semaphoreVariable);
79 
80  static Value * generateCreateDispatchGroup(Module *module, BasicBlock *block);
81  static void generateEnterDispatchGroup(Module *module, BasicBlock *block, Value *dispatchGroupValue);
82  static void generateLeaveDispatchGroup(Module *module, BasicBlock *block, Value *dispatchGroupValue);
83  static void generateWaitForDispatchGroup(Module *module, BasicBlock *block, Value *dispatchGroupValue, dispatch_time_t timeout=DISPATCH_TIME_FOREVER);
84 
85  static Value * generateGetGlobalDispatchQueue(Module *module, BasicBlock *block);
86  static Value * generateCreateDispatchQueue(Module *module, BasicBlock *block, string dispatchQueueName);
87  static void generateAsynchronousSubmissionToDispatchQueue(Module *module, BasicBlock *block, Value *dispatchQueueValue, Function *workerFunction, Value *contextValue);
88  static void generateSynchronousSubmissionToDispatchQueue(Module *module, BasicBlock *block, Value *dispatchQueueValue, Function *workerFunction, Value *contextValue);
89 
90  static void generateRetainForDispatchObject(Module *module, BasicBlock *block, Value *dispatchObjectVariable);
91  static void generateFinalizationForDispatchObject(Module *module, BasicBlock *block, Value *dispatchObjectVariable);
92 
93  static Value * generateCreateDispatchTime(Module *module, BasicBlock *block, Value *deltaValue);
94 
95  static Value * generateCreatePortContext(Module *module, BasicBlock *block, VuoCompilerType *dataType, bool isTrigger, std::string triggerQueueName);
96  static void generateSetPortContextEvent(Module *module, BasicBlock *block, Value *portContextValue, Value *eventValue);
97  static void generateSetPortContextData(Module *module, BasicBlock *block, Value *portContextValue, Value *dataValue, VuoCompilerType *dataType);
98  static void generateSetPortContextTriggerFunction(Module *module, BasicBlock *block, Value *portContextValue, Value *triggerFunctionValue);
99  static Value * generateGetPortContextEvent(Module *module, BasicBlock *block, Value *portContextValue);
100  static Value * generateGetPortContextDataVariable(Module *module, BasicBlock *block, Value *portContextValue, VuoCompilerType *dataType);
101  static Value * generateGetPortContextDataVariableAsVoidPointer(Module *module, BasicBlock *block, Value *portContextValue);
102  static Value * generateGetPortContextTriggerQueue(Module *module, BasicBlock *block, Value *portContextValue);
103  static Value * generateGetPortContextTriggerSemaphore(Module *module, BasicBlock *block, Value *portContextValue);
104  static Value * generateGetPortContextTriggerFunction(Module *module, BasicBlock *block, Value *portContextValue, FunctionType *functionType);
105  static void generateRetainPortContextData(Module *module, BasicBlock *block, Value *portContextValue);
106 
107  static Value * generateCreateNodeContext(Module *module, BasicBlock *block, bool hasInstanceData, bool isComposition, size_t outputEventCount);
108  static void generateSetNodeContextPortContexts(Module *module, BasicBlock *block, Value *nodeContextValue, vector<Value *> portContextValues);
109  static void generateSetNodeContextInstanceData(Module *module, BasicBlock *block, Value *nodeContextValue, Value *instanceDataValue);
110  static void generateSetNodeContextClaimingEventId(Module *module, BasicBlock *block, Value *nodeContextValue, Value *claimingEventIdValue);
111  static void generateSetNodeContextOutputEvent(Module *module, BasicBlock *block, Value *nodeContextValue, size_t index, Value *eventValue);
112  static Value * generateGetNodeContextPortContext(Module *module, BasicBlock *block, Value *nodeContextValue, int index);
113  static Value * generateGetNodeContextInstanceData(Module *module, BasicBlock *block, Value *nodeContextValue, Type *instanceDataType);
114  static Value * generateGetNodeContextInstanceDataVariable(Module *module, BasicBlock *block, Value *nodeContextValue, Type *instanceDataType);
115  static Value * generateGetNodeContextClaimingEventId(Module *module, BasicBlock *block, Value *nodeContextValue);
116  static Value * generateGetNodeContextExecutingGroup(Module *module, BasicBlock *block, Value *nodeContextValue);
117  static Value * generateGetNodeContextOutputEvent(Module *module, BasicBlock *block, Value *nodeContextValue, size_t index);
118  static void generateResetNodeContextEvents(Module *module, BasicBlock *block, Value *nodeContextValue);
119  static void generateStartedExecutingEvent(Module *module, BasicBlock *block, Value *nodeContextValue, Value *eventIdValue);
120  static void generateSpunOffExecutingEvent(Module *module, BasicBlock *block, Value *nodeContextValue, Value *eventIdValue);
121  static Value * generateFinishedExecutingEvent(Module *module, BasicBlock *block, Value *nodeContextValue, Value *eventIdValue);
122  static Value * generateGetOneExecutingEvent(Module *module, BasicBlock *block, Value *nodeContextValue);
123 
124  static Value * generateCreateCompositionState(Module *module, BasicBlock *block, Value *runtimeStateValue, Value *compositionIdentifierValue);
125  static Value * generateGetCompositionStateRuntimeState(Module *module, BasicBlock *block, Value *compositionStateValue);
126  static Value * generateGetCompositionStateCompositionIdentifier(Module *module, BasicBlock *block, Value *compositionStateValue);
127  static void generateFreeCompositionState(Module *module, BasicBlock *block, Value *compositionStateValue);
128 
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);
132 
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);
137  static void generateReturnThreadsForTriggerWorker(Module *module, BasicBlock *block, Value *eventIdValue, Value *compositionStateValue);
138  static void generateReturnThreadsForChainWorker(Module *module, BasicBlock *block, Value *eventIdValue, Value *compositionStateValue, Value *chainIndexValue);
139 
140  static void generateLockNodes(Module *module, BasicBlock *&block, Value *compositionStateValue, const vector<size_t> &nodeIndices, Value *eventIdValue, VuoCompilerConstantsCache *constantsCache);
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);
143  static void generateUnlockNodes(Module *module, BasicBlock *block, Value *compositionStateValue, const vector<size_t> &nodeIndices, VuoCompilerConstantsCache *constantsCache);
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);
146 
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);
150  static void generateSetStructPointerElement(Module *module, BasicBlock *block, Value *structPointer, size_t elementIndex, Value *value);
151  static Value * generateGetStructPointerElement(Module *module, BasicBlock *block, Value *structPointer, size_t elementIndex);
152  static Value * generatePointerToValue(BasicBlock *block, Value *value);
153  static Constant * generatePointerToConstantString(Module *module, string stringValue, string globalVariableName = "");
154  static Constant * generatePointerToConstantArrayOfStrings(Module *module, vector<string> stringValues, string globalVariableName = "");
155  static Constant * generatePointerToConstantArrayOfUnsignedLongs(Module *module, const vector<unsigned long> &values, string globalVariableName = "");
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);
158  static Value * generateFormattedString(Module *module, BasicBlock *block, string formatString, vector<Value *> replacementValues, VuoCompilerConstantsCache *constantsCache);
159  static Value * generateStringConcatenation(Module *module, BasicBlock *block, vector<Value *> stringsToConcatenate, VuoCompilerConstantsCache *constantsCache);
160  static Value * generateMemoryAllocation(Module *module, BasicBlock *block, Type *elementType, int elementCount);
161  static Value * generateMemoryAllocation(Module *module, BasicBlock *block, Type *elementType, Value *elementCountValue);
162  static Value * generateMemoryAllocation(Module *module, BasicBlock *block, size_t bytes);
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);
165  static void generateAnnotation(Module *module, BasicBlock *block, Value *value, string annotation, string fileName, unsigned int lineNumber, VuoCompilerConstantsCache *constantsCache);
166  static void generateModuleMetadata(Module *module, string metadata, string moduleKey);
167  static void generateRegisterCall(Module *module, BasicBlock *block, Value *argument, Function *freeFunction);
168  static void generateRetainCall(Module *module, BasicBlock *block, Value *argument);
169  static void generateReleaseCall(Module *module, BasicBlock *block, Value *argument);
170  static void generateRetainOrReleaseCall(Module *module, BasicBlock *block, Value *argument, bool isRetain);
171  static bool isRetainOrReleaseNeeded(Type *type);
172  static void generateFreeCall(Module *module, BasicBlock *block, Value *argument);
173  static void generateJsonObjectPut(Module *module, BasicBlock *block, Value *jsonObjectValue);
174  static void generateNullCheck(Module *module, Function *function, Value *valueToCheck, BasicBlock *initialBlock, BasicBlock *&nullBlock, BasicBlock *&notNullBlock);
175  static Value * generateSerialization(Module *module, BasicBlock *block, Value *valueToSerialize, VuoCompilerConstantsCache *constantsCache);
176  static void generateUnserialization(Module *module, BasicBlock *block, Value *stringToUnserialize, Value *destinationVariable, VuoCompilerConstantsCache *constantsCache);
177  static ICmpInst * generateIsPausedComparison(Module *module, BasicBlock *block, Value *compositionStateValue);
178  static void generateSendNodeExecutionStarted(Module *module, BasicBlock *block, Value *compositionStateValue, Value *nodeIdentifierValue);
179  static void generateSendNodeExecutionFinished(Module *module, BasicBlock *block, Value *compositionStateValue, Value *nodeIdentifierValue);
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);
186  static ICmpInst * generateShouldSendDataTelemetryComparison(Module *module, BasicBlock *block, string portIdentifier, Value *compositionStateValue, VuoCompilerConstantsCache *constantsCache);
187  static void generateIsNodeBeingRemovedOrReplacedCheck(Module *module, Function *function, string nodeIdentifier, Value *compositionStateValue, BasicBlock *initialBlock, BasicBlock *&trueBlock, BasicBlock *&falseBlock, VuoCompilerConstantsCache *constantsCache, Value *&replacementJsonValue);
188  static ICmpInst * generateIsNodeBeingAddedOrReplacedCheck(Module *module, Function *function, string nodeIdentifier, Value *compositionStateValue, BasicBlock *initialBlock, BasicBlock *&trueBlock, BasicBlock *&falseBlock, VuoCompilerConstantsCache *constantsCache, Value *&replacementJsonValue);
189  static ConstantInt * generateNoEventIdConstant(Module *module);
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);
192  static Value * generateGetCompositionContext(Module *module, BasicBlock *block, Value *compositionStateValue);
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);
195  static void generateInitContextForTopLevelComposition(Module *module, BasicBlock *block, Value *compositionStateValue, bool isStatefulComposition, size_t publishedOutputPortCount);
196  static void generateFiniContextForTopLevelComposition(Module *module, BasicBlock *block, Value *compositionStateValue);
197  static Value * getTriggerWorkersScheduledValue(Module *module, BasicBlock *block, Value *compositionStateValue);
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);
200  static Value * generateRuntimeStateValue(Module *module, BasicBlock *block);
201  static Value * generateGetNextEventId(Module *module, BasicBlock *block, Value *compositionStateValue);
202  static Value * generateCreateTriggerWorkerContext(Module *module, BasicBlock *block, Value *compositionStateValue, Value *dataCopyValue, Value *eventIdCopyValue);
203  static void generateFreeTriggerWorkerContext(Module *module, BasicBlock *block, Value *contextValue);
204  static Value * generateCreatePublishedInputWorkerContext(Module *module, BasicBlock *block, Value *compositionStateValue, Value *inputPortIdentifierValue, Value *valueAsStringValue, Value *isCompositionRunningValue);
205  static void generateAddCompositionStateToThreadLocalStorage(Module *module, BasicBlock *block, Value *compositionStateValue);
206  static void generateRemoveCompositionStateFromThreadLocalStorage(Module *module, BasicBlock *block);
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);
209 
210  static Function * getStrcatFunction(Module *module);
211  static Function * getStrcmpFunction(Module *module);
212  static Function * getStrdupFunction(Module *module);
213  static Function * getStrlenFunction(Module *module);
214  static Function * getSnprintfFunction(Module *module);
215  static Function * getSscanfFunction(Module *module);
216  static Function * getFprintfFunction(Module *module);
217  static Function * getPutsFunction(Module *module);
218  static Function * getMallocFunction(Module *module);
219  static Function * getMemcpyFunction(Module *module);
220  static Function * getFreeFunction(Module *module);
221  static Function * getAnnotateFunction(Module *module);
222  static Function * getJsonObjectPutFunction(Module *module);
223  static Function * getJsonObjectToJsonStringExtFunction(Module *module);
224  static Function * getJsonTokenerParseFunction(Module *module);
225  static Function * getVuoShaderMakeFunction(Module *module);
226  static Function * getVuoShaderAddSourceFunction(Module *module);
227  static Function * getVuoShaderSetTransparentFunction(Module *module);
228  static Function * getVuoShaderSetUniformFunction(Module *module, VuoCompilerType *type);
229  static Function * getVuoSamplerRectCoordinatesFromNormalizedCoordinatesFunction(Module *module);
230  static Function * getVuoImageGetColorDepthFunction(Module *module);
231  static Function * getVuoImageRendererRenderFunction(Module *module);
232  static Function * getCompositionAddNodeMetadataFunction(Module *module);
233  static Function * getCompositionCreateContextForNodeFunction(Module *module);
234  static Function * getCompositionPerformDataOnlyTransmissionsFunction(Module *module);
235  static Function * getCompositionReleasePortDataFunction(Module *module);
236  static Function * getSetupFunction(Module *module);
237  static Function * getCleanupFunction(Module *module);
238  static Function * getInstanceInitFunction(Module *module);
239  static Function * getInstanceFiniFunction(Module *module);
240  static Function * getInstanceTriggerStartFunction(Module *module);
241  static Function * getInstanceTriggerStopFunction(Module *module);
242  static Function * getNodeInstanceInitFunction(Module *module, string moduleKey, bool isSubcomposition, Type *instanceDataType, const vector<VuoPort *> &modelInputPorts, map<VuoPort *, size_t> &indexOfParameter, VuoCompilerConstantsCache *constantsCache);
243  static Function * getNodeInstanceFiniFunction(Module *module, string moduleKey, Type *instanceDataType, VuoCompilerConstantsCache *constantsCache);
244  static Function * getNodeInstanceTriggerStartFunction(Module *module, string moduleKey, Type *instanceDataType, const vector<VuoPort *> &modelInputPorts, map<VuoPort *, size_t> &indexOfParameter, VuoCompilerConstantsCache *constantsCache);
245  static Function * getNodeInstanceTriggerStopFunction(Module *module, string moduleKey, Type *instanceDataType, VuoCompilerConstantsCache *constantsCache);
246  static Function * getNodeInstanceTriggerUpdateFunction(Module *module, string moduleKey, Type *instanceDataType, const vector<VuoPort *> &modelInputPorts, map<VuoPort *, size_t> &indexOfParameter, VuoCompilerConstantsCache *constantsCache);
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);
252  static Function * getCompositionGetPortValueFunction(Module *module);
253  static Function * getSetInputPortValueFunction(Module *module);
254  static Function * getCompositionSetPortValueFunction(Module *module);
255  static Function * getCompositionFireTriggerPortEventFunction(Module *module);
256  static Function * getGetPublishedInputPortValueFunction(Module *module);
257  static Function * getGetPublishedOutputPortValueFunction(Module *module);
258  static Function * getCompositionSetPublishedInputPortValueFunction(Module *module);
259  static Function * getSetPublishedInputPortValueFunction(Module *module);
260 
261  static bool isPointerToStruct(Type *type, StructType **structType = nullptr);
262  static Value * callFunctionWithStructReturn(Function *function, vector<Value *> args, BasicBlock *block);
263  static bool isFunctionReturningStructViaParameter(Function *function);
264  static void copyParameterAttributes(Function *srcFunction, Function *dstFunction);
265  static void copyParameterAttributes(Module *module, Function *srcFunction, CallInst *dstCall);
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);
268  static FunctionType * getFunctionType(Module *module, VuoType *paramType);
269  static Value * getArgumentAtIndex(Function *function, size_t index);
270 };