mirror of
https://github.com/intel/llvm.git
synced 2026-01-28 10:38:23 +08:00
Even if a constant's evaluated value is used, emit debug info for the constant variable.
llvm-svn: 110660
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
||||
5
clang/test/CodeGen/2010-08-10-DbgConstant.c
Normal file
5
clang/test/CodeGen/2010-08-10-DbgConstant.c
Normal file
@@ -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); }
|
||||
Reference in New Issue
Block a user