about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2011-11-16 12:15:54 -0800
committerNiko Matsakis <niko@alum.mit.edu>2011-11-16 15:27:09 -0800
commit834b6879ea89135d60b3903755589e14f816449a (patch)
treec68a3618324aa5730e49d6389bccfa30b7c9ec06 /src
parent938b23e228f4fd313973190f8f78163476cc4a3f (diff)
downloadrust-834b6879ea89135d60b3903755589e14f816449a.tar.gz
rust-834b6879ea89135d60b3903755589e14f816449a.zip
temp workaround for failure to pass ulonglong successfully
Diffstat (limited to 'src')
-rw-r--r--src/comp/lib/llvm.rs2
-rw-r--r--src/comp/middle/trans_common.rs4
-rw-r--r--src/rustllvm/RustWrapper.cpp10
-rw-r--r--src/rustllvm/rustllvm.def.in1
4 files changed, 15 insertions, 2 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs
index 68ba8624268..7010bc82f01 100644
--- a/src/comp/lib/llvm.rs
+++ b/src/comp/lib/llvm.rs
@@ -865,7 +865,7 @@ native mod llvm {
     fn LLVMRustParseBitcode(MemBuf: MemoryBufferRef) -> ModuleRef;
 
     /** FiXME: Hacky adaptor for lack of ULongLong in FFI: */
-    fn LLVMRustConstSmallInt(IntTy: TypeRef, N: uint, SignExtend: Bool) ->
+    fn LLVMRustConstInt(IntTy: TypeRef, N_hi: uint, N_lo: uint, SignExtend: Bool) ->
        ValueRef;
 
     fn LLVMRustAddPrintModulePass(PM: PassManagerRef, M: ModuleRef,
diff --git a/src/comp/middle/trans_common.rs b/src/comp/middle/trans_common.rs
index 276a7460f8c..4b2791f66c8 100644
--- a/src/comp/middle/trans_common.rs
+++ b/src/comp/middle/trans_common.rs
@@ -725,7 +725,9 @@ fn T_opaque_chan_ptr() -> TypeRef { ret T_ptr(T_i8()); }
 fn C_null(t: TypeRef) -> ValueRef { ret llvm::LLVMConstNull(t); }
 
 fn C_integral(t: TypeRef, u: u64, sign_extend: Bool) -> ValueRef {
-    ret llvm::LLVMConstInt(t, u, sign_extend);
+    let u_hi = (u >> 32u64) as uint;
+    let u_lo = u as uint;
+    ret llvm::LLVMRustConstInt(t, u_hi, u_lo, sign_extend);
 }
 
 fn C_float(cx: @crate_ctxt, s: str) -> ValueRef {
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index c0553b3c1d9..635030fd0ad 100644
--- a/src/rustllvm/RustWrapper.cpp
+++ b/src/rustllvm/RustWrapper.cpp
@@ -126,6 +126,16 @@ extern "C" LLVMValueRef LLVMRustConstSmallInt(LLVMTypeRef IntTy, unsigned N,
   return LLVMConstInt(IntTy, (unsigned long long)N, SignExtend);
 }
 
+extern "C" LLVMValueRef LLVMRustConstInt(LLVMTypeRef IntTy, 
+					 unsigned N_hi,
+					 unsigned N_lo,
+					 LLVMBool SignExtend) {
+  unsigned long long N = N_hi;
+  N <<= 32;
+  N |= N_lo;
+  return LLVMConstInt(IntTy, N, SignExtend);
+}
+
 extern bool llvm::TimePassesIsEnabled;
 extern "C" void LLVMRustEnableTimePasses() {
   TimePassesIsEnabled = true;
diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in
index 9712ea60371..75d8dc8229e 100644
--- a/src/rustllvm/rustllvm.def.in
+++ b/src/rustllvm/rustllvm.def.in
@@ -4,6 +4,7 @@ LLVMRustWriteOutputFile
 LLVMRustGetLastError
 LLVMRustGetHostTriple
 LLVMRustConstSmallInt
+LLVMRustConstInt
 LLVMRustParseBitcode
 LLVMRustPrintPassTimings
 LLVMRustEnableSegmentedStacks