Vuo  2.0.0
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 void generateRetainOrReleaseCall(Module *module, BasicBlock *block, Value *argument, bool isRetain);
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, VuoCompilerConstantStringCache &constantStrings);
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  static bool isParameterPassedByValue(Function *function, int parameterIndex);
63 
64 public:
65  static PointerType * getDispatchSemaphoreType(Module *module);
66  static PointerType * getDispatchGroupType(Module *module);
67  static StructType * getDispatchObjectType(Module *module);
68  static StructType * getNodeContextType(Module *module);
69  static StructType * getPortContextType(Module *module);
70  static StructType * getCompositionStateType(Module *module);
71  static StructType * getJsonObjectType(Module *module);
72  static PointerType * getCompositionInstanceDataType(Module *module);
73 
74  static Value * generateCreateDispatchSemaphore(Module *module, BasicBlock *block, int initialValue=1);
75  static Value * generateWaitForSemaphore(Module *module, BasicBlock *block, Value *semaphoreValue);
76  static Value * generateWaitForSemaphore(Module *module, BasicBlock *block, AllocaInst *semaphoreVariable);
77  static Value * generateWaitForSemaphore(Module *module, BasicBlock *block, Value *semaphoreValue, Value *timeoutValue);
78  static Value * generateWaitForSemaphore(Module *module, BasicBlock *block, AllocaInst *semaphoreVariable, Value *timeoutValue);
79  static void generateSignalForSemaphore(Module *module, BasicBlock *block, Value *semaphoreValue);
80  static void generateSignalForSemaphore(Module *module, BasicBlock *block, AllocaInst *semaphoreVariable);
81 
82  static Value * generateCreateDispatchGroup(Module *module, BasicBlock *block);
83  static void generateEnterDispatchGroup(Module *module, BasicBlock *block, Value *dispatchGroupValue);
84  static void generateLeaveDispatchGroup(Module *module, BasicBlock *block, Value *dispatchGroupValue);
85  static void generateWaitForDispatchGroup(Module *module, BasicBlock *block, Value *dispatchGroupValue, dispatch_time_t timeout=DISPATCH_TIME_FOREVER);
86 
87  static Value * generateGetGlobalDispatchQueue(Module *module, BasicBlock *block);
88  static Value * generateCreateDispatchQueue(Module *module, BasicBlock *block, string dispatchQueueName);
89  static void generateAsynchronousSubmissionToDispatchQueue(Module *module, BasicBlock *block, Value *dispatchQueueValue, Function *workerFunction, Value *contextValue);
90  static void generateSynchronousSubmissionToDispatchQueue(Module *module, BasicBlock *block, Value *dispatchQueueValue, Function *workerFunction, Value *contextValue);
91 
92  static void generateRetainForDispatchObject(Module *module, BasicBlock *block, Value *dispatchObjectVariable);
93  static void generateFinalizationForDispatchObject(Module *module, BasicBlock *block, Value *dispatchObjectVariable);
94 
95  static Value * generateCreateDispatchTime(Module *module, BasicBlock *block, Value *deltaValue);
96 
97  static Value * generateCreatePortContext(Module *module, BasicBlock *block, Type *dataType, bool isTrigger, std::string triggerQueueName);
98  static void generateSetPortContextEvent(Module *module, BasicBlock *block, Value *portContextValue, Value *eventValue);
99  static void generateSetPortContextData(Module *module, BasicBlock *block, Value *portContextValue, Value *dataValue);
100  static void generateSetPortContextTriggerFunction(Module *module, BasicBlock *block, Value *portContextValue, Value *triggerFunctionValue);
101  static Value * generateGetPortContextEvent(Module *module, BasicBlock *block, Value *portContextValue);
102  static Value * generateGetPortContextData(Module *module, BasicBlock *block, Value *portContextValue, Type *dataType);
103  static Value * generateGetPortContextDataVariable(Module *module, BasicBlock *block, Value *portContextValue, Type *dataType);
104  static Value * generateGetPortContextDataVariableAsVoidPointer(Module *module, BasicBlock *block, Value *portContextValue);
105  static Value * generateGetPortContextTriggerQueue(Module *module, BasicBlock *block, Value *portContextValue);
106  static Value * generateGetPortContextTriggerSemaphore(Module *module, BasicBlock *block, Value *portContextValue);
107  static Value * generateGetPortContextTriggerFunction(Module *module, BasicBlock *block, Value *portContextValue, FunctionType *functionType);
108  static void generateRetainPortContextData(Module *module, BasicBlock *block, Value *portContextValue);
109 
110  static Value * generateCreateNodeContext(Module *module, BasicBlock *block, bool hasInstanceData, bool isComposition, size_t outputEventCount);
111  static void generateSetNodeContextPortContexts(Module *module, BasicBlock *block, Value *nodeContextValue, vector<Value *> portContextValues);
112  static void generateSetNodeContextInstanceData(Module *module, BasicBlock *block, Value *nodeContextValue, Value *instanceDataValue);
113  static void generateSetNodeContextClaimingEventId(Module *module, BasicBlock *block, Value *nodeContextValue, Value *claimingEventIdValue);
114  static void generateSetNodeContextOutputEvent(Module *module, BasicBlock *block, Value *nodeContextValue, size_t index, Value *eventValue);
115  static Value * generateGetNodeContextPortContext(Module *module, BasicBlock *block, Value *nodeContextValue, int index);
116  static Value * generateGetNodeContextInstanceData(Module *module, BasicBlock *block, Value *nodeContextValue, Type *instanceDataType);
117  static Value * generateGetNodeContextInstanceDataVariable(Module *module, BasicBlock *block, Value *nodeContextValue, Type *instanceDataType);
118  static Value * generateGetNodeContextSemaphore(Module *module, BasicBlock *block, Value *nodeContextValue);
119  static Value * generateGetNodeContextClaimingEventId(Module *module, BasicBlock *block, Value *nodeContextValue);
120  static Value * generateGetNodeContextExecutingGroup(Module *module, BasicBlock *block, Value *nodeContextValue);
121  static Value * generateGetNodeContextOutputEvent(Module *module, BasicBlock *block, Value *nodeContextValue, size_t index);
122  static void generateResetNodeContextEvents(Module *module, BasicBlock *block, Value *nodeContextValue);
123  static void generateStartedExecutingEvent(Module *module, BasicBlock *block, Value *nodeContextValue, Value *eventIdValue);
124  static void generateSpunOffExecutingEvent(Module *module, BasicBlock *block, Value *nodeContextValue, Value *eventIdValue);
125  static Value * generateFinishedExecutingEvent(Module *module, BasicBlock *block, Value *nodeContextValue, Value *eventIdValue);
126  static Value * generateGetOneExecutingEvent(Module *module, BasicBlock *block, Value *nodeContextValue);
127 
128  static Value * generateCreateCompositionState(Module *module, BasicBlock *block, Value *runtimeStateValue, Value *compositionIdentifierValue);
129  static Value * generateGetCompositionStateRuntimeState(Module *module, BasicBlock *block, Value *compositionStateValue);
130  static Value * generateGetCompositionStateCompositionIdentifier(Module *module, BasicBlock *block, Value *compositionStateValue);
131  static void generateFreeCompositionState(Module *module, BasicBlock *block, Value *compositionStateValue);
132 
133  static Value * generateGetDataForPort(Module *module, BasicBlock *block, Value *compositionStateValue, Value *portIdentifierValue);
134  static Value * generateGetNodeSemaphoreForPort(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);
137 
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);
142  static void generateReturnThreadsForTriggerWorker(Module *module, BasicBlock *block, Value *eventIdValue, Value *compositionStateValue);
143  static void generateReturnThreadsForChainWorker(Module *module, BasicBlock *block, Value *eventIdValue, Value *compositionStateValue, Value *chainIndexValue);
144 
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);
148  static void generateSetStructPointerElement(Module *module, BasicBlock *block, Value *structPointer, size_t elementIndex, Value *value);
149  static Value * generateGetStructPointerElement(Module *module, BasicBlock *block, Value *structPointer, size_t elementIndex);
150  static Value * generatePointerToValue(BasicBlock *block, Value *value);
151  static Constant * generatePointerToConstantString(Module *module, string stringValue, string globalVariableName = "");
152  static Constant * generatePointerToConstantArrayOfStrings(Module *module, vector<string> stringValues, string globalVariableName = "");
153  static void generateStringMatchingCode(Module *module, Function *function, BasicBlock *initialBlock, BasicBlock *finalBlock, Value *inputStringValue, map<string, pair<BasicBlock *, BasicBlock *> > blocksForString, VuoCompilerConstantStringCache &constantStrings);
154  static void generateIndexMatchingCode(Module *module, Function *function, BasicBlock *initialBlock, BasicBlock *finalBlock, Value *inputIndexValue, vector< pair<BasicBlock *, BasicBlock *> > blocksForIndex);
155  static Value * generateFormattedString(Module *module, BasicBlock *block, string formatString, vector<Value *> replacementValues, VuoCompilerConstantStringCache &constantStrings);
156  static Value * generateStringConcatenation(Module *module, BasicBlock *block, vector<Value *> stringsToConcatenate, VuoCompilerConstantStringCache &constantStrings);
157  static Value * generateMemoryAllocation(Module *module, BasicBlock *block, Type *elementType, int elementCount);
158  static Value * generateMemoryAllocation(Module *module, BasicBlock *block, Type *elementType, Value *elementCountValue);
159  static Value * generateTypeCast(Module *module, BasicBlock *block, Value *valueToCast, Type *typeToCastTo);
160  static void generateAnnotation(Module *module, BasicBlock *block, Value *value, string annotation, string fileName, unsigned int lineNumber, VuoCompilerConstantStringCache &constantStrings);
161  static void generateModuleMetadata(Module *module, string metadata, string moduleKey);
162  static void generateRegisterCall(Module *module, BasicBlock *block, Value *argument, Function *freeFunction);
163  static void generateRetainCall(Module *module, BasicBlock *block, Value *argument);
164  static void generateReleaseCall(Module *module, BasicBlock *block, Value *argument);
165  static bool isRetainOrReleaseNeeded(Type *type);
166  static void generateFreeCall(Module *module, BasicBlock *block, Value *argument);
167  static void generateJsonObjectPut(Module *module, BasicBlock *block, Value *jsonObjectValue);
168  static void generateNullCheck(Module *module, Function *function, Value *valueToCheck, BasicBlock *initialBlock, BasicBlock *&nullBlock, BasicBlock *&notNullBlock);
169  static Value * generateSerialization(Module *module, BasicBlock *block, Value *valueToSerialize, VuoCompilerConstantStringCache &constantStrings);
170  static void generateUnserialization(Module *module, BasicBlock *block, Value *stringToUnserialize, Value *destinationVariable, VuoCompilerConstantStringCache &constantStrings);
171  static ICmpInst * generateIsPausedComparison(Module *module, BasicBlock *block, Value *compositionStateValue);
172  static void generateSendNodeExecutionStarted(Module *module, BasicBlock *block, Value *compositionStateValue, Value *nodeIdentifierValue);
173  static void generateSendNodeExecutionFinished(Module *module, BasicBlock *block, Value *compositionStateValue, Value *nodeIdentifierValue);
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);
180  static ICmpInst * generateShouldSendDataTelemetryComparison(Module *module, BasicBlock *block, string portIdentifier, Value *compositionStateValue, VuoCompilerConstantStringCache &constantStrings);
181  static void generateIsNodeBeingRemovedOrReplacedCheck(Module *module, Function *function, string nodeIdentifier, Value *compositionStateValue, BasicBlock *initialBlock, BasicBlock *&trueBlock, BasicBlock *&falseBlock, VuoCompilerConstantStringCache &constantStrings, Value *&replacementJsonValue);
182  static ICmpInst * generateIsNodeBeingAddedOrReplacedCheck(Module *module, Function *function, string nodeIdentifier, Value *compositionStateValue, BasicBlock *initialBlock, BasicBlock *&trueBlock, BasicBlock *&falseBlock, VuoCompilerConstantStringCache &constantStrings, Value *&replacementJsonValue);
183  static ConstantInt * generateNoEventIdConstant(Module *module);
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);
186  static Value * generateGetCompositionContext(Module *module, BasicBlock *block, Value *compositionStateValue);
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);
189  static void generateInitContextForTopLevelComposition(Module *module, BasicBlock *block, Value *compositionStateValue, bool isStatefulComposition, size_t publishedOutputPortCount);
190  static void generateFiniContextForTopLevelComposition(Module *module, BasicBlock *block, Value *compositionStateValue);
191  static Value * getTriggerWorkersScheduledValue(Module *module, BasicBlock *block, Value *compositionStateValue);
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);
194  static Value * generateRuntimeStateValue(Module *module, BasicBlock *block);
195  static Value * generateGetNextEventId(Module *module, BasicBlock *block, Value *compositionStateValue);
196  static Value * generateCreateTriggerWorkerContext(Module *module, BasicBlock *block, Value *compositionStateValue, Value *dataCopyValue, Value *eventIdCopyValue);
197  static void generateFreeTriggerWorkerContext(Module *module, BasicBlock *block, Value *contextValue);
198  static Value * generateCreatePublishedInputWorkerContext(Module *module, BasicBlock *block, Value *compositionStateValue, Value *inputPortIdentifierValue, Value *valueAsStringValue, Value *isCompositionRunningValue);
199  static void generateAddCompositionStateToThreadLocalStorage(Module *module, BasicBlock *block, Value *compositionStateValue);
200  static void generateRemoveCompositionStateFromThreadLocalStorage(Module *module, BasicBlock *block);
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);
203 
204  static Function * getStrcatFunction(Module *module);
205  static Function * getStrcmpFunction(Module *module);
206  static Function * getStrdupFunction(Module *module);
207  static Function * getStrlenFunction(Module *module);
208  static Function * getSnprintfFunction(Module *module);
209  static Function * getSscanfFunction(Module *module);
210  static Function * getFprintfFunction(Module *module);
211  static Function * getPutsFunction(Module *module);
212  static Function * getMallocFunction(Module *module);
213  static Function * getFreeFunction(Module *module);
214  static Function * getAnnotateFunction(Module *module);
215  static Function * getJsonObjectPutFunction(Module *module);
216  static Function * getJsonObjectToJsonStringExtFunction(Module *module);
217  static Function * getJsonTokenerParseFunction(Module *module);
218  static Function * getVuoShaderMakeFunction(Module *module);
219  static Function * getVuoShaderAddSourceFunction(Module *module);
220  static Function * getVuoShaderSetTransparentFunction(Module *module);
221  static Function * getVuoShaderSetUniformFunction(Module *module, VuoCompilerType *type);
222  static Function * getVuoSamplerRectCoordinatesFromNormalizedCoordinatesFunction(Module *module);
223  static Function * getVuoImageGetColorDepthFunction(Module *module);
224  static Function * getVuoImageRendererRenderFunction(Module *module);
225  static Function * getCompositionAddNodeMetadataFunction(Module *module);
226  static Function * getCompositionCreateContextForNodeFunction(Module *module);
227  static Function * getCompositionPerformDataOnlyTransmissionsFunction(Module *module);
228  static Function * getCompositionReleasePortDataFunction(Module *module);
229  static Function * getSetupFunction(Module *module);
230  static Function * getCleanupFunction(Module *module);
231  static Function * getInstanceInitFunction(Module *module);
232  static Function * getInstanceFiniFunction(Module *module);
233  static Function * getInstanceTriggerStartFunction(Module *module);
234  static Function * getInstanceTriggerStopFunction(Module *module);
235  static Function * getNodeInstanceInitFunction(Module *module, string moduleKey, bool isSubcomposition, Type *instanceDataType, const vector<VuoPort *> &modelInputPorts, map<VuoPort *, size_t> &indexOfParameter, VuoCompilerConstantStringCache &constantStrings);
236  static Function * getNodeInstanceFiniFunction(Module *module, string moduleKey, Type *instanceDataType, VuoCompilerConstantStringCache &constantStrings);
237  static Function * getNodeInstanceTriggerStartFunction(Module *module, string moduleKey, Type *instanceDataType, const vector<VuoPort *> &modelInputPorts, map<VuoPort *, size_t> &indexOfParameter, VuoCompilerConstantStringCache &constantStrings);
238  static Function * getNodeInstanceTriggerStopFunction(Module *module, string moduleKey, Type *instanceDataType, VuoCompilerConstantStringCache &constantStrings);
239  static Function * getNodeInstanceTriggerUpdateFunction(Module *module, string moduleKey, Type *instanceDataType, const vector<VuoPort *> &modelInputPorts, map<VuoPort *, size_t> &indexOfParameter, VuoCompilerConstantStringCache &constantStrings);
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,
244  map<VuoPort *, size_t> &indexOfParameter, map<VuoPort *, size_t> &indexOfEventParameter, VuoCompilerConstantStringCache &constantStrings);
245  static Function * getWaitForNodeFunction(Module *module, string moduleKey);
246  static Function * getCompositionGetPortValueFunction(Module *module);
247  static Function * getSetInputPortValueFunction(Module *module);
248  static Function * getCompositionSetPortValueFunction(Module *module);
249  static Function * getCompositionFireTriggerPortEventFunction(Module *module);
250  static Function * getGetPublishedInputPortValueFunction(Module *module);
251  static Function * getGetPublishedOutputPortValueFunction(Module *module);
252  static Function * getCompositionSetPublishedInputPortValueFunction(Module *module);
253  static Function * getSetPublishedInputPortValueFunction(Module *module);
254 
255  static Type * getParameterTypeBeforeLowering(Function *function, Module *module, string typeName);
256  static Value * unlowerArgument(VuoCompilerType *unloweredVuoType, Function *function, int parameterIndex, Module *module, BasicBlock *block);
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);
259  static Value * callFunctionWithStructReturn(Function *function, vector<Value *> args, BasicBlock *block);
260  static bool isFunctionReturningStructViaParameter(Function *function);
261  static FunctionType * getFunctionType(Module *module, VuoType *paramType);
262  static Value * getArgumentAtIndex(Function *function, size_t index);
263 
264  static AttributeSet copyAttributesToIndex(AttributeSet attributesToCopy, int destinationIndex);
265 };