From e080804f72fe937ed36cd6656f5f119959529945 Mon Sep 17 00:00:00 2001 From: Dylan McKay Date: Sun, 11 Dec 2016 22:08:20 +1300 Subject: [PATCH] Update LLVM global variable debug info API for 4.0 This teaches Rust about an LLVM 4.0 API change for creating debug info for global variables. This change was made in upstream LLVM patch https://reviews.llvm.org/D20147 This is almost 1:1 copy of how clang did it in http://reviews.llvm.org/D20415 --- src/rustllvm/RustWrapper.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 85749d883d2f3..f5fa66f1b0e5a 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(Context), + uint64_t AlignInBits = 0) { + Constant *InitVal = cast(unwrap(Val)); + +#if LLVM_VERSION_GE(4, 0) + llvm::DIExpression *InitExpr = nullptr; + if (llvm::ConstantInt *IntVal = llvm::dyn_cast(InitVal)) { + InitExpr = Builder->createConstantValueExpression( + IntVal->getValue().getSExtValue()); + } else if (llvm::ConstantFP *FPVal = llvm::dyn_cast(InitVal)) { + InitExpr = Builder->createConstantValueExpression( + FPVal->getValueAPF().bitcastToAPInt().getZExtValue()); + } +#endif + + return wrap(Builder->createGlobalVariable(unwrapDI(Context), Name, LinkageName, unwrapDI(File), LineNo, unwrapDI(Ty), isLocalToUnit, - cast(unwrap(Val)), +#if LLVM_VERSION_GE(4, 0) + InitExpr, +#else + InitVal, +#endif unwrapDIptr(Decl) #if LLVM_VERSION_GE(4, 0) , AlignInBits