diff --git a/.gitmodules b/.gitmodules index c8442616179..88ead6e608d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "src/llvm"] path = src/llvm - url = https://github.com/brson/llvm.git + url = https://github.com/alexcrichton/llvm.git branch = master [submodule "src/libuv"] path = src/libuv diff --git a/mk/llvm.mk b/mk/llvm.mk index 77b6b4d96f3..12ccc55d4fa 100644 --- a/mk/llvm.mk +++ b/mk/llvm.mk @@ -14,7 +14,9 @@ LLVM_DEPS := $(S)/.gitmodules else # This is just a rough approximation of LLVM deps -LLVM_DEPS=$(call rwildcard,$(CFG_LLVM_SRC_DIR),*cpp *hpp) +LLVM_DEPS_SRC=$(call rwildcard,$(CFG_LLVM_SRC_DIR)/lib,*cpp *hpp) +LLVM_DEPS_INC=$(call rwildcard,$(CFG_LLVM_SRC_DIR)/include,*cpp *hpp) +LLVM_DEPS=$(LLVM_DEPS_SRC) $(LLVM_DEPS_INC) endif define DEF_LLVM_RULES diff --git a/src/librustc/back/passes.rs b/src/librustc/back/passes.rs index 714e7d666ac..b77ed10c21b 100644 --- a/src/librustc/back/passes.rs +++ b/src/librustc/back/passes.rs @@ -97,7 +97,6 @@ pub fn create_standard_passes(level: OptLevel) -> ~[~str] { passes.push(~"sroa"); passes.push(~"domtree"); passes.push(~"early-cse"); - passes.push(~"simplify-libcalls"); passes.push(~"lazy-value-info"); passes.push(~"jump-threading"); passes.push(~"correlated-propagation"); diff --git a/src/librustc/lib/llvm.rs b/src/librustc/lib/llvm.rs index 6c631a104aa..356cdaf754e 100644 --- a/src/librustc/lib/llvm.rs +++ b/src/librustc/lib/llvm.rs @@ -59,35 +59,37 @@ pub enum Linkage { #[deriving(Clone)] pub enum Attribute { - ZExtAttribute = 1, - SExtAttribute = 2, - NoReturnAttribute = 4, - InRegAttribute = 8, - StructRetAttribute = 16, - NoUnwindAttribute = 32, - NoAliasAttribute = 64, - ByValAttribute = 128, - NestAttribute = 256, - ReadNoneAttribute = 512, - ReadOnlyAttribute = 1024, - NoInlineAttribute = 2048, - AlwaysInlineAttribute = 4096, - OptimizeForSizeAttribute = 8192, - StackProtectAttribute = 16384, - StackProtectReqAttribute = 32768, - // 31 << 16 - AlignmentAttribute = 2031616, - NoCaptureAttribute = 2097152, - NoRedZoneAttribute = 4194304, - NoImplicitFloatAttribute = 8388608, - NakedAttribute = 16777216, - InlineHintAttribute = 33554432, - // 7 << 26 - StackAttribute = 469762048, - ReturnsTwiceAttribute = 536870912, - // 1 << 30 - UWTableAttribute = 1073741824, - NonLazyBindAttribute = 2147483648, + ZExtAttribute = 1 << 0, + SExtAttribute = 1 << 1, + NoReturnAttribute = 1 << 2, + InRegAttribute = 1 << 3, + StructRetAttribute = 1 << 4, + NoUnwindAttribute = 1 << 5, + NoAliasAttribute = 1 << 6, + ByValAttribute = 1 << 7, + NestAttribute = 1 << 8, + ReadNoneAttribute = 1 << 9, + ReadOnlyAttribute = 1 << 10, + NoInlineAttribute = 1 << 11, + AlwaysInlineAttribute = 1 << 12, + OptimizeForSizeAttribute = 1 << 13, + StackProtectAttribute = 1 << 14, + StackProtectReqAttribute = 1 << 15, + AlignmentAttribute = 31 << 16, + NoCaptureAttribute = 1 << 21, + NoRedZoneAttribute = 1 << 22, + NoImplicitFloatAttribute = 1 << 23, + NakedAttribute = 1 << 24, + InlineHintAttribute = 1 << 25, + StackAttribute = 7 << 26, + ReturnsTwiceAttribute = 1 << 29, + UWTableAttribute = 1 << 30, + NonLazyBindAttribute = 1 << 31, + + // Not added to LLVM yet, so may need to stay updated if LLVM changes. + // FIXME(#8199): if this changes, be sure to change the relevant constant + // down below + // FixedStackSegment = 1 << 41, } // enum for the LLVM IntPredicate type @@ -1541,7 +1543,8 @@ pub mod llvm { Op: AtomicBinOp, LHS: ValueRef, RHS: ValueRef, - Order: AtomicOrdering) + Order: AtomicOrdering, + SingleThreaded: Bool) -> ValueRef; pub fn LLVMBuildAtomicFence(B: BuilderRef, Order: AtomicOrdering); @@ -2106,6 +2109,28 @@ pub fn ConstFCmp(Pred: RealPredicate, V1: ValueRef, V2: ValueRef) -> ValueRef { llvm::LLVMConstFCmp(Pred as c_ushort, V1, V2) } } + +pub fn SetFunctionAttribute(Fn: ValueRef, attr: Attribute) { + unsafe { + let attr = attr as u64; + let lower = attr & 0xffffffff; + let upper = (attr >> 32) & 0xffffffff; + llvm::LLVMAddFunctionAttr(Fn, lower as c_uint, upper as c_uint); + } +} + +// FIXME(#8199): this shouldn't require this hackery. On i686 +// (FixedStackSegment as u64) will return 0 instead of 1 << 41. +// Furthermore, if we use a match of any sort then an LLVM +// assertion is generated! +pub fn SetFixedStackSegmentAttribute(Fn: ValueRef) { + unsafe { + let attr = 1u64 << 41; + let lower = attr & 0xffffffff; + let upper = (attr >> 32) & 0xffffffff; + llvm::LLVMAddFunctionAttr(Fn, lower as c_uint, upper as c_uint); + } +} /* Memory-managed object interface to type handles. */ pub struct TypeNames { diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 5070d678c9f..fc39af095b7 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -419,46 +419,25 @@ pub fn get_tydesc(ccx: &mut CrateContext, t: ty::t) -> @mut tydesc_info { } pub fn set_optimize_for_size(f: ValueRef) { - unsafe { - llvm::LLVMAddFunctionAttr(f, - lib::llvm::OptimizeForSizeAttribute - as c_uint, - 0); - } + lib::llvm::SetFunctionAttribute(f, lib::llvm::OptimizeForSizeAttribute) } pub fn set_no_inline(f: ValueRef) { - unsafe { - llvm::LLVMAddFunctionAttr(f, - lib::llvm::NoInlineAttribute as c_uint, - 0); - } + lib::llvm::SetFunctionAttribute(f, lib::llvm::NoInlineAttribute) } pub fn set_no_unwind(f: ValueRef) { - unsafe { - llvm::LLVMAddFunctionAttr(f, - lib::llvm::NoUnwindAttribute as c_uint, - 0); - } + lib::llvm::SetFunctionAttribute(f, lib::llvm::NoUnwindAttribute) } // Tell LLVM to emit the information necessary to unwind the stack for the // function f. pub fn set_uwtable(f: ValueRef) { - unsafe { - llvm::LLVMAddFunctionAttr(f, - lib::llvm::UWTableAttribute as c_uint, - 0); - } + lib::llvm::SetFunctionAttribute(f, lib::llvm::UWTableAttribute) } pub fn set_inline_hint(f: ValueRef) { - unsafe { - llvm::LLVMAddFunctionAttr(f, - lib::llvm::InlineHintAttribute as c_uint, - 0); - } + lib::llvm::SetFunctionAttribute(f, lib::llvm::InlineHintAttribute) } pub fn set_inline_hint_if_appr(attrs: &[ast::Attribute], @@ -473,17 +452,11 @@ pub fn set_inline_hint_if_appr(attrs: &[ast::Attribute], } pub fn set_always_inline(f: ValueRef) { - unsafe { - llvm::LLVMAddFunctionAttr(f, - lib::llvm::AlwaysInlineAttribute as c_uint, - 0); - } + lib::llvm::SetFunctionAttribute(f, lib::llvm::AlwaysInlineAttribute) } pub fn set_fixed_stack_segment(f: ValueRef) { - unsafe { - llvm::LLVMAddFunctionAttr(f, 0, 1 << (39 - 32)); - } + lib::llvm::SetFixedStackSegmentAttribute(f); } pub fn set_glue_inlining(f: ValueRef, t: ty::t) { diff --git a/src/librustc/middle/trans/builder.rs b/src/librustc/middle/trans/builder.rs index d876b4d0b16..1d821e5af94 100644 --- a/src/librustc/middle/trans/builder.rs +++ b/src/librustc/middle/trans/builder.rs @@ -940,7 +940,7 @@ impl Builder { dst: ValueRef, src: ValueRef, order: AtomicOrdering) -> ValueRef { unsafe { - llvm::LLVMBuildAtomicRMW(self.llbuilder, op, dst, src, order) + llvm::LLVMBuildAtomicRMW(self.llbuilder, op, dst, src, order, False) } } diff --git a/src/llvm b/src/llvm index 2e9f0d21fe3..f67442eee27 160000 --- a/src/llvm +++ b/src/llvm @@ -1 +1 @@ -Subproject commit 2e9f0d21fe321849a4759a01fc28eae82ef196d6 +Subproject commit f67442eee27d3d075a65cf7f9a70f7ec6649ffd1 diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index beaa7e1daef..04c062072d6 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -113,6 +113,7 @@ public: virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, bool isReadOnly); + bool finalizeMemory(std::string *ErrMsg) { return false; } virtual bool applyPermissions(std::string *Str); @@ -340,7 +341,6 @@ LLVMRustBuildJIT(void* mem, std::string Err; TargetOptions Options; - Options.JITExceptionHandling = true; Options.JITEmitDebugInfo = true; Options.NoFramePointerElim = true; Options.EnableSegmentedStacks = EnableSegmentedStacks; @@ -516,15 +516,6 @@ extern "C" LLVMValueRef LLVMBuildAtomicCmpXchg(LLVMBuilderRef B, extern "C" LLVMValueRef LLVMBuildAtomicFence(LLVMBuilderRef B, AtomicOrdering order) { return wrap(unwrap(B)->CreateFence(order)); } -extern "C" LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B, - AtomicRMWInst::BinOp op, - LLVMValueRef target, - LLVMValueRef source, - AtomicOrdering order) { - return wrap(unwrap(B)->CreateAtomicRMW(op, - unwrap(target), unwrap(source), - order)); -} extern "C" void LLVMSetDebug(int Enabled) { #ifndef NDEBUG diff --git a/src/rustllvm/llvm-auto-clean-trigger b/src/rustllvm/llvm-auto-clean-trigger index 9b8f0e3a462..670eebbed13 100644 --- a/src/rustllvm/llvm-auto-clean-trigger +++ b/src/rustllvm/llvm-auto-clean-trigger @@ -1,4 +1,4 @@ # If this file is modified, then llvm will be forcibly cleaned and then rebuilt. # The actual contents of this file do not matter, but to trigger a change on the # build bots then the contents should be changed so git updates the mtime. -2013-07-03 +2013-07-04 diff --git a/src/rustllvm/rustllvm.h b/src/rustllvm/rustllvm.h index d4202abd285..eeefb19883e 100644 --- a/src/rustllvm/rustllvm.h +++ b/src/rustllvm/rustllvm.h @@ -8,8 +8,10 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#include "llvm/IR/IRBuilder.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" #include "llvm/Linker.h" #include "llvm/PassManager.h" #include "llvm/IR/InlineAsm.h"