diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index cb2d624a909..aa71f1dc678 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -1058,6 +1058,11 @@ bool llvm::GetConstantStringInfo(Value *V, std::string &Str, uint64_t Offset, StopAtNul); } + if (MDString *MDStr = dyn_cast(V)) { + Str = MDStr->getString(); + return true; + } + // The GEP instruction, constant or instruction, must reference a global // variable that is a constant and is initialized. The referenced constant // initializer is the array that we'll use for optimization. diff --git a/lib/VMCore/IntrinsicInst.cpp b/lib/VMCore/IntrinsicInst.cpp index 8bdc96896c5..5f33d0eebb9 100644 --- a/lib/VMCore/IntrinsicInst.cpp +++ b/lib/VMCore/IntrinsicInst.cpp @@ -61,17 +61,11 @@ Value *DbgInfoIntrinsic::StripCast(Value *C) { Value *DbgStopPointInst::getFileName() const { // Once the operand indices are verified, update this assert assert(LLVMDebugVersion == (7 << 16) && "Verify operand indices"); - GlobalVariable *GV = cast(getContext()); - if (!GV->hasInitializer()) return NULL; - ConstantStruct *CS = cast(GV->getInitializer()); - return CS->getOperand(3); + return getContext()->getElement(3); } Value *DbgStopPointInst::getDirectory() const { // Once the operand indices are verified, update this assert assert(LLVMDebugVersion == (7 << 16) && "Verify operand indices"); - GlobalVariable *GV = cast(getContext()); - if (!GV->hasInitializer()) return NULL; - ConstantStruct *CS = cast(GV->getInitializer()); - return CS->getOperand(4); + return getContext()->getElement(4); } diff --git a/test/DebugInfo/printdbginfo2.ll b/test/DebugInfo/printdbginfo2.ll new file mode 100644 index 00000000000..a82bf80b743 --- /dev/null +++ b/test/DebugInfo/printdbginfo2.ll @@ -0,0 +1,73 @@ +; RUN: llvm-as < %s | opt -print-dbginfo -disable-output | FileCheck %s +; grep {%b is variable b of type x declared at x.c:7} %t1 +; grep {%2 is variable b of type x declared at x.c:7} %t1 +; grep {@c.1442 is variable c of type int declared at x.c:4} %t1 + +%struct.foo = type { i32 } + +@main.c = internal global i32 5 ; [#uses=1] + +define i32 @main() nounwind { +entry: +; CHECK:; (x.c:6:3) + %retval = alloca i32 ; [#uses=3] + %b = alloca %struct.foo, align 4 ; <%struct.foo*> [#uses=2] +; CHECK:; %b is variable b of type foo declared at x.c:7 + %a = alloca [4 x i32], align 4 ; <[4 x i32]*> [#uses=1] +; CHECK:; %a is variable a of type declared at x.c:8 + call void @llvm.dbg.func.start(metadata !3) +; CHECK:; fully qualified function name: main return type: int at line 5 + store i32 0, i32* %retval + call void @llvm.dbg.stoppoint(i32 6, i32 3, metadata !1) +; CHECK:; x.c:7:3 + call void @llvm.dbg.stoppoint(i32 7, i32 3, metadata !1) + %0 = bitcast %struct.foo* %b to { }* ; <{ }*> [#uses=1] + call void @llvm.dbg.declare({ }* %0, metadata !4) +; CHECK:; %0 is variable b of type foo declared at x.c:7 + call void @llvm.dbg.stoppoint(i32 8, i32 3, metadata !1) +; CHECK:; x.c:8:3 + %1 = bitcast [4 x i32]* %a to { }* ; <{ }*> [#uses=1] + call void @llvm.dbg.declare({ }* %1, metadata !8) +; CHECK:; %1 is variable a of type declared at x.c:8 + call void @llvm.dbg.stoppoint(i32 9, i32 3, metadata !1) +; CHECK:; x.c:9:3 + %tmp = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 ; [#uses=1] +; CHECK:; %tmp is variable b of type foo declared at x.c:7 + store i32 5, i32* %tmp +; CHECK:; x.c:10:3 + call void @llvm.dbg.stoppoint(i32 10, i32 3, metadata !1) + %tmp1 = load i32* @main.c ; [#uses=1] +; CHECK:; @main.c is variable c of type int declared at x.c:6 + store i32 %tmp1, i32* %retval + br label %2 + +;