[lldb][TypeSystemClang] Pass around enum value as uint64_t (#125244)

The `DWARFASTParserClang` reads enum values as `int64_t`s regardless of
the enumerators signedness. Then we pass it to
`AddEnumerationValueToEnumerationType` and only then do we create an
`APSInt` from it. However, there are other places where we read/pass
around the enum value as unsigned. This patch makes sure we consistently
use the same integer type for the enum value and let `APSInt` take care
of signedness. This shouldn't have any observable effect.
This commit is contained in:
Michael Buch
2025-02-03 09:07:40 +00:00
committed by GitHub
parent b84f7d17f8
commit f99e6df141
4 changed files with 9 additions and 13 deletions

View File

@@ -2321,8 +2321,7 @@ size_t DWARFASTParserClang::ParseChildEnumerators(
continue;
const char *name = nullptr;
bool got_value = false;
int64_t enum_value = 0;
std::optional<uint64_t> enum_value;
Declaration decl;
for (size_t i = 0; i < attributes.Size(); ++i) {
@@ -2331,7 +2330,6 @@ size_t DWARFASTParserClang::ParseChildEnumerators(
if (attributes.ExtractFormValueAtIndex(i, form_value)) {
switch (attr) {
case DW_AT_const_value:
got_value = true;
if (is_signed)
enum_value = form_value.Signed();
else
@@ -2360,9 +2358,9 @@ size_t DWARFASTParserClang::ParseChildEnumerators(
}
}
if (name && name[0] && got_value) {
if (name && name[0] && enum_value) {
m_ast.AddEnumerationValueToEnumerationType(
clang_type, decl, name, enum_value, enumerator_byte_size * 8);
clang_type, decl, name, *enum_value, enumerator_byte_size * 8);
++enumerators_added;
}
}

View File

@@ -1155,7 +1155,7 @@ bool PDBASTParser::AddEnumValue(CompilerType enum_type,
Variant v = enum_value.getValue();
std::string name =
std::string(MSVCUndecoratedNameParser::DropScope(enum_value.getName()));
int64_t raw_value;
uint64_t raw_value;
switch (v.Type) {
case PDB_VariantType::Int8:
raw_value = v.Value.Int8;

View File

@@ -8541,12 +8541,10 @@ clang::EnumConstantDecl *TypeSystemClang::AddEnumerationValueToEnumerationType(
clang::EnumConstantDecl *TypeSystemClang::AddEnumerationValueToEnumerationType(
const CompilerType &enum_type, const Declaration &decl, const char *name,
int64_t enum_value, uint32_t enum_value_bit_size) {
CompilerType underlying_type = GetEnumerationIntegerType(enum_type);
bool is_signed = false;
underlying_type.IsIntegerType(is_signed);
llvm::APSInt value(enum_value_bit_size, !is_signed);
uint64_t enum_value, uint32_t enum_value_bit_size) {
assert(enum_type.IsEnumerationType());
llvm::APSInt value(enum_value_bit_size,
!enum_type.IsEnumerationIntegerTypeSigned());
value = enum_value;
return AddEnumerationValueToEnumerationType(enum_type, decl, name, value);

View File

@@ -1040,7 +1040,7 @@ public:
// Modifying Enumeration types
clang::EnumConstantDecl *AddEnumerationValueToEnumerationType(
const CompilerType &enum_type, const Declaration &decl, const char *name,
int64_t enum_value, uint32_t enum_value_bit_size);
uint64_t enum_value, uint32_t enum_value_bit_size);
clang::EnumConstantDecl *AddEnumerationValueToEnumerationType(
const CompilerType &enum_type, const Declaration &decl, const char *name,
const llvm::APSInt &value);