/// <summary cref="LLVMBackend.PrepareModule(CompileUnit, LLVMModuleRef, EntryPoint, LLVMValueRef)"/> internal override void PrepareModule(CompileUnit unit, LLVMModuleRef module, EntryPoint entryPoint, LLVMValueRef generatedEntryPoint) { // Add required metdata for entry point var context = unit.LLVMContext; var values = new LLVMValueRef[] { generatedEntryPoint, MDStringInContext(context, KernelAnnotationName, KernelAnnotationName.Length), ConstInt(context.Int32Type, 1, false) }; AddNamedMetadataOperand(module, LLVMAnnotationsName, MDNodeInContext(context, out values[0], values.Length)); var specialization = entryPoint.Specialization; if (specialization.MaxNumThreadsPerGroup.HasValue) { var maxThreadsPerGroupAnnotation = new LLVMValueRef[] { generatedEntryPoint, MDStringInContext( context, MaxNumThreadsPerGroupAnnotationAnnotationName, MaxNumThreadsPerGroupAnnotationAnnotationName.Length), ConstInt(context.Int32Type, specialization.MaxNumThreadsPerGroup.Value, false) }; AddNamedMetadataOperand(module, LLVMAnnotationsName, MDNodeInContext(context, out maxThreadsPerGroupAnnotation[0], maxThreadsPerGroupAnnotation.Length)); } if (specialization.MinNumGroupsPerMultiprocessor.HasValue) { var minNumGroupsAnnotation = new LLVMValueRef[] { generatedEntryPoint, MDStringInContext( context, MinNumGroupsPerMultiprocessorAnnotationName, MinNumGroupsPerMultiprocessorAnnotationName.Length), ConstInt(context.Int32Type, specialization.MinNumGroupsPerMultiprocessor.Value, false) }; AddNamedMetadataOperand(module, LLVMAnnotationsName, MDNodeInContext(context, out minNumGroupsAnnotation[0], minNumGroupsAnnotation.Length)); } // Perform NVVM reflect pass PreparePTXModule( module, generatedEntryPoint, unit.HasFlags(CompileUnitFlags.PTXFlushDenormalsToZero | CompileUnitFlags.FastMath), unit.HasFlags(CompileUnitFlags.FastMath)); }