Home | History | Annotate | Download | only in src
      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 #include "abi_diff_wrappers.h"
     16 
     17 #pragma clang diagnostic push
     18 #pragma clang diagnostic ignored "-Wunused-parameter"
     19 #pragma clang diagnostic ignored "-Wnested-anon-types"
     20 #include "proto/abi_dump.pb.h"
     21 #include "proto/abi_diff.pb.h"
     22 #pragma clang diagnostic pop
     23 
     24 #include <memory>
     25 #include <fstream>
     26 #include <iostream>
     27 #include <string>
     28 #include <vector>
     29 
     30 
     31 typedef abi_diff::CompatibilityStatus CompatibilityStatus;
     32 
     33 class HeaderAbiDiff {
     34  public:
     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       : lib_name_(lib_name), arch_(arch), old_dump_(old_dump),
     40         new_dump_(new_dump), cr_(compatibility_report),
     41       ignored_symbols_(ignored_symbols) { }
     42 
     43   CompatibilityStatus GenerateCompatibilityReport();
     44 
     45  private:
     46   CompatibilityStatus CompareTUs(const abi_dump::TranslationUnit &old_tu,
     47                                  const abi_dump::TranslationUnit &new_tu);
     48   // Collect* methods fill in the diff_tu.
     49   template <typename T, typename TDiff>
     50   static CompatibilityStatus Collect(
     51       google::protobuf::RepeatedPtrField<T> *elements_added,
     52       google::protobuf::RepeatedPtrField<T> *elements_removed,
     53       google::protobuf::RepeatedPtrField<TDiff> *elements_diff,
     54       const google::protobuf::RepeatedPtrField<T> &old_srcs,
     55       const google::protobuf::RepeatedPtrField<T> &new_srcs,
     56       const std::set<std::string> &ignored_symbols);
     57 
     58   template <typename T>
     59   static inline void AddToMap(std::map<std::string, const T *> *dst,
     60                               const google::protobuf::RepeatedPtrField<T> &src);
     61 
     62   template <typename T>
     63   static bool PopulateRemovedElements(
     64       google::protobuf::RepeatedPtrField<T> *dst,
     65       const std::map<std::string, const T *> &old_elements_map,
     66       const std::map<std::string, const T *> &new_elements_map,
     67       const std::set<std::string> &ignored_symbols);
     68 
     69   template <typename T, typename TDiff>
     70   static bool PopulateCommonElements(
     71       google::protobuf::RepeatedPtrField<TDiff> *dst,
     72       const std::map<std::string, const T *> &old_elements_map,
     73       const std::map<std::string, const T *> &new_elements_map,
     74       const std::set<std::string> &ignored_symbols);
     75 
     76   template <typename T, typename TDiff>
     77   static bool DumpDiffElements(
     78       google::protobuf::RepeatedPtrField<TDiff> *dst,
     79       std::vector<std::pair<const T *, const T *>> &pairs,
     80       const std::set<std::string> &ignored_symbols);
     81 
     82   template <typename T>
     83   static bool DumpLoneElements(google::protobuf::RepeatedPtrField<T> *dst,
     84                                std::vector<const T *> &elements,
     85                                const std::set<std::string> &ignored_symbols);
     86 
     87  private:
     88   const std::string &lib_name_;
     89   const std::string &arch_;
     90   const std::string &old_dump_;
     91   const std::string &new_dump_;
     92   const std::string &cr_;
     93   const std::set<std::string> &ignored_symbols_;
     94 };
     95 
     96 template <typename T>
     97 inline void HeaderAbiDiff::AddToMap(
     98     std::map<std::string, const T *> *dst,
     99     const google::protobuf::RepeatedPtrField<T> &src) {
    100   for (auto &&element : src) {
    101     dst->insert(std::make_pair(element.basic_abi().linker_set_key(), &element));
    102   }
    103 }
    104 
    105 static inline CompatibilityStatus operator|(CompatibilityStatus f,
    106                                             CompatibilityStatus s) {
    107   return static_cast<CompatibilityStatus>(
    108       static_cast<std::underlying_type<CompatibilityStatus>::type>(f) |
    109       static_cast<std::underlying_type<CompatibilityStatus>::type>(s));
    110 }
    111 
    112 static inline CompatibilityStatus operator&(
    113     CompatibilityStatus f, CompatibilityStatus s) {
    114   return static_cast<CompatibilityStatus>(
    115       static_cast<std::underlying_type<CompatibilityStatus>::type>(f) &
    116       static_cast<std::underlying_type<CompatibilityStatus>::type>(s));
    117 }
    118