diff --git a/src/comp/back/x86.rs b/src/comp/back/x86.rs index 94243c36cba..ac52fca5baf 100644 --- a/src/comp/back/x86.rs +++ b/src/comp/back/x86.rs @@ -157,6 +157,26 @@ fn get_module_asm() -> str { ret _str.connect(glues, "\n\n"); } +fn get_data_layout() -> str { + if (_str.eq(target_os(), "macos")) { + ret "e-p:32:32-f64:32:64-i64:32:64-f80:128:128-n8:16:32"; + } + if (_str.eq(target_os(), "win32")) { + ret "e-p:32:32-f64:64:64-i64:64:64-f80:32:32-n8:16:32"; + } + ret "e-p:32:32-f64:32:64-i64:32:64-f80:32:32-n8:16:32"; +} + +fn get_target_triple() -> str { + if (_str.eq(target_os(), "macos")) { + ret "i686-apple-darwin"; + } + if (_str.eq(target_os(), "win32")) { + ret "i686-pc-mingw32"; + } + ret "i686-pc-linux-gnu"; +} + // // Local Variables: diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 2b4bec0c7ab..9b6fa0abad9 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -2151,6 +2151,9 @@ fn trans_crate(session.session sess, @ast.crate crate, str output) { llvm.LLVMModuleCreateWithNameInContext(_str.buf("rust_out"), llvm.LLVMGetGlobalContext()); + llvm.LLVMSetDataLayout(llmod, _str.buf(x86.get_data_layout())); + llvm.LLVMSetTarget(llmod, _str.buf(x86.get_target_triple())); + llvm.LLVMSetModuleInlineAsm(llmod, _str.buf(x86.get_module_asm())); auto intrinsics = declare_intrinsics(llmod);