about summary refs log tree commit diff
path: root/src/rustllvm/RustWrapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
-rw-r--r--src/rustllvm/RustWrapper.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index 85749d883d2..f5fa66f1b0e 100644
--- a/src/rustllvm/RustWrapper.cpp
+++ b/src/rustllvm/RustWrapper.cpp
@@ -651,17 +651,32 @@ extern "C" LLVMRustMetadataRef LLVMRustDIBuilderCreateStaticVariable(
     bool isLocalToUnit,
     LLVMValueRef Val,
     LLVMRustMetadataRef Decl = NULL,
-    uint64_t AlignInBits = 0)
-{
-    return wrap(Builder->createGlobalVariable(
-        unwrapDI<DIDescriptor>(Context),
+    uint64_t AlignInBits = 0) {
+    Constant *InitVal = cast<Constant>(unwrap(Val));
+
+#if LLVM_VERSION_GE(4, 0)
+    llvm::DIExpression *InitExpr = nullptr;
+    if (llvm::ConstantInt *IntVal = llvm::dyn_cast<llvm::ConstantInt>(InitVal)) {
+      InitExpr = Builder->createConstantValueExpression(
+          IntVal->getValue().getSExtValue());
+    } else if (llvm::ConstantFP *FPVal = llvm::dyn_cast<llvm::ConstantFP>(InitVal)) {
+        InitExpr = Builder->createConstantValueExpression(
+                FPVal->getValueAPF().bitcastToAPInt().getZExtValue());
+    }
+#endif
+
+    return wrap(Builder->createGlobalVariable(unwrapDI<DIDescriptor>(Context),
         Name,
         LinkageName,
         unwrapDI<DIFile>(File),
         LineNo,
         unwrapDI<DIType>(Ty),
         isLocalToUnit,
-        cast<Constant>(unwrap(Val)),
+#if LLVM_VERSION_GE(4, 0)
+        InitExpr,
+#else
+        InitVal,
+#endif
         unwrapDIptr<MDNode>(Decl)
 #if LLVM_VERSION_GE(4, 0)
         , AlignInBits