Beispiel #1
0
        public override void Initialize()
        {
            _context ??= new Context();

            if (_targetTriple.Length == 0)
            {
                _targetTriple = Target.DefaultTargetTriple;
            }
            _targetTriple = Target.NormalizeTargetTriple(_targetTriple);

            _optBuilder ??= _O0 || _O1 || _O2 || _Os || _Oz || _O3 ? new PassManagerBuilder() : null;
            _optLevel = LLVMCodeGenOptLevel.LLVMCodeGenLevelNone;
            if (_optBuilder != null)
            {
                if (_O0)
                {
                    _optBuilder.SetOptLevels(0, 0);
                    _optLevel = LLVMCodeGenOptLevel.LLVMCodeGenLevelNone;
                }
                else if (_O1)
                {
                    _optBuilder.SetOptLevels(1, 0);
                    _optLevel = LLVMCodeGenOptLevel.LLVMCodeGenLevelLess;
                }
                else if (_O2)
                {
                    _optBuilder.SetOptLevels(2, 0);
                    _optLevel = LLVMCodeGenOptLevel.LLVMCodeGenLevelDefault;
                }
                else if (_Os)
                {
                    _optBuilder.SetOptLevels(2, 1);
                    _optLevel = LLVMCodeGenOptLevel.LLVMCodeGenLevelDefault;
                }
                else if (_Oz)
                {
                    _optBuilder.SetOptLevels(2, 2);
                    _optLevel = LLVMCodeGenOptLevel.LLVMCodeGenLevelDefault;
                }
                else if (_O3)
                {
                    _optBuilder.SetOptLevels(3, 0);
                    _optLevel = LLVMCodeGenOptLevel.LLVMCodeGenLevelAggressive;
                }
            }

            Target.InitializeAllTargets();

            if (_native)
            {
                _target       = Target.FromTriple(_targetTriple);
                TargetMachine = _target.CreateTargetMachine(_targetTriple, "", "", _optLevel,
                                                            LLVMRelocMode.LLVMRelocDefault, LLVMCodeModel.LLVMCodeModelDefault);
                TargetMachine.SetAsmVerbosity(true);
            }
        }