1 // Copyright (C) 2016 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef ABI_DIFF_H_
16 #define ABI_DIFF_H_
17 
18 #include "diff/abi_diff_wrappers.h"
19 #include "repr/ir_representation.h"
20 
21 #include <string>
22 #include <vector>
23 
24 
25 namespace header_checker {
26 namespace diff {
27 
28 
29 using repr::AbiElementMap;
30 using repr::DiffPolicyOptions;
31 
32 
33 class HeaderAbiDiff {
34  public:
HeaderAbiDiff(const std::string & lib_name,const std::string & arch,const std::string & old_dump,const std::string & new_dump,const std::string & compatibility_report,const std::set<std::string> & ignored_symbols,bool allow_adding_removing_weak_symbols,const DiffPolicyOptions & diff_policy_options,bool check_all_apis,repr::TextFormatIR text_format_old,repr::TextFormatIR text_format_new,repr::TextFormatIR text_format_diff)35   HeaderAbiDiff(const std::string &lib_name, const std::string &arch,
36                 const std::string &old_dump, const std::string &new_dump,
37                 const std::string &compatibility_report,
38                 const std::set<std::string> &ignored_symbols,
39                 bool allow_adding_removing_weak_symbols,
40                 const DiffPolicyOptions &diff_policy_options,
41                 bool check_all_apis, repr::TextFormatIR text_format_old,
42                 repr::TextFormatIR text_format_new,
43                 repr::TextFormatIR text_format_diff)
44       : lib_name_(lib_name), arch_(arch), old_dump_(old_dump),
45         new_dump_(new_dump), cr_(compatibility_report),
46         ignored_symbols_(ignored_symbols),
47         diff_policy_options_(diff_policy_options),
48         allow_adding_removing_weak_symbols_(allow_adding_removing_weak_symbols),
49         check_all_apis_(check_all_apis),
50         text_format_old_(text_format_old), text_format_new_(text_format_new),
51         text_format_diff_(text_format_diff) {}
52 
53   repr::CompatibilityStatusIR GenerateCompatibilityReport();
54 
55  private:
56   repr::CompatibilityStatusIR CompareTUs(
57       const repr::ModuleIR &old_tu,
58       const repr::ModuleIR &new_tu,
59       repr::IRDiffDumper *ir_diff_dumper);
60 
61   template <typename T, typename ElfSymbolType>
62   bool CollectDynsymExportables(
63       const AbiElementMap<T> &old_exportables,
64       const AbiElementMap<T> &new_exportables,
65       const AbiElementMap<ElfSymbolType> &old_elf_symbols,
66       const AbiElementMap<ElfSymbolType> &new_elf_symbols,
67       const AbiElementMap<const repr::TypeIR *> &old_types_map,
68       const AbiElementMap<const repr::TypeIR *> &new_types_map,
69       repr::IRDiffDumper *ir_diff_dumper);
70 
71   template <typename T>
72   bool Collect(
73       const AbiElementMap<const T *> &old_elements_map,
74       const AbiElementMap<const T *> &new_elements_map,
75       const AbiElementMap<const repr::ElfSymbolIR *> *old_elf_map,
76       const AbiElementMap<const repr::ElfSymbolIR *> *new_elf_map,
77       repr::IRDiffDumper *ir_diff_dumper,
78       const AbiElementMap<const repr::TypeIR *> &old_types_map,
79       const AbiElementMap<const repr::TypeIR *> &new_types_map);
80 
81   bool CollectElfSymbols(
82       const AbiElementMap<const repr::ElfSymbolIR *> &old_symbols,
83       const AbiElementMap<const repr::ElfSymbolIR *> &new_symbols,
84       repr::IRDiffDumper *ir_diff_dumper);
85 
86   bool PopulateElfElements(
87       std::vector<const repr::ElfSymbolIR *> &elf_elements,
88       repr::IRDiffDumper *ir_diff_dumper,
89       repr::IRDiffDumper::DiffKind diff_kind);
90 
91   template <typename T>
92   bool PopulateRemovedElements(
93       const AbiElementMap<const T *> &old_elements_map,
94       const AbiElementMap<const T *> &new_elements_map,
95       const AbiElementMap<const repr::ElfSymbolIR *> *old_elf_map,
96       const AbiElementMap<const repr::ElfSymbolIR *> *new_elf_map,
97       repr::IRDiffDumper *ir_diff_dumper,
98       repr::IRDiffDumper::DiffKind diff_kind,
99       const AbiElementMap<const repr::TypeIR *> &types_map);
100 
101   template <typename T>
102   bool PopulateCommonElements(
103       const AbiElementMap<const T *> &old_elements_map,
104       const AbiElementMap<const T *> &new_elements_map,
105       const AbiElementMap<const repr::TypeIR *> &old_types,
106       const AbiElementMap<const repr::TypeIR *> &new_types,
107       repr::IRDiffDumper *ir_diff_dumper,
108       repr::IRDiffDumper::DiffKind diff_kind);
109 
110   template <typename T>
111   bool DumpDiffElements(
112       std::vector<std::pair<const T *, const T *>> &pairs,
113       const AbiElementMap<const repr::TypeIR *> &old_types,
114       const AbiElementMap<const repr::TypeIR *> &new_types,
115       repr::IRDiffDumper *ir_diff_dumper,
116       repr::IRDiffDumper::DiffKind diff_kind);
117 
118   template <typename T>
119   bool DumpLoneElements(
120       std::vector<const T *> &elements,
121       const AbiElementMap<const repr::ElfSymbolIR *> *old_elf_map,
122       const AbiElementMap<const repr::ElfSymbolIR *> *new_elf_map,
123       repr::IRDiffDumper *ir_diff_dumper,
124       repr::IRDiffDumper::DiffKind diff_kind,
125       const AbiElementMap<const repr::TypeIR *> &old_types_map);
126 
127   std::pair<AbiElementMap<const repr::EnumTypeIR *>,
128             AbiElementMap<const repr::RecordTypeIR *>>
129   ExtractUserDefinedTypes(const repr::ModuleIR &tu);
130 
131   bool CollectUserDefinedTypes(
132       const repr::ModuleIR &old_tu,
133       const repr::ModuleIR &new_tu,
134       const AbiElementMap<const repr::TypeIR *> &old_types_map,
135       const AbiElementMap<const repr::TypeIR *> &new_types_map,
136       repr::IRDiffDumper *ir_diff_dumper);
137 
138   template <typename T>
139   bool CollectUserDefinedTypesInternal(
140       const AbiElementMap<const T*> &old_ud_types_map,
141       const AbiElementMap<const T*> &new_ud_types_map,
142       const AbiElementMap<const repr::TypeIR *> &old_types_map,
143       const AbiElementMap<const repr::TypeIR *> &new_types_map,
144       repr::IRDiffDumper *ir_diff_dumper);
145 
146  private:
147   const std::string &lib_name_;
148   const std::string &arch_;
149   const std::string &old_dump_;
150   const std::string &new_dump_;
151   const std::string &cr_;
152   const std::set<std::string> &ignored_symbols_;
153   const DiffPolicyOptions &diff_policy_options_;
154   bool allow_adding_removing_weak_symbols_;
155   bool check_all_apis_;
156   std::set<std::string> type_cache_;
157   repr::TextFormatIR text_format_old_;
158   repr::TextFormatIR text_format_new_;
159   repr::TextFormatIR text_format_diff_;
160 };
161 
162 
163 }  // namespace diff
164 }  // namespace header_checker
165 
166 
167 #endif  // ABI_DIFF_H_
168