Merge "Fix the comparison of opaque types that have multiple definitions" am: 1d2edd2cd2

Original change: https://android-review.googlesource.com/c/platform/development/+/2252362

Change-Id: I0e5975f5eaf6ee6a118d343ab18270496a0cb889
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot
2022-10-14 09:52:39 +00:00
committed by Automerger Merge Worker
11 changed files with 287 additions and 64 deletions

View File

@@ -206,7 +206,8 @@ ModuleMerger::UpdateUDTypeAccounting(
std::string added_type_id = addend_node->GetSelfType();
auto type_id_it = module_->type_graph_.find(added_type_id);
if (type_id_it != module_->type_graph_.end()) {
added_type_id = added_type_id + "#ODR:" + addend_compilation_unit_path;
added_type_id = repr::FormatMultiDefinitionTypeId(
added_type_id, addend_compilation_unit_path);
}
// Add the ud-type with type-id to the type_graph_, since if there are generic
@@ -390,7 +391,8 @@ MergeStatus ModuleMerger::MergeReferencingType(
addend.GetCompilationUnitPath(final_referenced_type);
// The path is empty for built-in types.
if (compilation_unit_path != "") {
added_type_id = added_type_id + "#ODR:" + compilation_unit_path;
added_type_id = repr::FormatMultiDefinitionTypeId(
added_type_id, compilation_unit_path);
}
}
}

View File

