Beispiel #1
0
        /// <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));
        }