Add linker_set_key to RecordTypeDiff and EnumTypeDiff

RecordTypeDiff and EnumTypeDiff in abi_diff.proto contain linker set
keys. The developers can copy them to the ignore list. The other Diff
messages do not need the field because it's in the messages imported
from abi_dump.proto.

Test: Update prebuilts/clang-tools; make libz
Bug: 243903630
Change-Id: I1e90d3c6cbfd09d72b3fdb244a4079ae899630aa
This commit is contained in:
Hsin-Yi Chen
2022-09-19 16:43:32 +08:00
parent 01cd913312
commit 00d8159166
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 {