diff options
author | Devang Patel <dpatel@apple.com> | 2010-08-10 07:24:25 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2010-08-10 07:24:25 +0000 |
commit | 8d308384a220c7dc81755c47cdcbdd87dac25d5b (patch) | |
tree | 375ad9e9469e9377ce793ec7b2fd4f893fe36bf6 | |
parent | bf87f2c1c6e2d8cb50902a6d79e8b170c19570d2 (diff) |
Even if a constant's evaluated value is used, emit debug info for the constant variable.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110660 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 11 | ||||
-rw-r--r-- | lib/CodeGen/CGDebugInfo.h | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 1 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.cpp | 14 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 3 | ||||
-rw-r--r-- | test/CodeGen/2010-08-10-DbgConstant.c | 5 |
6 files changed, 37 insertions, 1 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index c54196cc27..5ec68c0ff0 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -1801,6 +1801,17 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, true/*definition*/, Var); } +void CGDebugInfo::EmitGlobalVariable(llvm::Constant *C, const ValueDecl *VD, + CGBuilderTy &Builder) { + // Create the descriptor for the variable. + llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); + llvm::StringRef Name = VD->getName(); + DebugFactory.CreateGlobalVariable(Unit, Name, Name, Name, Unit, + getLineNumber(VD->getLocation()), + getOrCreateType(VD->getType(), Unit), + true, true, C); +} + /// getOrCreateNamesSpace - Return namespace descriptor for the given /// namespace decl. llvm::DINameSpace diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index b20506d470..4df2ab62f8 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -181,6 +181,10 @@ public: /// EmitGlobalVariable - Emit information about an objective-c interface. void EmitGlobalVariable(llvm::GlobalVariable *GV, ObjCInterfaceDecl *Decl); + /// EmitGlobalVariable - Emit information about a constant. + void EmitGlobalVariable(llvm::Constant *C, const ValueDecl *VD, + CGBuilderTy &Builder); + private: /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration. void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI, diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index c9e4dbd140..f6f126a8a6 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -149,6 +149,7 @@ public: Expr::EvalResult Result; if (E->Evaluate(Result, CGF.getContext()) && Result.Val.isInt()) { assert(!Result.HasSideEffects && "Constant declref with side-effect?!"); + CGF.EmitDeclRefExprDbgValue(E, Result.Val); return llvm::ConstantInt::get(VMContext, Result.Val.getInt()); } return EmitLoadOfLValue(E); diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index a3cd4f4c29..f992aa72e2 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -1284,3 +1284,17 @@ llvm::Value *CodeGenFunction::getEHCleanupDestSlot() { CreateTempAlloca(Builder.getInt32Ty(), "eh.cleanup.dest.slot"); return EHCleanupDest; } + +void CodeGenFunction::EmitDeclRefExprDbgValue(const DeclRefExpr *E, + const APValue &AV) { + CGDebugInfo *Dbg = getDebugInfo(); + if (!Dbg) return; + + llvm::Constant *C = NULL; + if (AV.isInt()) + C = llvm::ConstantInt::get(getLLVMContext(), AV.getInt()); + else if (AV.isFloat()) + C = llvm::ConstantFP::get(getLLVMContext(), AV.getFloat()); + if (C) + Dbg->EmitGlobalVariable(C, E->getDecl(), Builder); +} diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index af7e0696f4..e0673d9917 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -41,6 +41,7 @@ namespace llvm { } namespace clang { + class APValue; class ASTContext; class CXXDestructorDecl; class CXXTryStmt; @@ -1372,7 +1373,7 @@ public: LValue EmitStmtExprLValue(const StmtExpr *E); LValue EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E); LValue EmitObjCSelectorLValue(const ObjCSelectorExpr *E); - + void EmitDeclRefExprDbgValue(const DeclRefExpr *E, const APValue &AV); //===--------------------------------------------------------------------===// // Scalar Expression Emission //===--------------------------------------------------------------------===// diff --git a/test/CodeGen/2010-08-10-DbgConstant.c b/test/CodeGen/2010-08-10-DbgConstant.c new file mode 100644 index 0000000000..285368586b --- /dev/null +++ b/test/CodeGen/2010-08-10-DbgConstant.c @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -S -emit-llvm -g %s -o - | grep DW_TAG_constant + +static const unsigned int ro = 201; +void bar(int); +void foo() { bar(ro); } |