[PATCH] D134705: [clang][DebugInfo] Emit debuginfo for non-constant case value
Yonghong Song via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 27 00:04:15 PDT 2022
yonghong-song created this revision.
yonghong-song added a reviewer: dblaikie.
Herald added a project: All.
yonghong-song requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Currently, clang does not emit debuginfo for the switch stmt
case value if it is an enum value. For example,
$ cat test.c
enum { AA = 1, BB = 2 };
int func1(int a) {
switch(a) {
case AA: return 10;
case BB: return 11;
default: break;
}
return 0;
}
$ llvm-dwarfdump test.o | grep AA
$
Note that gcc does emit debuginfo for the same test case.
This patch added such a support with similar implementation
to CodeGenFunction::EmitDeclRefExprDbgValue(). With this patch,
$ clang -g -c test.c
$ llvm-dwarfdump test.o | grep AA
DW_AT_name ("AA")
$
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D134705
Files:
clang/lib/CodeGen/CGStmt.cpp
clang/test/CodeGen/debug-info-enum-case-val.c
Index: clang/test/CodeGen/debug-info-enum-case-val.c
===================================================================
--- /dev/null
+++ clang/test/CodeGen/debug-info-enum-case-val.c
@@ -0,0 +1,27 @@
+// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
+
+enum { A = 1, B = 2 };
+int func1(int a) {
+ switch(a) {
+ case A: return 10;
+ case B: return 11;
+ default: break;
+ }
+ return 0;
+}
+// CHECK: !DIEnumerator(name: "A", value: 1)
+// CHECK-NEXT: !DIEnumerator(name: "B", value: 2)
+
+enum { C = 1, D = 2 };
+typedef unsigned long long __t1;
+typedef __t1 __t2;
+int func2(__t2 a) {
+ switch(a) {
+ case C: return 10;
+ case D: return 11;
+ default: break;
+ }
+ return 0;
+}
+// CHECK: !DIEnumerator(name: "C", value: 1)
+// CHECK-NEXT: !DIEnumerator(name: "D", value: 2)
Index: clang/lib/CodeGen/CGStmt.cpp
===================================================================
--- clang/lib/CodeGen/CGStmt.cpp
+++ clang/lib/CodeGen/CGStmt.cpp
@@ -1509,6 +1509,21 @@
llvm::ConstantInt *CaseVal =
Builder.getInt(S.getLHS()->EvaluateKnownConstInt(getContext()));
+
+ // Emit debuginfo for the case value if it is an enum value.
+ const ConstantExpr *CE;
+ if (auto ICE = dyn_cast<ImplicitCastExpr>(S.getLHS()))
+ CE = dyn_cast<ConstantExpr>(ICE->getSubExpr());
+ else
+ CE = dyn_cast<ConstantExpr>(S.getLHS());
+ if (CE) {
+ if (auto DE = dyn_cast<DeclRefExpr>(CE->getSubExpr()))
+ if (CGDebugInfo *Dbg = getDebugInfo())
+ if (CGM.getCodeGenOpts().hasReducedDebugInfo())
+ Dbg->EmitGlobalVariable(DE->getDecl(),
+ APValue(llvm::APSInt(CaseVal->getValue())));
+ }
+
if (SwitchLikelihood)
SwitchLikelihood->push_back(Stmt::getLikelihood(Attrs));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D134705.463107.patch
Type: text/x-patch
Size: 1771 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220927/59479164/attachment.bin>
More information about the cfe-commits
mailing list