Merge "Add more flexibility to abi checking."

am: 9bfbde9ef9

Change-Id: I6dcd3ab95053fcac0ed399d82c2bc3724bb46a10
This commit is contained in:
Jayant Chowdhary
2017-05-24 18:42:37 +00:00
committed by android-build-merger
6 changed files with 78 additions and 35 deletions

View File

@@ -294,6 +294,7 @@ DiffWrapper<FunctionDecl, FunctionDeclDiff>::Get() {
google::protobuf::RepeatedPtrField<ParamDeclDiff> *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_(),

View File

@@ -49,6 +49,10 @@ static llvm::cl::opt<bool> advice_only(
"advice-only", llvm::cl::desc("Advisory mode only"), llvm::cl::Optional,
llvm::cl::cat(header_checker_category));
static llvm::cl::opt<bool> 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<bool> 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;
}

View File

@@ -44,6 +44,10 @@ static llvm::cl::list<std::string> exported_header_dirs(
"I", llvm::cl::desc("<export_include_dirs>"), llvm::cl::Prefix,
llvm::cl::ZeroOrMore, llvm::cl::cat(header_checker_category));
static llvm::cl::opt<bool> 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<llvm::cl::Option *> &map = llvm::cl::getRegisteredOptions();
@@ -92,6 +96,10 @@ int main(int argc, const char **argv) {
::exit(1);
}
if (no_filter) {
static_cast<std::vector<std::string> &>(exported_header_dirs).clear();
}
// Initialize clang tools and run front-end action.
std::vector<std::string> header_files{ header_file };

View File

@@ -61,6 +61,10 @@ static llvm::cl::opt<std::string> arch(
"arch", llvm::cl::desc("<arch>"), llvm::cl::Optional,
llvm::cl::cat(header_linker_category));
static llvm::cl::opt<bool> 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<std::vector<std::string> &>(exported_header_dirs).clear();
}
HeaderAbiLinker Linker(dump_files, exported_header_dirs,
version_script, linked_dump, arch, api);
if (!Linker.LinkAndDump()) {

View File

@@ -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 {

View File

@@ -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 {