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));
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));
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits