forked from OSchip/llvm-project
[DebugInfo] Generate debug information for labels. (Fix PR37395)
Generate DILabel metadata and call llvm.dbg.label after label statement to associate the metadata with the label. After fixing PR37395. Differential Revision: https://reviews.llvm.org/D45045 Patch by Hsiangkai Wang. llvm-svn: 337800
This commit is contained in:
parent
d6b2cdf9d4
commit
c50fbb9da7
|
@ -3729,6 +3729,32 @@ CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, llvm::Value *Storage,
|
|||
return EmitDeclare(VD, Storage, llvm::None, Builder);
|
||||
}
|
||||
|
||||
void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) {
|
||||
assert(DebugKind >= codegenoptions::LimitedDebugInfo);
|
||||
assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
|
||||
|
||||
if (D->hasAttr<NoDebugAttr>())
|
||||
return;
|
||||
|
||||
auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
|
||||
llvm::DIFile *Unit = getOrCreateFile(D->getLocation());
|
||||
|
||||
// Get location information.
|
||||
unsigned Line = getLineNumber(D->getLocation());
|
||||
unsigned Column = getColumnNumber(D->getLocation());
|
||||
|
||||
StringRef Name = D->getName();
|
||||
|
||||
// Create the descriptor for the label.
|
||||
auto *L =
|
||||
DBuilder.createLabel(Scope, Name, Unit, Line, CGM.getLangOpts().Optimize);
|
||||
|
||||
// Insert an llvm.dbg.label into the current block.
|
||||
DBuilder.insertLabel(L,
|
||||
llvm::DebugLoc::get(Line, Column, Scope, CurInlinedAt),
|
||||
Builder.GetInsertBlock());
|
||||
}
|
||||
|
||||
llvm::DIType *CGDebugInfo::CreateSelfType(const QualType &QualTy,
|
||||
llvm::DIType *Ty) {
|
||||
llvm::DIType *CachedTy = getTypeOrNull(QualTy);
|
||||
|
|
|
@ -399,6 +399,9 @@ public:
|
|||
llvm::Value *AI,
|
||||
CGBuilderTy &Builder);
|
||||
|
||||
/// Emit call to \c llvm.dbg.label for an label.
|
||||
void EmitLabel(const LabelDecl *D, CGBuilderTy &Builder);
|
||||
|
||||
/// Emit call to \c llvm.dbg.declare for an imported variable
|
||||
/// declaration in a block.
|
||||
void EmitDeclareOfBlockDeclRefVariable(
|
||||
|
|
|
@ -531,6 +531,16 @@ void CodeGenFunction::EmitLabel(const LabelDecl *D) {
|
|||
}
|
||||
|
||||
EmitBlock(Dest.getBlock());
|
||||
|
||||
// Emit debug info for labels.
|
||||
if (CGDebugInfo *DI = getDebugInfo()) {
|
||||
if (CGM.getCodeGenOpts().getDebugInfo() >=
|
||||
codegenoptions::LimitedDebugInfo) {
|
||||
DI->setLocation(D->getLocation());
|
||||
DI->EmitLabel(D, Builder);
|
||||
}
|
||||
}
|
||||
|
||||
incrementProfileCounter(D->getStmt());
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
// This test will test the correctness of generating DILabel and
|
||||
// llvm.dbg.label when the label is in inlined functions.
|
||||
//
|
||||
// RUN: %clang_cc1 -O2 %s -o - -emit-llvm -debug-info-kind=limited | FileCheck %s
|
||||
inline int f1(int a, int b) {
|
||||
int sum;
|
||||
|
||||
top:
|
||||
sum = a + b;
|
||||
return sum;
|
||||
}
|
||||
|
||||
extern int ga, gb;
|
||||
|
||||
int f2(void) {
|
||||
int result;
|
||||
|
||||
result = f1(ga, gb);
|
||||
// CHECK: call void @llvm.dbg.label(metadata [[LABEL_METADATA:!.*]]), !dbg [[LABEL_LOCATION:!.*]]
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// CHECK: distinct !DISubprogram(name: "f1", {{.*}}, retainedNodes: [[ELEMENTS:!.*]])
|
||||
// CHECK: [[ELEMENTS]] = !{{{.*}}, [[LABEL_METADATA]]}
|
||||
// CHECK: [[LABEL_METADATA]] = !DILabel({{.*}}, name: "top", {{.*}}, line: 8)
|
||||
// CHECK: [[INLINEDAT:!.*]] = distinct !DILocation(line: 18,
|
||||
// CHECK: [[LABEL_LOCATION]] = !DILocation(line: 8, {{.*}}, inlinedAt: [[INLINEDAT]])
|
|
@ -0,0 +1,16 @@
|
|||
// This test will test the correstness of generating DILabel and
|
||||
// llvm.dbg.label for labels.
|
||||
//
|
||||
// RUN: %clang_cc1 -emit-llvm %s -o - -emit-llvm -debug-info-kind=limited | FileCheck %s
|
||||
|
||||
int f1(int a, int b) {
|
||||
int sum;
|
||||
|
||||
top:
|
||||
// CHECK: call void @llvm.dbg.label(metadata [[LABEL_METADATA:!.*]]), !dbg [[LABEL_LOCATION:!.*]]
|
||||
sum = a + b;
|
||||
return sum;
|
||||
}
|
||||
|
||||
// CHECK: [[LABEL_METADATA]] = !DILabel({{.*}}, name: "top", {{.*}}, line: 9)
|
||||
// CHECK: [[LABEL_LOCATION]] = !DILocation(line: 9,
|
Loading…
Reference in New Issue