@@ -264,8 +264,12 @@ bool AbiDiffHelper::CompareVTables(
bool AbiDiffHelper::AreOpaqueTypesEqual(const std::string &old_type_id,
const std::string &new_type_id) const {
// b/253095767: In T, some dump files contain opaque types whose IDs end with
// "#ODR:" and the source paths. This function removes the suffixes before
// comparing the type IDs.
if (!diff_policy_options_.consider_opaque_types_different_ ||
old_type_id == new_type_id) {
ExtractMultiDefinitionTypeId(old_type_id) ==
ExtractMultiDefinitionTypeId(new_type_id)) {
return true;
}
// __va_list is an opaque type defined by the compiler. ARM ABI requires

View File

@@ -98,6 +98,16 @@ std::map<V, K> CreateInverseMap(const std::map<K, V> &m) {
return inverse_map;
}
static inline std::string FormatMultiDefinitionTypeId(
const std::string &type_id, const std::string &compilation_unit_path) {
return type_id + "#ODR:" + compilation_unit_path;
}
static inline std::string_view ExtractMultiDefinitionTypeId(
std::string_view type_id) {
return type_id.substr(0, type_id.find("#ODR:"));
}
class LinkableMessageIR {
public:
virtual ~LinkableMessageIR() {}

View File

@@ -6,4 +6,8 @@ struct Struct {
struct Opaque;
void func(const struct Struct *, const struct Opaque *);
struct DefinedInOneHeader;
extern "C" {
void func(Struct *, Opaque *, DefinedInOneHeader *);
}

View File

@@ -6,4 +6,9 @@ struct Struct {
struct Opaque;
void func(const struct Opaque *, const struct Struct *);
struct DefinedInOneHeader {};
extern "C" {
void func(Opaque *, Struct *, DefinedInOneHeader *);
void func2(DefinedInOneHeader *);
}

View File

@@ -1,5 +1,6 @@
libmerge_multi_definitions {
global:
func;
func2;
var;
};

View File

@@ -679,6 +679,18 @@ TEST_MODULES = [
linker_flags=['-output-format', 'Json', '-sources-per-thread', '1'],
has_reference_dump=True,
),
LsdumpModule(
name='libdiff_multi_definitions',
arch='arm64',
srcs=[
'integration/merge_multi_definitions/include/def1.h',
'integration/merge_multi_definitions/include/link_to_def2.h',
],
version_script='integration/merge_multi_definitions/map.txt',
export_include_dirs=['integration/merge_multi_definitions/include'],
linker_flags=['-output-format', 'Json', '-sources-per-thread', '1'],
has_reference_dump=True,
),
LsdumpModule(
name='libstruct_extensions',
arch='arm64',

View File

@@ -0,0 +1,174 @@
{
"array_types" : [],
"builtin_types" :
[
{
"alignment" : 1,
"is_integral" : true,
"is_unsigned" : true,
"linker_set_key" : "_ZTIc",
"name" : "char",
"referenced_type" : "_ZTIc",
"self_type" : "_ZTIc",
"size" : 1
},
{
"alignment" : 4,
"is_integral" : true,
"linker_set_key" : "_ZTIi",
"name" : "int",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIi",
"size" : 4
},
{
"linker_set_key" : "_ZTIv",
"name" : "void",
"referenced_type" : "_ZTIv",
"self_type" : "_ZTIv"
}
],
"elf_functions" :
[
{
"name" : "func"
},
{
"name" : "func2"
},
{
"name" : "var"
}
],
"elf_objects" : [],
"enum_types" : [],
"function_types" : [],
"functions" :
[
{
"function_name" : "func",
"linker_set_key" : "func",
"parameters" :
[
{
"referenced_type" : "_ZTIP6Struct"
},
{
"referenced_type" : "_ZTIP6Opaque"
},
{
"referenced_type" : "_ZTIP18DefinedInOneHeader"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"function_name" : "func2",
"linker_set_key" : "func2",
"parameters" :
[
{
"referenced_type" : "_ZTIP18DefinedInOneHeader#ODR:/link_to_def2.h.sdump"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/link_to_def2.h"
}
],
"global_vars" :
[
{
"linker_set_key" : "var",
"name" : "var",
"referenced_type" : "_ZTIc",
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
}
],
"lvalue_reference_types" : [],
"pointer_types" :
[
{
"alignment" : 8,
"linker_set_key" : "_ZTIP18DefinedInOneHeader",
"name" : "DefinedInOneHeader *",
"referenced_type" : "_ZTI18DefinedInOneHeader",
"self_type" : "_ZTIP18DefinedInOneHeader",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIP6Opaque",
"name" : "Opaque *",
"referenced_type" : "_ZTI6Opaque",
"self_type" : "_ZTIP6Opaque",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIP6Struct",
"name" : "Struct *",
"referenced_type" : "_ZTI6Struct",
"self_type" : "_ZTIP6Struct",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIP6Struct",
"name" : "Struct *",
"referenced_type" : "_ZTI6Struct#ODR:/link_to_def2.h.sdump",
"self_type" : "_ZTIP6Struct#ODR:/link_to_def2.h.sdump",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/link_to_def2.h"
}
],
"qualified_types" : [],
"record_types" :
[
{
"alignment" : 1,
"linker_set_key" : "_ZTI18DefinedInOneHeader",
"name" : "DefinedInOneHeader",
"referenced_type" : "_ZTI18DefinedInOneHeader",
"self_type" : "_ZTI18DefinedInOneHeader",
"size" : 1,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/link_to_def2.h"
},
{
"alignment" : 8,
"fields" :
[
{
"field_name" : "member1",
"referenced_type" : "_ZTIP6Struct"
}
],
"linker_set_key" : "_ZTI6Struct",
"name" : "Struct",
"referenced_type" : "_ZTI6Struct",
"self_type" : "_ZTI6Struct",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"alignment" : 8,
"fields" :
[
{
"field_name" : "member2",
"referenced_type" : "_ZTIP6Struct#ODR:/link_to_def2.h.sdump"
}
],
"linker_set_key" : "_ZTI6Struct",
"name" : "Struct",
"referenced_type" : "_ZTI6Struct#ODR:/link_to_def2.h.sdump",
"self_type" : "_ZTI6Struct#ODR:/link_to_def2.h.sdump",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/link_to_def2.h"
}
],
"rvalue_reference_types" : []
}

View File

@@ -33,6 +33,9 @@
{
"name" : "func"
},
{
"name" : "func2"
},
{
"name" : "var"
}
@@ -40,7 +43,39 @@
"elf_objects" : [],
"enum_types" : [],
"function_types" : [],
"functions" : [],
"functions" :
[
{
"function_name" : "func",
"linker_set_key" : "func",
"parameters" :
[
{
"referenced_type" : "_ZTIP6Struct"
},
{
"referenced_type" : "_ZTIP6Opaque"
},
{
"referenced_type" : "_ZTIP18DefinedInOneHeader"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"function_name" : "func2",
"linker_set_key" : "func2",
"parameters" :
[
{
"referenced_type" : "_ZTIP18DefinedInOneHeader#ODR:/def2.h.sdump"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def2.h"
}
],
"global_vars" :
[
{
@@ -53,6 +88,24 @@
"lvalue_reference_types" : [],
"pointer_types" :
[
{
"alignment" : 8,
"linker_set_key" : "_ZTIP18DefinedInOneHeader",
"name" : "DefinedInOneHeader *",
"referenced_type" : "_ZTI18DefinedInOneHeader",
"self_type" : "_ZTIP18DefinedInOneHeader",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIP6Opaque",
"name" : "Opaque *",
"referenced_type" : "_ZTI6Opaque",
"self_type" : "_ZTIP6Opaque",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIP6Struct",
@@ -70,68 +123,20 @@
"self_type" : "_ZTIP6Struct#ODR:/def2.h.sdump",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def2.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPK6Opaque",
"name" : "const Opaque *",
"referenced_type" : "_ZTIK6Opaque",
"self_type" : "_ZTIPK6Opaque",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPK6Struct",
"name" : "const Struct *",
"referenced_type" : "_ZTIK6Struct",
"self_type" : "_ZTIPK6Struct",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPK6Struct",
"name" : "const Struct *",
"referenced_type" : "_ZTIK6Struct#ODR:/def2.h.sdump",
"self_type" : "_ZTIPK6Struct#ODR:/def2.h.sdump",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def2.h"
}
],
"qualified_types" :
[
{
"is_const" : true,
"linker_set_key" : "_ZTIK6Opaque",
"name" : "const Opaque",
"referenced_type" : "_ZTI6Opaque",
"self_type" : "_ZTIK6Opaque",
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
},
{
"alignment" : 8,
"is_const" : true,
"linker_set_key" : "_ZTIK6Struct",
"name" : "const Struct",
"referenced_type" : "_ZTI6Struct#ODR:/def2.h.sdump",
"self_type" : "_ZTIK6Struct#ODR:/def2.h.sdump",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def2.h"
},
{
"alignment" : 8,
"is_const" : true,
"linker_set_key" : "_ZTIK6Struct",
"name" : "const Struct",
"referenced_type" : "_ZTI6Struct",
"self_type" : "_ZTIK6Struct",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def1.h"
}
],
"qualified_types" : [],
"record_types" :
[
{
"alignment" : 1,
"linker_set_key" : "_ZTI18DefinedInOneHeader",
"name" : "DefinedInOneHeader",
"referenced_type" : "_ZTI18DefinedInOneHeader",
"self_type" : "_ZTI18DefinedInOneHeader",
"size" : 1,
"source_file" : "development/vndk/tools/header-checker/tests/integration/merge_multi_definitions/include/def2.h"
},
{
"alignment" : 8,
"fields" :

View File

@@ -387,6 +387,11 @@ class HeaderCheckerTest(unittest.TestCase):
def test_merge_multi_definitions(self):
self.prepare_and_absolute_diff_all_archs(
"libmerge_multi_definitions", "libmerge_multi_definitions")
self.prepare_and_run_abi_diff_all_archs(
"libmerge_multi_definitions", "libdiff_multi_definitions", 0,
flags=["-input-format-new", "Json", "-input-format-old", "Json",
"-consider-opaque-types-different"],
create_old=False, create_new=False)
def test_print_resource_dir(self):
dumper_path = shutil.which("header-abi-dumper")