[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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user