Merge "Add linker_set_key to RecordTypeDiff and EnumTypeDiff"

This commit is contained in:
Hsin-Yi Chen
2022-09-22 07:00:47 +00:00
committed by Gerrit Code Review
4 changed files with 24 additions and 5 deletions

View File

@@ -204,6 +204,7 @@ DiffStatus AbiDiffHelper::CompareEnumTypes(
}
auto enum_type_diff_ir = std::make_unique<EnumTypeDiffIR>();
enum_type_diff_ir->SetName(old_type->GetName());
enum_type_diff_ir->SetLinkerSetKey(old_type->GetLinkerSetKey());
const std::string &old_underlying_type =
ConvertTypeIdToString(old_types_, old_type->GetUnderlyingType());
const std::string &new_underlying_type =
@@ -555,6 +556,7 @@ DiffStatus AbiDiffHelper::CompareRecordTypes(
}
DiffStatus final_diff_status = DiffStatus::no_diff;
record_type_diff_ir->SetName(old_type->GetName());
record_type_diff_ir->SetLinkerSetKey(old_type->GetLinkerSetKey());
if (IsAccessDownGraded(old_type->GetAccess(), new_type->GetAccess())) {
final_diff_status = DiffStatus::indirect_diff;
record_type_diff_ir->SetAccessDiff(

View File

@@ -190,6 +190,10 @@ class RecordTypeDiffIR : public DiffMessageIR {
base_specifier_diffs_ = std::move(base_diffs);
}
void SetLinkerSetKey(std::string linker_set_key) {
linker_set_key_ = std::move(linker_set_key);
}
bool DiffExists() const {
return (type_diff_ != nullptr) || (vtable_diffs_ != nullptr) ||
(fields_removed_.size() != 0) || (field_diffs_.size() != 0) ||
@@ -208,6 +212,8 @@ class RecordTypeDiffIR : public DiffMessageIR {
return base_specifier_diffs_.get();
}
const std::string &GetLinkerSetKey() const { return linker_set_key_; }
protected:
// optional implemented with vector / std::unique_ptr.
std::unique_ptr<TypeDiffIR> type_diff_;
@@ -217,8 +223,7 @@ class RecordTypeDiffIR : public DiffMessageIR {
std::vector<const RecordFieldIR *> fields_added_;
std::unique_ptr<AccessSpecifierDiffIR> access_diff_;
std::unique_ptr<CXXBaseSpecifierDiffIR> base_specifier_diffs_;
// Template Diffs are not needed since they will show up in the linker set
// key.
std::string linker_set_key_;
};
class EnumFieldDiffIR {
@@ -274,6 +279,12 @@ class EnumTypeDiffIR : public DiffMessageIR {
return underlying_type_diff_.get();
}
void SetLinkerSetKey(std::string linker_set_key) {
linker_set_key_ = std::move(linker_set_key);
}
const std::string &GetLinkerSetKey() const { return linker_set_key_; }
bool IsExtended() const {
if (fields_removed_.size() == 0 && fields_diff_.size() == 0 &&
fields_added_.size() != 0) {
@@ -300,8 +311,7 @@ class EnumTypeDiffIR : public DiffMessageIR {
std::vector<const EnumFieldIR *> fields_removed_;
std::vector<const EnumFieldIR *> fields_added_;
std::vector<EnumFieldDiffIR> fields_diff_;
// Modifiable to allow implicit construction.
std::string name_;
std::string linker_set_key_;
};
class GlobalVarDiffIR : public DiffMessageIR {

View File

@@ -138,8 +138,10 @@ abi_diff::RecordTypeDiff IRDiffToProtobufConverter::ConvertRecordTypeDiffIR(
const RecordTypeDiffIR *record_type_diff_ir) {
abi_diff::RecordTypeDiff record_type_diff_protobuf;
record_type_diff_protobuf.set_name(record_type_diff_ir->GetName());
const TypeDiffIR *type_diff_ir = record_type_diff_ir->GetTypeDiff();
record_type_diff_protobuf.set_linker_set_key(
record_type_diff_ir->GetLinkerSetKey());
// If a type_info diff exists
const TypeDiffIR *type_diff_ir = record_type_diff_ir->GetTypeDiff();
if (type_diff_ir != nullptr) {
abi_diff::TypeInfoDiff *type_info_diff =
record_type_diff_protobuf.mutable_type_info_diff();
@@ -230,6 +232,8 @@ abi_diff::EnumTypeDiff IRDiffToProtobufConverter::ConvertEnumTypeDiffIR(
const EnumTypeDiffIR *enum_type_diff_ir) {
abi_diff::EnumTypeDiff enum_type_diff_protobuf;
enum_type_diff_protobuf.set_name(enum_type_diff_ir->GetName());
enum_type_diff_protobuf.set_linker_set_key(
enum_type_diff_ir->GetLinkerSetKey());
const std::pair<std::string, std::string> *underlying_type_diff =
enum_type_diff_ir->GetUnderlyingTypeDiff();
if ((underlying_type_diff != nullptr &&

View File

@@ -30,6 +30,7 @@ message CXXBaseSpecifierDiff {
}
message RecordTypeDiff {
// Template diffs are not needed since they have different linker set keys.
optional string name = 1;
optional string type_stack = 2;
optional TypeInfoDiff type_info_diff = 3;
@@ -38,6 +39,7 @@ message RecordTypeDiff {
repeated RecordFieldDeclDiff fields_diff = 6;
optional CXXBaseSpecifierDiff bases_diff = 7;
optional VTableLayoutDiff vtable_layout_diff = 8;
optional string linker_set_key = 9;
}
message UnderlyingTypeDiff {
@@ -57,6 +59,7 @@ message EnumTypeDiff {
optional UnderlyingTypeDiff underlying_type_diff = 4;
repeated abi_dump.EnumFieldDecl fields_added = 5;
repeated abi_dump.EnumFieldDecl fields_removed = 6;
optional string linker_set_key = 7;
}
message FunctionDeclDiff {