diff --git a/vndk/tools/header-checker/header-abi-diff/src/abi_diff_wrappers.cpp b/vndk/tools/header-checker/header-abi-diff/src/abi_diff_wrappers.cpp index b9978a933..79ef08229 100644 --- a/vndk/tools/header-checker/header-abi-diff/src/abi_diff_wrappers.cpp +++ b/vndk/tools/header-checker/header-abi-diff/src/abi_diff_wrappers.cpp @@ -294,6 +294,7 @@ DiffWrapper::Get() { google::protobuf::RepeatedPtrField *pdiffs = func_diff->mutable_param_diffs(); assert(func_diff->mutable_return_type_diffs() != nullptr); + func_diff->set_name(oldp_->basic_abi().linker_set_key()); if (DiffBasicNamedAndTypedDecl( func_diff->mutable_return_type_diffs()->mutable_old(), func_diff->mutable_return_type_diffs()->mutable_new_(), diff --git a/vndk/tools/header-checker/header-abi-diff/src/header_abi_diff.cpp b/vndk/tools/header-checker/header-abi-diff/src/header_abi_diff.cpp index 50ceb6a20..7281c09b6 100644 --- a/vndk/tools/header-checker/header-abi-diff/src/header_abi_diff.cpp +++ b/vndk/tools/header-checker/header-abi-diff/src/header_abi_diff.cpp @@ -49,6 +49,10 @@ static llvm::cl::opt advice_only( "advice-only", llvm::cl::desc("Advisory mode only"), llvm::cl::Optional, llvm::cl::cat(header_checker_category)); +static llvm::cl::opt suppress_local_warnings( + "suppress_local_warnings", llvm::cl::desc("suppress local warnings"), + llvm::cl::Optional, llvm::cl::cat(header_checker_category)); + static llvm::cl::opt allow_extensions( "allow-extensions", llvm::cl::desc("Do not return a non zero status on extensions"), @@ -80,6 +84,28 @@ int main(int argc, const char **argv) { CompatibilityStatus status = judge.GenerateCompatibilityReport(); + std::string status_str = ""; + switch (status) { + case CompatibilityStatus::INCOMPATIBLE: + status_str = "broken"; + break; + case CompatibilityStatus::EXTENSION: + status_str = "extended"; + break; + default: + break; + } + + if (!suppress_local_warnings && status) { + llvm::errs() << "******************************************************\n" + << "VNDK Abi " + << status_str + << ":" + << " Please check compatiblity report at : " + << compatibility_report << "\n" + << "*****************************************************\n"; + } + if (advice_only) { return CompatibilityStatus::COMPATIBLE; } diff --git a/vndk/tools/header-checker/header-abi-dumper/src/header_checker.cpp b/vndk/tools/header-checker/header-abi-dumper/src/header_checker.cpp index 626b76b0e..aaf532fa9 100644 --- a/vndk/tools/header-checker/header-abi-dumper/src/header_checker.cpp +++ b/vndk/tools/header-checker/header-abi-dumper/src/header_checker.cpp @@ -44,6 +44,10 @@ static llvm::cl::list exported_header_dirs( "I", llvm::cl::desc(""), llvm::cl::Prefix, llvm::cl::ZeroOrMore, llvm::cl::cat(header_checker_category)); +static llvm::cl::opt no_filter( + "no-filter", llvm::cl::desc("Do not filter any abi"), llvm::cl::Optional, + llvm::cl::cat(header_checker_category)); + // Hide irrelevant command line options defined in LLVM libraries. static void HideIrrelevantCommandLineOptions() { llvm::StringMap &map = llvm::cl::getRegisteredOptions(); @@ -92,6 +96,10 @@ int main(int argc, const char **argv) { ::exit(1); } + if (no_filter) { + static_cast &>(exported_header_dirs).clear(); + } + // Initialize clang tools and run front-end action. std::vector header_files{ header_file }; diff --git a/vndk/tools/header-checker/header-abi-linker/src/header_abi_linker.cpp b/vndk/tools/header-checker/header-abi-linker/src/header_abi_linker.cpp index 850fd913a..f050a5c23 100644 --- a/vndk/tools/header-checker/header-abi-linker/src/header_abi_linker.cpp +++ b/vndk/tools/header-checker/header-abi-linker/src/header_abi_linker.cpp @@ -61,6 +61,10 @@ static llvm::cl::opt arch( "arch", llvm::cl::desc(""), llvm::cl::Optional, llvm::cl::cat(header_linker_category)); +static llvm::cl::opt no_filter( + "no-filter", llvm::cl::desc("Do not filter any abi"), llvm::cl::Optional, + llvm::cl::cat(header_linker_category)); + class HeaderAbiLinker { public: HeaderAbiLinker( @@ -301,6 +305,9 @@ bool HeaderAbiLinker::ParseVersionScriptFiles() { int main(int argc, const char **argv) { GOOGLE_PROTOBUF_VERIFY_VERSION; llvm::cl::ParseCommandLineOptions(argc, argv, "header-linker"); + if (no_filter) { + static_cast &>(exported_header_dirs).clear(); + } HeaderAbiLinker Linker(dump_files, exported_header_dirs, version_script, linked_dump, arch, api); if (!Linker.LinkAndDump()) { diff --git a/vndk/tools/header-checker/proto/abi_diff.proto b/vndk/tools/header-checker/proto/abi_diff.proto index a31f4298a..28dbd52b6 100644 --- a/vndk/tools/header-checker/proto/abi_diff.proto +++ b/vndk/tools/header-checker/proto/abi_diff.proto @@ -7,30 +7,30 @@ package abi_diff; message RecordFieldDeclDiff { optional abi_dump.RecordFieldDecl old = 1; optional abi_dump.RecordFieldDecl new = 2; - required uint32 index = 3; + optional uint32 index = 3; } message EnumFieldDeclDiff { optional abi_dump.EnumFieldDecl old = 1; optional abi_dump.EnumFieldDecl new = 2; - required uint32 index = 3; + optional uint32 index = 3; } message CXXBaseSpecifierDiff { optional abi_dump.CXXBaseSpecifier old = 1; optional abi_dump.CXXBaseSpecifier new = 2; - required uint32 index = 3; + optional uint32 index = 3; } message CXXVTableDiff { optional abi_dump.VTableComponent old = 1; optional abi_dump.VTableComponent new = 2; - required uint32 index = 3; + optional uint32 index = 3; } message BasicNamedAndTypedDeclDiff { - required abi_dump.BasicNamedAndTypedDecl old = 1; - required abi_dump.BasicNamedAndTypedDecl new = 2; + optional abi_dump.BasicNamedAndTypedDecl old = 1; + optional abi_dump.BasicNamedAndTypedDecl new = 2; } message RecordDeclDiff { @@ -38,29 +38,30 @@ message RecordDeclDiff { repeated CXXBaseSpecifierDiff base_diffs = 2; repeated CXXVTableDiff vtable_diffs = 3; optional BasicNamedAndTypedDeclDiff type_diff = 4; - required string name = 5; + optional string name = 5; } message EnumDeclDiff { repeated EnumFieldDeclDiff field_diffs = 1; optional BasicNamedAndTypedDeclDiff type_diff = 2; - required string name = 3; + optional string name = 3; } message ReturnTypeDiff { - required abi_dump.BasicNamedAndTypedDecl old = 1; - required abi_dump.BasicNamedAndTypedDecl new = 2; + optional abi_dump.BasicNamedAndTypedDecl old = 1; + optional abi_dump.BasicNamedAndTypedDecl new = 2; } message ParamDeclDiff { optional abi_dump.ParamDecl old = 1; optional abi_dump.ParamDecl new = 2; - required uint32 index = 3; + optional uint32 index = 3; } message FunctionDeclDiff { optional ReturnTypeDiff return_type_diffs = 1; repeated ParamDeclDiff param_diffs = 2; + optional string name = 3; } message GlobalVarDeclDiff { diff --git a/vndk/tools/header-checker/proto/abi_dump.proto b/vndk/tools/header-checker/proto/abi_dump.proto index 11eb3cc14..77c610bce 100644 --- a/vndk/tools/header-checker/proto/abi_dump.proto +++ b/vndk/tools/header-checker/proto/abi_dump.proto @@ -4,7 +4,7 @@ package abi_dump; message BasicTypeAbi { // The type's name. for eg : a record field's type. - required string name = 1; + optional string name = 1; // Optional since templated types will not have this information. optional uint64 size = 2 [default = 0]; optional uint32 alignment = 3 [default = 0]; @@ -17,35 +17,35 @@ enum AccessSpecifier { } message BasicNamedAndTypedDecl { - required BasicTypeAbi type_abi = 1; + optional BasicTypeAbi type_abi = 1; // The TypedDecl's name. - required string name = 2; - required AccessSpecifier access = 3; + optional string name = 2; + optional AccessSpecifier access = 3; optional string linker_set_key = 4; } message FunctionDecl { - required BasicNamedAndTypedDecl basic_abi = 1; + optional BasicNamedAndTypedDecl basic_abi = 1; // Mangled name. - required string mangled_function_name = 2; - required string source_file = 3; + optional string mangled_function_name = 2; + optional string source_file = 3; repeated ParamDecl parameters = 4; optional TemplateInfo template_info = 5; } message ParamDecl { - required BasicNamedAndTypedDecl basic_abi = 1; - required bool default_arg = 2; + optional BasicNamedAndTypedDecl basic_abi = 1; + optional bool default_arg = 2; } message RecordFieldDecl { // For future additions. - required BasicNamedAndTypedDecl basic_abi = 1; + optional BasicNamedAndTypedDecl basic_abi = 1; } message EnumFieldDecl { - required BasicNamedAndTypedDecl basic_abi = 1; - required int64 enum_field_value = 2; // assumption: fits int64 + optional BasicNamedAndTypedDecl basic_abi = 1; + optional int64 enum_field_value = 2; // assumption: fits int64 } message TemplateInfo { @@ -53,17 +53,17 @@ message TemplateInfo { } message TemplateElement { - required BasicTemplateElementAbi basic_abi = 1; + optional BasicTemplateElementAbi basic_abi = 1; message BasicTemplateElementAbi { optional BasicTypeAbi type_abi = 1; optional string name = 2; - required string linker_set_key = 3; + optional string linker_set_key = 3; } } message CXXBaseSpecifier { - required BasicNamedAndTypedDecl basic_abi = 1; - required bool is_virtual = 2; + optional BasicNamedAndTypedDecl basic_abi = 1; + optional bool is_virtual = 2; } message VTableComponent { @@ -77,7 +77,7 @@ message VTableComponent { DeletingDtorPointer = 6; UnusedFunctionPointer = 7; } - required Kind kind = 1; + optional Kind kind = 1; optional string mangled_component_name = 2 [default = ""]; optional uint64 value = 3 [default = 0]; } @@ -87,24 +87,24 @@ message VTableLayout { } message RecordDecl { - required BasicNamedAndTypedDecl basic_abi = 1; + optional BasicNamedAndTypedDecl basic_abi = 1; repeated RecordFieldDecl fields = 2; repeated CXXBaseSpecifier base_specifiers = 3; - required string source_file = 4; + optional string source_file = 4; optional TemplateInfo template_info = 5; - required string mangled_record_name = 6; + optional string mangled_record_name = 6; optional VTableLayout vtable_layout = 7; } message EnumDecl { - required BasicNamedAndTypedDecl basic_abi = 1; + optional BasicNamedAndTypedDecl basic_abi = 1; repeated EnumFieldDecl enum_fields = 2; - required string source_file = 3; + optional string source_file = 3; } message GlobalVarDecl { - required BasicNamedAndTypedDecl basic_abi = 1; - required string source_file = 2; + optional BasicNamedAndTypedDecl basic_abi = 1; + optional string source_file = 2; } message TranslationUnit {