auto merge of #7115 : alexcrichton/rust/llvm-upgrades, r=thestinger
This is a reopening of #6713 This is still blocked on windows failures. I'll re-push try once the existing crisis has passed.
This commit is contained in:
commit
3d14470be4
2
.gitmodules
vendored
2
.gitmodules
vendored
@ -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
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
|
@ -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 {
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
2
src/llvm
2
src/llvm
@ -1 +1 @@
|
||||
Subproject commit 2e9f0d21fe321849a4759a01fc28eae82ef196d6
|
||||
Subproject commit f67442eee27d3d075a65cf7f9a70f7ec6649ffd1
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user