wip emit
This commit is contained in:
parent
5353760f49
commit
cc37950d2b
@ -8234,4 +8234,8 @@ void emit(Module* module)
|
||||
{
|
||||
dump_module(module);
|
||||
}
|
||||
|
||||
BBLLVMTargetOptions target_options = {};
|
||||
String error_message = {};
|
||||
llvm_create_target_machine(&target_options, error_message);
|
||||
}
|
||||
|
447
src/llvm.cpp
447
src/llvm.cpp
@ -922,268 +922,17 @@ EXPORT String llvm_host_cpu_features()
|
||||
return { result, length };
|
||||
}
|
||||
|
||||
enum class BBLLVMEmitDwarfUnwindType : u8
|
||||
{
|
||||
always = 0,
|
||||
no_compact_unwind = 1,
|
||||
normal = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMDwarfDirectory : u8
|
||||
{
|
||||
disable = 0,
|
||||
enable = 1,
|
||||
normal = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMDebugCompressionType : u8
|
||||
{
|
||||
none = 0,
|
||||
zlib = 1,
|
||||
zstd = 2,
|
||||
};
|
||||
|
||||
#define BB_LLVM_MC_TARGET_OPTIONS_PADDING_BIT_COUNT (7)
|
||||
|
||||
struct BBLLVMMCTargetOptions
|
||||
{
|
||||
String abi_name;
|
||||
String assembly_language;
|
||||
String split_dwarf_file;
|
||||
String as_secure_log_file;
|
||||
const char* argv0;
|
||||
String* argv_pointer;
|
||||
u64 argv_count;
|
||||
String* integrated_assembler_search_path_pointer;
|
||||
u64 integrated_assembler_search_path_count;
|
||||
u32 relax_all:1;
|
||||
u32 no_exec_stack:1;
|
||||
u32 fatal_warnings:1;
|
||||
u32 no_warn:1;
|
||||
u32 no_deprecated_warn:1;
|
||||
u32 no_type_check:1;
|
||||
u32 save_temp_labels:1;
|
||||
u32 incremental_linker_compatible:1;
|
||||
u32 fdpic:1;
|
||||
u32 show_mc_encoding:1;
|
||||
u32 show_mc_inst:1;
|
||||
u32 asm_verbose:1;
|
||||
u32 preserve_asm_comments:1;
|
||||
u32 dwarf64:1;
|
||||
u32 crel:1;
|
||||
u32 x86_relax_relocations:1;
|
||||
u32 x86_sse2_avx:1;
|
||||
u32 emit_dwarf_unwind:2;
|
||||
u32 use_dwarf_directory:2;
|
||||
u32 debug_compression_type:2;
|
||||
u32 emit_compact_unwind_non_canonical:1;
|
||||
u32 ppc_use_full_register_names:1;
|
||||
u32 reserved:BB_LLVM_MC_TARGET_OPTIONS_PADDING_BIT_COUNT;
|
||||
};
|
||||
|
||||
static_assert(sizeof(BBLLVMMCTargetOptions) == 112);
|
||||
static_assert(BB_LLVM_MC_TARGET_OPTIONS_PADDING_BIT_COUNT == 7);
|
||||
|
||||
enum class BBLLVMCodeModel : u8
|
||||
{
|
||||
none = 0,
|
||||
tiny = 1,
|
||||
small = 2,
|
||||
kernel = 3,
|
||||
medium = 4,
|
||||
large = 5,
|
||||
};
|
||||
|
||||
enum class BBLLVMRelocationModel : u8
|
||||
{
|
||||
default_relocation = 0,
|
||||
static_relocation = 1,
|
||||
pic = 2,
|
||||
dynamic_no_pic = 3,
|
||||
ropi = 4,
|
||||
rwpi = 5,
|
||||
ropi_rwpi = 6,
|
||||
};
|
||||
|
||||
enum class BBLLVMCodeGenerationOptimizationLevel : u8
|
||||
{
|
||||
none = 0, // -O0
|
||||
less = 1, // -O1
|
||||
normal = 2, // -O2, -Os
|
||||
aggressive = 3 // -O3
|
||||
};
|
||||
|
||||
enum class BBLLVMGlobalISelAbortMode : u8
|
||||
{
|
||||
disable = 0,
|
||||
enable = 1,
|
||||
disable_with_diag = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMSwiftAsyncFramePointerMode : u8
|
||||
{
|
||||
deployment_based = 0,
|
||||
always = 1,
|
||||
never = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMBasicBlockSection : u8
|
||||
{
|
||||
all = 0,
|
||||
list = 1,
|
||||
preset = 2,
|
||||
none = 3,
|
||||
};
|
||||
|
||||
enum class BBLLVMFloatAbi : u8
|
||||
{
|
||||
normal = 0,
|
||||
soft = 1,
|
||||
hard = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMFPOpFusion : u8
|
||||
{
|
||||
fast = 0,
|
||||
standard = 1,
|
||||
strict = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMThreadModel : u8
|
||||
{
|
||||
posix = 0,
|
||||
single = 1,
|
||||
};
|
||||
|
||||
enum class BBLLVMEAbi : u8
|
||||
{
|
||||
unknown = 0,
|
||||
normal = 1,
|
||||
eabi4 = 2,
|
||||
eabi5 = 3,
|
||||
gnu = 4,
|
||||
};
|
||||
|
||||
enum class BBLLVMDebuggerKind : u8
|
||||
{
|
||||
normal = 0,
|
||||
gdb = 1,
|
||||
lldb = 2,
|
||||
sce = 3,
|
||||
dbx = 4,
|
||||
};
|
||||
|
||||
enum class BBLLVMExceptionHandling : u8
|
||||
{
|
||||
none = 0,
|
||||
dwarf_cfi = 1,
|
||||
setjmp_longjmp = 2,
|
||||
arm = 3,
|
||||
win_eh = 4,
|
||||
wasm = 5,
|
||||
aix = 6,
|
||||
zos = 7,
|
||||
};
|
||||
|
||||
#define BB_LLVM_TARGET_OPTIONS_PADDING_BIT_COUNT (21)
|
||||
|
||||
struct BBLLVMTargetOptions
|
||||
{
|
||||
u64 unsafe_fp_math:1;
|
||||
u64 no_infs_fp_math:1;
|
||||
u64 no_nans_fp_math:1;
|
||||
u64 no_trapping_fp_math:1;
|
||||
u64 no_signed_zeroes_fp_math:1;
|
||||
u64 approx_func_fp_math:1;
|
||||
u64 enable_aix_extended_altivec_abi:1;
|
||||
u64 honor_sign_dependent_rounding_fp_math:1;
|
||||
u64 no_zeroes_in_bss:1;
|
||||
u64 guaranteed_tail_call_optimization:1;
|
||||
u64 stack_symbol_ordering:1;
|
||||
u64 enable_fast_isel:1;
|
||||
u64 enable_global_isel:1;
|
||||
u64 global_isel_abort_mode:2;
|
||||
u64 swift_async_frame_pointer:2;
|
||||
u64 use_init_array:1;
|
||||
u64 disable_integrated_assembler:1;
|
||||
u64 function_sections:1;
|
||||
u64 data_sections:1;
|
||||
u64 ignore_xcoff_visibility:1;
|
||||
u64 xcoff_traceback_table:1;
|
||||
u64 unique_section_names:1;
|
||||
u64 unique_basic_block_section_names:1;
|
||||
u64 separate_named_sections:1;
|
||||
u64 trap_unreachable:1;
|
||||
u64 no_trap_after_noreturn:1;
|
||||
u64 tls_size:8;
|
||||
u64 emulated_tls:1;
|
||||
u64 enable_tls_descriptors:1;
|
||||
u64 enable_ipra:1;
|
||||
u64 emit_stack_size_section:1;
|
||||
u64 enable_machine_outliner:1;
|
||||
u64 enable_machine_function_splitter:1;
|
||||
u64 supports_default_outlining:1;
|
||||
u64 emit_address_significance_table:1;
|
||||
u64 bb_address_map:1;
|
||||
u64 bb_sections:3;
|
||||
u64 emit_call_site_information:1;
|
||||
u64 supports_debug_entry_values:1;
|
||||
u64 enable_debug_entry_values:1;
|
||||
u64 value_tracking_variable_locations:1;
|
||||
u64 force_dwarf_frame_section:1;
|
||||
u64 xray_function_index:1;
|
||||
u64 debug_strict_dwarf:1;
|
||||
u64 hotpatch:1;
|
||||
u64 ppc_gen_scalar_mass_entries:1;
|
||||
u64 jmc_instrument:1;
|
||||
u64 enable_cfi_fixup:1;
|
||||
u64 mis_expect:1;
|
||||
u64 xcoff_read_only_pointers:1;
|
||||
u64 float_abi:2;
|
||||
u64 thread_model:1;
|
||||
u32 fp_op_fusion_mode:2;
|
||||
u32 eabi_version:3;
|
||||
u32 debugger_kind:3;
|
||||
u32 exception_handling:3;
|
||||
u32 reserved:BB_LLVM_TARGET_OPTIONS_PADDING_BIT_COUNT;
|
||||
unsigned loop_alignment;
|
||||
int binutils_version[2];
|
||||
|
||||
BBLLVMMCTargetOptions mc;
|
||||
};
|
||||
|
||||
static_assert(sizeof(BBLLVMTargetOptions) == 136);
|
||||
static_assert(BB_LLVM_TARGET_OPTIONS_PADDING_BIT_COUNT == 21);
|
||||
|
||||
#define BB_LLVM_TARGET_MACHINE_CREATE_PADDING_BYTE_COUNT (4)
|
||||
|
||||
struct BBLLVMTargetMachineCreate
|
||||
{
|
||||
BBLLVMTargetOptions target_options;
|
||||
String target_triple;
|
||||
String cpu_model;
|
||||
String cpu_features;
|
||||
BBLLVMRelocationModel relocation_model;
|
||||
BBLLVMCodeModel code_model;
|
||||
BBLLVMCodeGenerationOptimizationLevel optimization_level;
|
||||
bool jit;
|
||||
u8 reserved[BB_LLVM_TARGET_MACHINE_CREATE_PADDING_BYTE_COUNT];
|
||||
};
|
||||
|
||||
static_assert(sizeof(BBLLVMTargetMachineCreate) == 192);
|
||||
static_assert(BB_LLVM_TARGET_MACHINE_CREATE_PADDING_BYTE_COUNT == 4);
|
||||
|
||||
EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachineCreate& create, String* error_message)
|
||||
EXPORT LLVMTargetMachineRef llvm_create_target_machine(const BBLLVMTargetMachineCreate* create, String* error_message)
|
||||
{
|
||||
std::string error_message_string;
|
||||
const llvm::Target* target = llvm::TargetRegistry::lookupTarget(string_ref(create.target_triple), error_message_string);
|
||||
const llvm::Target* target = llvm::TargetRegistry::lookupTarget(string_ref(create->target_triple), error_message_string);
|
||||
|
||||
llvm::TargetMachine* target_machine;
|
||||
|
||||
if (target)
|
||||
{
|
||||
std::optional<llvm::CodeModel::Model> code_model;
|
||||
switch (create.code_model)
|
||||
switch (create->code_model)
|
||||
{
|
||||
case BBLLVMCodeModel::none: code_model = std::nullopt; break;
|
||||
case BBLLVMCodeModel::tiny: code_model = llvm::CodeModel::Tiny; break;
|
||||
@ -1195,7 +944,7 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
|
||||
std::optional<llvm::Reloc::Model> relocation_model;
|
||||
|
||||
switch (create.relocation_model)
|
||||
switch (create->relocation_model)
|
||||
{
|
||||
case BBLLVMRelocationModel::default_relocation: relocation_model = std::nullopt; break;
|
||||
case BBLLVMRelocationModel::static_relocation: relocation_model = llvm::Reloc::Static; break;
|
||||
@ -1207,7 +956,7 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
}
|
||||
|
||||
llvm::CodeGenOptLevel optimization_level;
|
||||
switch (create.optimization_level)
|
||||
switch (create->optimization_level)
|
||||
{
|
||||
case BBLLVMCodeGenerationOptimizationLevel::none: optimization_level = llvm::CodeGenOptLevel::None; break;
|
||||
case BBLLVMCodeGenerationOptimizationLevel::less: optimization_level = llvm::CodeGenOptLevel::Less; break;
|
||||
@ -1218,28 +967,28 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
// INFO: This calls the default constructor, so all LLVM defaults are set and we only override what we control
|
||||
llvm::TargetOptions target_options;
|
||||
|
||||
target_options.UnsafeFPMath = create.target_options.unsafe_fp_math;
|
||||
target_options.NoInfsFPMath = create.target_options.no_infs_fp_math;
|
||||
target_options.NoNaNsFPMath = create.target_options.no_nans_fp_math;
|
||||
target_options.NoTrappingFPMath = create.target_options.no_trapping_fp_math;
|
||||
target_options.NoSignedZerosFPMath = create.target_options.no_signed_zeroes_fp_math;
|
||||
target_options.ApproxFuncFPMath = create.target_options.approx_func_fp_math;
|
||||
target_options.EnableAIXExtendedAltivecABI = create.target_options.enable_aix_extended_altivec_abi;
|
||||
target_options.HonorSignDependentRoundingFPMathOption = create.target_options.honor_sign_dependent_rounding_fp_math;
|
||||
target_options.NoZerosInBSS = create.target_options.no_zeroes_in_bss;
|
||||
target_options.GuaranteedTailCallOpt = create.target_options.guaranteed_tail_call_optimization;
|
||||
target_options.StackSymbolOrdering = create.target_options.stack_symbol_ordering;
|
||||
target_options.EnableFastISel = create.target_options.enable_fast_isel;
|
||||
target_options.EnableGlobalISel = create.target_options.enable_global_isel;
|
||||
target_options.UnsafeFPMath = create->target_options.unsafe_fp_math;
|
||||
target_options.NoInfsFPMath = create->target_options.no_infs_fp_math;
|
||||
target_options.NoNaNsFPMath = create->target_options.no_nans_fp_math;
|
||||
target_options.NoTrappingFPMath = create->target_options.no_trapping_fp_math;
|
||||
target_options.NoSignedZerosFPMath = create->target_options.no_signed_zeroes_fp_math;
|
||||
target_options.ApproxFuncFPMath = create->target_options.approx_func_fp_math;
|
||||
target_options.EnableAIXExtendedAltivecABI = create->target_options.enable_aix_extended_altivec_abi;
|
||||
target_options.HonorSignDependentRoundingFPMathOption = create->target_options.honor_sign_dependent_rounding_fp_math;
|
||||
target_options.NoZerosInBSS = create->target_options.no_zeroes_in_bss;
|
||||
target_options.GuaranteedTailCallOpt = create->target_options.guaranteed_tail_call_optimization;
|
||||
target_options.StackSymbolOrdering = create->target_options.stack_symbol_ordering;
|
||||
target_options.EnableFastISel = create->target_options.enable_fast_isel;
|
||||
target_options.EnableGlobalISel = create->target_options.enable_global_isel;
|
||||
|
||||
auto global_isel_abort_mode = (BBLLVMGlobalISelAbortMode)create.target_options.global_isel_abort_mode;
|
||||
auto global_isel_abort_mode = (BBLLVMGlobalISelAbortMode)create->target_options.global_isel_abort_mode;
|
||||
switch (global_isel_abort_mode)
|
||||
{
|
||||
case BBLLVMGlobalISelAbortMode::disable: target_options.GlobalISelAbort = llvm::GlobalISelAbortMode::Disable; break;
|
||||
case BBLLVMGlobalISelAbortMode::enable: target_options.GlobalISelAbort = llvm::GlobalISelAbortMode::Enable; break;
|
||||
case BBLLVMGlobalISelAbortMode::disable_with_diag: target_options.GlobalISelAbort = llvm::GlobalISelAbortMode::DisableWithDiag; break;
|
||||
}
|
||||
auto swift_async_frame_pointer = (BBLLVMSwiftAsyncFramePointerMode)create.target_options.swift_async_frame_pointer;
|
||||
auto swift_async_frame_pointer = (BBLLVMSwiftAsyncFramePointerMode)create->target_options.swift_async_frame_pointer;
|
||||
switch (swift_async_frame_pointer)
|
||||
{
|
||||
case BBLLVMSwiftAsyncFramePointerMode::deployment_based: target_options.SwiftAsyncFramePointer = llvm::SwiftAsyncFramePointerMode::DeploymentBased; break;
|
||||
@ -1247,33 +996,33 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
case BBLLVMSwiftAsyncFramePointerMode::never: target_options.SwiftAsyncFramePointer = llvm::SwiftAsyncFramePointerMode::Never; break;
|
||||
}
|
||||
|
||||
target_options.UseInitArray = create.target_options.use_init_array;
|
||||
target_options.DisableIntegratedAS = create.target_options.disable_integrated_assembler;
|
||||
target_options.FunctionSections = create.target_options.function_sections;
|
||||
target_options.DataSections = create.target_options.data_sections;
|
||||
target_options.IgnoreXCOFFVisibility = create.target_options.ignore_xcoff_visibility;
|
||||
target_options.XCOFFTracebackTable = create.target_options.xcoff_traceback_table;
|
||||
target_options.UniqueSectionNames = create.target_options.unique_section_names;
|
||||
target_options.UniqueBasicBlockSectionNames = create.target_options.unique_basic_block_section_names;
|
||||
target_options.UseInitArray = create->target_options.use_init_array;
|
||||
target_options.DisableIntegratedAS = create->target_options.disable_integrated_assembler;
|
||||
target_options.FunctionSections = create->target_options.function_sections;
|
||||
target_options.DataSections = create->target_options.data_sections;
|
||||
target_options.IgnoreXCOFFVisibility = create->target_options.ignore_xcoff_visibility;
|
||||
target_options.XCOFFTracebackTable = create->target_options.xcoff_traceback_table;
|
||||
target_options.UniqueSectionNames = create->target_options.unique_section_names;
|
||||
target_options.UniqueBasicBlockSectionNames = create->target_options.unique_basic_block_section_names;
|
||||
#if LLVM_VERSION_MAJOR >= 19
|
||||
target_options.SeparateNamedSections = create.target_options.separate_named_sections;
|
||||
target_options.SeparateNamedSections = create->target_options.separate_named_sections;
|
||||
#endif
|
||||
target_options.TrapUnreachable = create.target_options.trap_unreachable;
|
||||
target_options.NoTrapAfterNoreturn = create.target_options.no_trap_after_noreturn;
|
||||
target_options.TLSSize = create.target_options.tls_size;
|
||||
target_options.EmulatedTLS = create.target_options.emulated_tls;
|
||||
target_options.EnableTLSDESC = create.target_options.enable_tls_descriptors;
|
||||
target_options.EnableIPRA = create.target_options.enable_ipra;
|
||||
target_options.EmitStackSizeSection = create.target_options.emit_stack_size_section;
|
||||
target_options.EnableMachineOutliner = create.target_options.enable_machine_outliner;
|
||||
target_options.EnableMachineFunctionSplitter = create.target_options.enable_machine_function_splitter;
|
||||
target_options.SupportsDefaultOutlining = create.target_options.supports_default_outlining;
|
||||
target_options.EmitAddrsig = create.target_options.emit_address_significance_table;
|
||||
target_options.TrapUnreachable = create->target_options.trap_unreachable;
|
||||
target_options.NoTrapAfterNoreturn = create->target_options.no_trap_after_noreturn;
|
||||
target_options.TLSSize = create->target_options.tls_size;
|
||||
target_options.EmulatedTLS = create->target_options.emulated_tls;
|
||||
target_options.EnableTLSDESC = create->target_options.enable_tls_descriptors;
|
||||
target_options.EnableIPRA = create->target_options.enable_ipra;
|
||||
target_options.EmitStackSizeSection = create->target_options.emit_stack_size_section;
|
||||
target_options.EnableMachineOutliner = create->target_options.enable_machine_outliner;
|
||||
target_options.EnableMachineFunctionSplitter = create->target_options.enable_machine_function_splitter;
|
||||
target_options.SupportsDefaultOutlining = create->target_options.supports_default_outlining;
|
||||
target_options.EmitAddrsig = create->target_options.emit_address_significance_table;
|
||||
#if LLVM_VERSION_MAJOR >= 19
|
||||
target_options.BBAddrMap = create.target_options.bb_address_map;
|
||||
target_options.BBAddrMap = create->target_options.bb_address_map;
|
||||
#endif
|
||||
|
||||
auto bb_sections = (BBLLVMBasicBlockSection) create.target_options.bb_sections;
|
||||
auto bb_sections = (BBLLVMBasicBlockSection) create->target_options.bb_sections;
|
||||
switch (bb_sections)
|
||||
{
|
||||
case BBLLVMBasicBlockSection::all: target_options.BBSections = llvm::BasicBlockSection::All; break;
|
||||
@ -1282,21 +1031,21 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
case BBLLVMBasicBlockSection::none: target_options.BBSections = llvm::BasicBlockSection::None; break;
|
||||
}
|
||||
|
||||
target_options.EmitCallSiteInfo = create.target_options.emit_call_site_information;
|
||||
target_options.SupportsDebugEntryValues = create.target_options.supports_debug_entry_values;
|
||||
target_options.EnableDebugEntryValues = create.target_options.enable_debug_entry_values;
|
||||
target_options.ValueTrackingVariableLocations = create.target_options.value_tracking_variable_locations;
|
||||
target_options.ForceDwarfFrameSection = create.target_options.force_dwarf_frame_section;
|
||||
target_options.XRayFunctionIndex = create.target_options.xray_function_index;
|
||||
target_options.DebugStrictDwarf = create.target_options.debug_strict_dwarf;
|
||||
target_options.Hotpatch = create.target_options.hotpatch;
|
||||
target_options.PPCGenScalarMASSEntries = create.target_options.ppc_gen_scalar_mass_entries;
|
||||
target_options.JMCInstrument = create.target_options.jmc_instrument;
|
||||
target_options.EnableCFIFixup = create.target_options.enable_cfi_fixup;
|
||||
target_options.MisExpect = create.target_options.mis_expect;
|
||||
target_options.XCOFFReadOnlyPointers = create.target_options.xcoff_read_only_pointers;
|
||||
target_options.EmitCallSiteInfo = create->target_options.emit_call_site_information;
|
||||
target_options.SupportsDebugEntryValues = create->target_options.supports_debug_entry_values;
|
||||
target_options.EnableDebugEntryValues = create->target_options.enable_debug_entry_values;
|
||||
target_options.ValueTrackingVariableLocations = create->target_options.value_tracking_variable_locations;
|
||||
target_options.ForceDwarfFrameSection = create->target_options.force_dwarf_frame_section;
|
||||
target_options.XRayFunctionIndex = create->target_options.xray_function_index;
|
||||
target_options.DebugStrictDwarf = create->target_options.debug_strict_dwarf;
|
||||
target_options.Hotpatch = create->target_options.hotpatch;
|
||||
target_options.PPCGenScalarMASSEntries = create->target_options.ppc_gen_scalar_mass_entries;
|
||||
target_options.JMCInstrument = create->target_options.jmc_instrument;
|
||||
target_options.EnableCFIFixup = create->target_options.enable_cfi_fixup;
|
||||
target_options.MisExpect = create->target_options.mis_expect;
|
||||
target_options.XCOFFReadOnlyPointers = create->target_options.xcoff_read_only_pointers;
|
||||
|
||||
auto float_abi = (BBLLVMFloatAbi) create.target_options.float_abi;
|
||||
auto float_abi = (BBLLVMFloatAbi) create->target_options.float_abi;
|
||||
switch (float_abi)
|
||||
{
|
||||
case BBLLVMFloatAbi::normal: target_options.FloatABIType = llvm::FloatABI::Default; break;
|
||||
@ -1304,14 +1053,14 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
case BBLLVMFloatAbi::hard: target_options.FloatABIType = llvm::FloatABI::Hard; break;
|
||||
}
|
||||
|
||||
auto thread_model = (BBLLVMThreadModel) create.target_options.thread_model;
|
||||
auto thread_model = (BBLLVMThreadModel) create->target_options.thread_model;
|
||||
switch (thread_model)
|
||||
{
|
||||
case BBLLVMThreadModel::posix: target_options.ThreadModel = llvm::ThreadModel::POSIX; break;
|
||||
case BBLLVMThreadModel::single: target_options.ThreadModel = llvm::ThreadModel::Single; break;
|
||||
}
|
||||
|
||||
auto fp_op_fusion_mode = (BBLLVMFPOpFusion) create.target_options.fp_op_fusion_mode;
|
||||
auto fp_op_fusion_mode = (BBLLVMFPOpFusion) create->target_options.fp_op_fusion_mode;
|
||||
switch (fp_op_fusion_mode)
|
||||
{
|
||||
case BBLLVMFPOpFusion::fast: target_options.AllowFPOpFusion = llvm::FPOpFusion::Fast; break;
|
||||
@ -1319,7 +1068,7 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
case BBLLVMFPOpFusion::strict: target_options.AllowFPOpFusion = llvm::FPOpFusion::Strict; break;
|
||||
}
|
||||
|
||||
auto eabi_version = (BBLLVMEAbi) create.target_options.eabi_version;
|
||||
auto eabi_version = (BBLLVMEAbi) create->target_options.eabi_version;
|
||||
switch (eabi_version)
|
||||
{
|
||||
case BBLLVMEAbi::unknown: target_options.EABIVersion = llvm::EABI::Unknown; break;
|
||||
@ -1329,7 +1078,7 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
case BBLLVMEAbi::gnu: target_options.EABIVersion = llvm::EABI::GNU; break;
|
||||
}
|
||||
|
||||
auto debugger_kind = (BBLLVMDebuggerKind) create.target_options.debugger_kind;
|
||||
auto debugger_kind = (BBLLVMDebuggerKind) create->target_options.debugger_kind;
|
||||
switch (debugger_kind)
|
||||
{
|
||||
case BBLLVMDebuggerKind::normal: target_options.DebuggerTuning = llvm::DebuggerKind::Default; break;
|
||||
@ -1339,7 +1088,7 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
case BBLLVMDebuggerKind::dbx: target_options.DebuggerTuning = llvm::DebuggerKind::DBX; break;
|
||||
}
|
||||
|
||||
auto exception_handling = (BBLLVMExceptionHandling) create.target_options.exception_handling;
|
||||
auto exception_handling = (BBLLVMExceptionHandling) create->target_options.exception_handling;
|
||||
switch (exception_handling)
|
||||
{
|
||||
case BBLLVMExceptionHandling::none: target_options.ExceptionModel = llvm::ExceptionHandling::None; break;
|
||||
@ -1352,66 +1101,66 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
case BBLLVMExceptionHandling::zos: target_options.ExceptionModel = llvm::ExceptionHandling::ZOS; break;
|
||||
}
|
||||
|
||||
target_options.LoopAlignment = create.target_options.loop_alignment;
|
||||
target_options.BinutilsVersion = { create.target_options.binutils_version[0], create.target_options.binutils_version[1] };
|
||||
target_options.LoopAlignment = create->target_options.loop_alignment;
|
||||
target_options.BinutilsVersion = { create->target_options.binutils_version[0], create->target_options.binutils_version[1] };
|
||||
|
||||
if (create.target_options.mc.abi_name.length)
|
||||
if (create->target_options.mc.abi_name.length)
|
||||
{
|
||||
target_options.MCOptions.ABIName = { (char*)create.target_options.mc.abi_name.pointer, create.target_options.mc.abi_name.length };
|
||||
target_options.MCOptions.ABIName = { (char*)create->target_options.mc.abi_name.pointer, create->target_options.mc.abi_name.length };
|
||||
}
|
||||
|
||||
if (create.target_options.mc.assembly_language.length)
|
||||
if (create->target_options.mc.assembly_language.length)
|
||||
{
|
||||
target_options.MCOptions.AssemblyLanguage = { (char*)create.target_options.mc.assembly_language.pointer, create.target_options.mc.assembly_language.length };
|
||||
target_options.MCOptions.AssemblyLanguage = { (char*)create->target_options.mc.assembly_language.pointer, create->target_options.mc.assembly_language.length };
|
||||
}
|
||||
|
||||
if (create.target_options.mc.split_dwarf_file.length)
|
||||
if (create->target_options.mc.split_dwarf_file.length)
|
||||
{
|
||||
target_options.MCOptions.SplitDwarfFile = { (char*)create.target_options.mc.split_dwarf_file.pointer, create.target_options.mc.split_dwarf_file.length };
|
||||
target_options.MCOptions.SplitDwarfFile = { (char*)create->target_options.mc.split_dwarf_file.pointer, create->target_options.mc.split_dwarf_file.length };
|
||||
}
|
||||
|
||||
if (create.target_options.mc.as_secure_log_file.length)
|
||||
if (create->target_options.mc.as_secure_log_file.length)
|
||||
{
|
||||
target_options.MCOptions.AsSecureLogFile = { (char*)create.target_options.mc.as_secure_log_file.pointer, create.target_options.mc.as_secure_log_file.length };
|
||||
target_options.MCOptions.AsSecureLogFile = { (char*)create->target_options.mc.as_secure_log_file.pointer, create->target_options.mc.as_secure_log_file.length };
|
||||
}
|
||||
|
||||
if (create.target_options.mc.argv_count)
|
||||
if (create->target_options.mc.argv_count)
|
||||
{
|
||||
target_options.MCOptions.Argv0 = create.target_options.mc.argv0;
|
||||
target_options.MCOptions.Argv0 = create->target_options.mc.argv0;
|
||||
|
||||
// TODO:
|
||||
__builtin_trap();
|
||||
}
|
||||
|
||||
if (create.target_options.mc.integrated_assembler_search_path_count)
|
||||
if (create->target_options.mc.integrated_assembler_search_path_count)
|
||||
{
|
||||
// TODO:
|
||||
__builtin_trap();
|
||||
}
|
||||
|
||||
target_options.MCOptions.MCRelaxAll = create.target_options.mc.relax_all;
|
||||
target_options.MCOptions.MCNoExecStack = create.target_options.mc.no_exec_stack;
|
||||
target_options.MCOptions.MCFatalWarnings = create.target_options.mc.fatal_warnings;
|
||||
target_options.MCOptions.MCNoWarn = create.target_options.mc.no_warn;
|
||||
target_options.MCOptions.MCNoDeprecatedWarn = create.target_options.mc.no_deprecated_warn;
|
||||
target_options.MCOptions.MCNoTypeCheck = create.target_options.mc.no_type_check;
|
||||
target_options.MCOptions.MCSaveTempLabels = create.target_options.mc.save_temp_labels;
|
||||
target_options.MCOptions.MCIncrementalLinkerCompatible = create.target_options.mc.incremental_linker_compatible;
|
||||
target_options.MCOptions.MCRelaxAll = create->target_options.mc.relax_all;
|
||||
target_options.MCOptions.MCNoExecStack = create->target_options.mc.no_exec_stack;
|
||||
target_options.MCOptions.MCFatalWarnings = create->target_options.mc.fatal_warnings;
|
||||
target_options.MCOptions.MCNoWarn = create->target_options.mc.no_warn;
|
||||
target_options.MCOptions.MCNoDeprecatedWarn = create->target_options.mc.no_deprecated_warn;
|
||||
target_options.MCOptions.MCNoTypeCheck = create->target_options.mc.no_type_check;
|
||||
target_options.MCOptions.MCSaveTempLabels = create->target_options.mc.save_temp_labels;
|
||||
target_options.MCOptions.MCIncrementalLinkerCompatible = create->target_options.mc.incremental_linker_compatible;
|
||||
#if LLVM_VERSION_MAJOR >= 19
|
||||
target_options.MCOptions.FDPIC = create.target_options.mc.fdpic;
|
||||
target_options.MCOptions.FDPIC = create->target_options.mc.fdpic;
|
||||
#endif
|
||||
target_options.MCOptions.ShowMCEncoding = create.target_options.mc.show_mc_encoding;
|
||||
target_options.MCOptions.ShowMCInst = create.target_options.mc.show_mc_inst;
|
||||
target_options.MCOptions.AsmVerbose = create.target_options.mc.asm_verbose;
|
||||
target_options.MCOptions.PreserveAsmComments = create.target_options.mc.preserve_asm_comments;
|
||||
target_options.MCOptions.Dwarf64 = create.target_options.mc.dwarf64;
|
||||
target_options.MCOptions.ShowMCEncoding = create->target_options.mc.show_mc_encoding;
|
||||
target_options.MCOptions.ShowMCInst = create->target_options.mc.show_mc_inst;
|
||||
target_options.MCOptions.AsmVerbose = create->target_options.mc.asm_verbose;
|
||||
target_options.MCOptions.PreserveAsmComments = create->target_options.mc.preserve_asm_comments;
|
||||
target_options.MCOptions.Dwarf64 = create->target_options.mc.dwarf64;
|
||||
#if LLVM_VERSION_MAJOR >= 19
|
||||
target_options.MCOptions.Crel = create.target_options.mc.crel;
|
||||
target_options.MCOptions.X86RelaxRelocations = create.target_options.mc.x86_relax_relocations;
|
||||
target_options.MCOptions.X86Sse2Avx = create.target_options.mc.x86_sse2_avx;
|
||||
target_options.MCOptions.Crel = create->target_options.mc.crel;
|
||||
target_options.MCOptions.X86RelaxRelocations = create->target_options.mc.x86_relax_relocations;
|
||||
target_options.MCOptions.X86Sse2Avx = create->target_options.mc.x86_sse2_avx;
|
||||
#endif
|
||||
|
||||
auto emit_dwarf_unwind = (BBLLVMEmitDwarfUnwindType) create.target_options.mc.emit_dwarf_unwind;
|
||||
auto emit_dwarf_unwind = (BBLLVMEmitDwarfUnwindType) create->target_options.mc.emit_dwarf_unwind;
|
||||
switch (emit_dwarf_unwind)
|
||||
{
|
||||
case BBLLVMEmitDwarfUnwindType::always: target_options.MCOptions.EmitDwarfUnwind = llvm::EmitDwarfUnwindType::Always; break;
|
||||
@ -1419,7 +1168,7 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
case BBLLVMEmitDwarfUnwindType::normal: target_options.MCOptions.EmitDwarfUnwind = llvm::EmitDwarfUnwindType::Default; break;
|
||||
}
|
||||
|
||||
auto use_dwarf_directory = (BBLLVMDwarfDirectory) create.target_options.mc.use_dwarf_directory;
|
||||
auto use_dwarf_directory = (BBLLVMDwarfDirectory) create->target_options.mc.use_dwarf_directory;
|
||||
switch (use_dwarf_directory)
|
||||
{
|
||||
case BBLLVMDwarfDirectory::disable: target_options.MCOptions.MCUseDwarfDirectory = llvm::MCTargetOptions::DwarfDirectory::DisableDwarfDirectory; break;
|
||||
@ -1428,7 +1177,7 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
}
|
||||
|
||||
#if LLVM_VERSION_MAJOR >= 19
|
||||
auto debug_compression_type = (BBLLVMDebugCompressionType) create.target_options.mc.debug_compression_type;
|
||||
auto debug_compression_type = (BBLLVMDebugCompressionType) create->target_options.mc.debug_compression_type;
|
||||
switch (debug_compression_type)
|
||||
{
|
||||
case BBLLVMDebugCompressionType::none: target_options.MCOptions.CompressDebugSections = llvm::DebugCompressionType::None; break;
|
||||
@ -1437,10 +1186,10 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
}
|
||||
#endif
|
||||
|
||||
target_options.MCOptions.EmitCompactUnwindNonCanonical = create.target_options.mc.emit_compact_unwind_non_canonical;
|
||||
target_options.MCOptions.PPCUseFullRegisterNames = create.target_options.mc.ppc_use_full_register_names;
|
||||
target_options.MCOptions.EmitCompactUnwindNonCanonical = create->target_options.mc.emit_compact_unwind_non_canonical;
|
||||
target_options.MCOptions.PPCUseFullRegisterNames = create->target_options.mc.ppc_use_full_register_names;
|
||||
|
||||
target_machine = target->createTargetMachine(string_ref(create.target_triple), string_ref(create.cpu_model), string_ref(create.cpu_features), target_options, relocation_model, code_model, optimization_level, create.jit);
|
||||
target_machine = target->createTargetMachine(string_ref(create->target_triple), string_ref(create->cpu_model), string_ref(create->cpu_features), target_options, relocation_model, code_model, optimization_level, create->jit);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1453,7 +1202,7 @@ EXPORT llvm::TargetMachine* llvm_create_target_machine(const BBLLVMTargetMachine
|
||||
target_machine = 0;
|
||||
}
|
||||
|
||||
return target_machine;
|
||||
return wrap(target_machine);
|
||||
}
|
||||
|
||||
EXPORT void llvm_module_set_target(llvm::Module& module, llvm::TargetMachine& target_machine)
|
||||
|
256
src/llvm.h
256
src/llvm.h
@ -5,7 +5,7 @@
|
||||
#include <llvm-c/Analysis.h>
|
||||
#include <llvm-c/Target.h>
|
||||
#include <llvm-c/Analysis.h>
|
||||
#include <llvm-c/DebugInfo.h>
|
||||
#include <llvm-c/TargetMachine.h>
|
||||
|
||||
enum class BBLLVMUWTableKind : u64
|
||||
{
|
||||
@ -284,6 +284,258 @@ struct DIFlags
|
||||
|
||||
static_assert(sizeof(DIFlags) == sizeof(u32));
|
||||
|
||||
enum class BBLLVMEmitDwarfUnwindType : u8
|
||||
{
|
||||
always = 0,
|
||||
no_compact_unwind = 1,
|
||||
normal = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMDwarfDirectory : u8
|
||||
{
|
||||
disable = 0,
|
||||
enable = 1,
|
||||
normal = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMDebugCompressionType : u8
|
||||
{
|
||||
none = 0,
|
||||
zlib = 1,
|
||||
zstd = 2,
|
||||
};
|
||||
|
||||
#define BB_LLVM_MC_TARGET_OPTIONS_PADDING_BIT_COUNT (7)
|
||||
|
||||
struct BBLLVMMCTargetOptions
|
||||
{
|
||||
String abi_name;
|
||||
String assembly_language;
|
||||
String split_dwarf_file;
|
||||
String as_secure_log_file;
|
||||
const char* argv0;
|
||||
String* argv_pointer;
|
||||
u64 argv_count;
|
||||
String* integrated_assembler_search_path_pointer;
|
||||
u64 integrated_assembler_search_path_count;
|
||||
u32 relax_all:1;
|
||||
u32 no_exec_stack:1;
|
||||
u32 fatal_warnings:1;
|
||||
u32 no_warn:1;
|
||||
u32 no_deprecated_warn:1;
|
||||
u32 no_type_check:1;
|
||||
u32 save_temp_labels:1;
|
||||
u32 incremental_linker_compatible:1;
|
||||
u32 fdpic:1;
|
||||
u32 show_mc_encoding:1;
|
||||
u32 show_mc_inst:1;
|
||||
u32 asm_verbose:1;
|
||||
u32 preserve_asm_comments:1 = true;
|
||||
u32 dwarf64:1;
|
||||
u32 crel:1;
|
||||
u32 x86_relax_relocations:1;
|
||||
u32 x86_sse2_avx:1;
|
||||
u32 emit_dwarf_unwind:2 = 2;
|
||||
u32 use_dwarf_directory:2 = 2;
|
||||
u32 debug_compression_type:2 = 0;
|
||||
u32 emit_compact_unwind_non_canonical:1;
|
||||
u32 ppc_use_full_register_names:1;
|
||||
u32 reserved:BB_LLVM_MC_TARGET_OPTIONS_PADDING_BIT_COUNT;
|
||||
};
|
||||
|
||||
static_assert(sizeof(BBLLVMMCTargetOptions) == 112);
|
||||
static_assert(BB_LLVM_MC_TARGET_OPTIONS_PADDING_BIT_COUNT == 7);
|
||||
|
||||
enum class BBLLVMCodeModel : u8
|
||||
{
|
||||
none = 0,
|
||||
tiny = 1,
|
||||
small = 2,
|
||||
kernel = 3,
|
||||
medium = 4,
|
||||
large = 5,
|
||||
};
|
||||
|
||||
enum class BBLLVMRelocationModel : u8
|
||||
{
|
||||
default_relocation = 0,
|
||||
static_relocation = 1,
|
||||
pic = 2,
|
||||
dynamic_no_pic = 3,
|
||||
ropi = 4,
|
||||
rwpi = 5,
|
||||
ropi_rwpi = 6,
|
||||
};
|
||||
|
||||
enum class BBLLVMCodeGenerationOptimizationLevel : u8
|
||||
{
|
||||
none = 0, // -O0
|
||||
less = 1, // -O1
|
||||
normal = 2, // -O2, -Os
|
||||
aggressive = 3 // -O3
|
||||
};
|
||||
|
||||
enum class BBLLVMGlobalISelAbortMode : u8
|
||||
{
|
||||
disable = 0,
|
||||
enable = 1,
|
||||
disable_with_diag = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMSwiftAsyncFramePointerMode : u8
|
||||
{
|
||||
deployment_based = 0,
|
||||
always = 1,
|
||||
never = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMBasicBlockSection : u8
|
||||
{
|
||||
all = 0,
|
||||
list = 1,
|
||||
preset = 2,
|
||||
none = 3,
|
||||
};
|
||||
|
||||
enum class BBLLVMFloatAbi : u8
|
||||
{
|
||||
normal = 0,
|
||||
soft = 1,
|
||||
hard = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMFPOpFusion : u8
|
||||
{
|
||||
fast = 0,
|
||||
standard = 1,
|
||||
strict = 2,
|
||||
};
|
||||
|
||||
enum class BBLLVMThreadModel : u8
|
||||
{
|
||||
posix = 0,
|
||||
single = 1,
|
||||
};
|
||||
|
||||
enum class BBLLVMEAbi : u8
|
||||
{
|
||||
unknown = 0,
|
||||
normal = 1,
|
||||
eabi4 = 2,
|
||||
eabi5 = 3,
|
||||
gnu = 4,
|
||||
};
|
||||
|
||||
enum class BBLLVMDebuggerKind : u8
|
||||
{
|
||||
normal = 0,
|
||||
gdb = 1,
|
||||
lldb = 2,
|
||||
sce = 3,
|
||||
dbx = 4,
|
||||
};
|
||||
|
||||
enum class BBLLVMExceptionHandling : u8
|
||||
{
|
||||
none = 0,
|
||||
dwarf_cfi = 1,
|
||||
setjmp_longjmp = 2,
|
||||
arm = 3,
|
||||
win_eh = 4,
|
||||
wasm = 5,
|
||||
aix = 6,
|
||||
zos = 7,
|
||||
};
|
||||
|
||||
#define BB_LLVM_TARGET_OPTIONS_PADDING_BIT_COUNT (21)
|
||||
|
||||
struct BBLLVMTargetOptions
|
||||
{
|
||||
u64 unsafe_fp_math:1;
|
||||
u64 no_infs_fp_math:1;
|
||||
u64 no_nans_fp_math:1;
|
||||
u64 no_trapping_fp_math:1 = true;
|
||||
u64 no_signed_zeroes_fp_math:1;
|
||||
u64 approx_func_fp_math:1;
|
||||
u64 enable_aix_extended_altivec_abi:1;
|
||||
u64 honor_sign_dependent_rounding_fp_math:1;
|
||||
u64 no_zeroes_in_bss:1;
|
||||
u64 guaranteed_tail_call_optimization:1;
|
||||
u64 stack_symbol_ordering:1 = true;
|
||||
u64 enable_fast_isel:1;
|
||||
u64 enable_global_isel:1 = 1;
|
||||
u64 global_isel_abort_mode:2;
|
||||
u64 swift_async_frame_pointer:2 = 1;
|
||||
u64 use_init_array:1;
|
||||
u64 disable_integrated_assembler:1;
|
||||
u64 function_sections:1;
|
||||
u64 data_sections:1;
|
||||
u64 ignore_xcoff_visibility:1;
|
||||
u64 xcoff_traceback_table:1 = true;
|
||||
u64 unique_section_names:1 = true;
|
||||
u64 unique_basic_block_section_names:1;
|
||||
u64 separate_named_sections:1;
|
||||
u64 trap_unreachable:1;
|
||||
u64 no_trap_after_noreturn:1;
|
||||
u64 tls_size:8;
|
||||
u64 emulated_tls:1;
|
||||
u64 enable_tls_descriptors:1;
|
||||
u64 enable_ipra:1;
|
||||
u64 emit_stack_size_section:1;
|
||||
u64 enable_machine_outliner:1;
|
||||
u64 enable_machine_function_splitter:1;
|
||||
u64 supports_default_outlining:1;
|
||||
u64 emit_address_significance_table:1;
|
||||
u64 bb_address_map:1;
|
||||
u64 bb_sections:3 = 3;
|
||||
u64 emit_call_site_information:1;
|
||||
u64 supports_debug_entry_values:1;
|
||||
u64 enable_debug_entry_values:1;
|
||||
u64 value_tracking_variable_locations:1;
|
||||
u64 force_dwarf_frame_section:1;
|
||||
u64 xray_function_index:1 = true;
|
||||
u64 debug_strict_dwarf:1;
|
||||
u64 hotpatch:1;
|
||||
u64 ppc_gen_scalar_mass_entries:1;
|
||||
u64 jmc_instrument:1;
|
||||
u64 enable_cfi_fixup:1;
|
||||
u64 mis_expect:1;
|
||||
u64 xcoff_read_only_pointers:1;
|
||||
u64 float_abi:2 = 0;
|
||||
u64 thread_model:1 = 0;
|
||||
u32 fp_op_fusion_mode:2 = 1;
|
||||
u32 eabi_version:3 = 1;
|
||||
u32 debugger_kind:3 = 0;
|
||||
u32 exception_handling:3 = 0;
|
||||
u32 reserved:BB_LLVM_TARGET_OPTIONS_PADDING_BIT_COUNT;
|
||||
unsigned loop_alignment = 0;
|
||||
int binutils_version[2];
|
||||
|
||||
BBLLVMMCTargetOptions mc;
|
||||
};
|
||||
|
||||
static_assert(sizeof(BBLLVMTargetOptions) == 136);
|
||||
static_assert(BB_LLVM_TARGET_OPTIONS_PADDING_BIT_COUNT == 21);
|
||||
|
||||
#define BB_LLVM_TARGET_MACHINE_CREATE_PADDING_BYTE_COUNT (4)
|
||||
|
||||
struct BBLLVMTargetMachineCreate
|
||||
{
|
||||
BBLLVMTargetOptions target_options;
|
||||
String target_triple;
|
||||
String cpu_model;
|
||||
String cpu_features;
|
||||
BBLLVMRelocationModel relocation_model;
|
||||
BBLLVMCodeModel code_model;
|
||||
BBLLVMCodeGenerationOptimizationLevel optimization_level;
|
||||
bool jit;
|
||||
u8 reserved[BB_LLVM_TARGET_MACHINE_CREATE_PADDING_BYTE_COUNT];
|
||||
};
|
||||
|
||||
static_assert(sizeof(BBLLVMTargetMachineCreate) == 192);
|
||||
static_assert(BB_LLVM_TARGET_MACHINE_CREATE_PADDING_BYTE_COUNT == 4);
|
||||
|
||||
|
||||
|
||||
fn bool llvm_initialized = false;
|
||||
|
||||
@ -318,3 +570,5 @@ extern "C" void llvm_subprogram_replace_type(LLVMMetadataRef subprogram, LLVMMet
|
||||
|
||||
extern "C" String llvm_module_to_string(LLVMModuleRef module);
|
||||
|
||||
EXPORT LLVMTargetMachineRef llvm_create_target_machine(const BBLLVMTargetMachineCreate* create, String* error_message);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user