[clang][DebugInfo] Set EnumKind based on enum_extensibility attribute (#126045)
This is the 2nd part to https://github.com/llvm/llvm-project/pull/124752. Here we make sure to set the `DICompositeType` `EnumKind` if the enum was declared with `__attribute__((enum_extensibility(...)))`. In DWARF this will be rendered as `DW_AT_APPLE_enum_kind` and will be used by LLDB when creating `clang::EnumDecl`s from debug-info. Depends on https://github.com/llvm/llvm-project/pull/126044
This commit is contained in:
parent
1608fe8d56
commit
e00fc80c19
@ -3567,6 +3567,10 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) {
|
||||
DBuilder.createEnumerator(Enum->getName(), Enum->getInitVal()));
|
||||
}
|
||||
|
||||
std::optional<EnumExtensibilityAttr::Kind> EnumKind;
|
||||
if (auto *Attr = ED->getAttr<EnumExtensibilityAttr>())
|
||||
EnumKind = Attr->getExtensibility();
|
||||
|
||||
// Return a CompositeType for the enum itself.
|
||||
llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators);
|
||||
|
||||
@ -3576,7 +3580,7 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) {
|
||||
llvm::DIType *ClassTy = getOrCreateType(ED->getIntegerType(), DefUnit);
|
||||
return DBuilder.createEnumerationType(
|
||||
EnumContext, ED->getName(), DefUnit, Line, Size, Align, EltArray, ClassTy,
|
||||
/*RunTimeLang=*/0, Identifier, ED->isScoped());
|
||||
/*RunTimeLang=*/0, Identifier, ED->isScoped(), EnumKind);
|
||||
}
|
||||
|
||||
llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent,
|
||||
|
49
clang/test/CodeGen/debug-info-enum-extensibility.c
Normal file
49
clang/test/CodeGen/debug-info-enum-extensibility.c
Normal file
@ -0,0 +1,49 @@
|
||||
// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
|
||||
|
||||
// CHECK-NOT: enumKind
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "ClosedEnum"
|
||||
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Closed)
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "OpenEnum"
|
||||
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Open)
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "ClosedFlagEnum"
|
||||
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Closed)
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "OpenFlagEnum"
|
||||
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Open)
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "MixedEnum"
|
||||
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Open)
|
||||
|
||||
enum Enum {
|
||||
E0, E1
|
||||
};
|
||||
|
||||
enum FlagEnum {
|
||||
FE0 = 1 << 0, FE1 = 1 << 1
|
||||
};
|
||||
|
||||
enum __attribute__((enum_extensibility(closed))) ClosedEnum {
|
||||
A0, A1
|
||||
};
|
||||
|
||||
enum __attribute__((enum_extensibility(open))) OpenEnum {
|
||||
B0, B1
|
||||
};
|
||||
|
||||
enum __attribute__((enum_extensibility(closed),flag_enum)) ClosedFlagEnum {
|
||||
C0 = 1 << 0, C1 = 1 << 1
|
||||
};
|
||||
|
||||
enum __attribute__((enum_extensibility(open),flag_enum)) OpenFlagEnum {
|
||||
D0 = 1 << 0, D1 = 1 << 1
|
||||
};
|
||||
|
||||
enum __attribute__((enum_extensibility(open), enum_extensibility(closed))) MixedEnum {
|
||||
M0, M1
|
||||
};
|
||||
|
||||
enum Enum e;
|
||||
enum FlagEnum fe;
|
||||
enum ClosedEnum ce;
|
||||
enum OpenEnum oe;
|
||||
enum ClosedFlagEnum cfe;
|
||||
enum OpenFlagEnum ofe;
|
||||
enum MixedEnum me;
|
Loading…
x
Reference in New Issue
Block a user