header-checker: Extract common code to ModuleIR

This commit extracts common IRReader code to ModuleIR.

Test: tests/test.py
Change-Id: I4e8a06833fae8d44718bd52628b3d7351882a3d8
diff --git a/vndk/tools/header-checker/Android.bp b/vndk/tools/header-checker/Android.bp
index f49e620..d83bd47 100644
--- a/vndk/tools/header-checker/Android.bp
+++ b/vndk/tools/header-checker/Android.bp
@@ -153,6 +153,7 @@
         "src/repr/ir_diff_dumper.cpp",
         "src/repr/ir_dumper.cpp",
         "src/repr/ir_reader.cpp",
+        "src/repr/ir_representation.cpp",
         "src/repr/json/converter.cpp",
         "src/repr/json/ir_dumper.cpp",
         "src/repr/json/ir_reader.cpp",
diff --git a/vndk/tools/header-checker/src/repr/ir_reader.cpp b/vndk/tools/header-checker/src/repr/ir_reader.cpp
index 18a9835..3e4e928 100644
--- a/vndk/tools/header-checker/src/repr/ir_reader.cpp
+++ b/vndk/tools/header-checker/src/repr/ir_reader.cpp
@@ -50,16 +50,6 @@
 }
 
 
-void IRReader::AddToODRListMap(const std::string &key, const TypeIR *value) {
-  auto map_it = module_->odr_list_map_.find(key);
-  if (map_it == module_->odr_list_map_.end()) {
-    module_->odr_list_map_.emplace(key, std::list<const TypeIR *>({value}));
-    return;
-  }
-  module_->odr_list_map_[key].emplace_back(value);
-}
-
-
 MergeStatus IRReader::IsBuiltinTypeNodePresent(
     const BuiltinTypeIR *builtin_type, const IRReader &addend,
     AbiElementMap<MergeStatus> *local_to_global_type_id_map) {
@@ -250,7 +240,7 @@
   // Add to faciliate ODR checking.
   const std::string &key = GetODRListMapKey(&(it->second));
   MergeStatus type_merge_status = MergeStatus(true, added_type_id);
-  AddToODRListMap(key, &(it->second));
+  module_->AddToODRListMap(key, &(it->second));
   local_to_global_type_id_map->emplace(addend_node->GetSelfType(),
                                        type_merge_status);
   return {type_merge_status, it};
@@ -580,16 +570,5 @@
 }
 
 
-bool IRReader::IsLinkableMessageInExportedHeaders(
-    const LinkableMessageIR *linkable_message) const {
-  if (module_->exported_headers_ == nullptr ||
-      module_->exported_headers_->empty()) {
-    return true;
-  }
-  return module_->exported_headers_->find(linkable_message->GetSourceFile()) !=
-         module_->exported_headers_->end();
-}
-
-
 }  // namespace repr
 }  // header_checker
diff --git a/vndk/tools/header-checker/src/repr/ir_reader.h b/vndk/tools/header-checker/src/repr/ir_reader.h
index 344927d..21a8f69 100644
--- a/vndk/tools/header-checker/src/repr/ir_reader.h
+++ b/vndk/tools/header-checker/src/repr/ir_reader.h
@@ -86,8 +86,6 @@
                   std::move(addend.module_->qualified_types_));
   }
 
-  void AddToODRListMap(const std::string &key, const TypeIR *value);
-
   template <typename T>
   MergeStatus MergeReferencingTypeInternalAndUpdateParent(
       const IRReader &addend, const T *addend_node,
@@ -206,9 +204,6 @@
                    std::make_move_iterator(addend.end()));
   }
 
-  bool IsLinkableMessageInExportedHeaders(
-      const LinkableMessageIR *linkable_message) const;
-
   std::unique_ptr<ModuleIR> module_;
 
   uint64_t max_type_id_ = 0;
diff --git a/vndk/tools/header-checker/src/repr/ir_representation.cpp b/vndk/tools/header-checker/src/repr/ir_representation.cpp
new file mode 100644
index 0000000..73577af
--- /dev/null
+++ b/vndk/tools/header-checker/src/repr/ir_representation.cpp
@@ -0,0 +1,150 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "repr/ir_representation.h"
+
+#include "repr/ir_reader.h"
+#include "repr/ir_representation_internal.h"
+
+#include <utility>
+
+
+namespace header_checker {
+namespace repr {
+
+
+void ModuleIR::AddFunction(FunctionIR &&function) {
+  if (!IsLinkableMessageInExportedHeaders(&function)) {
+    return;
+  }
+  functions_.insert({function.GetLinkerSetKey(), std::move(function)});
+}
+
+
+void ModuleIR::AddGlobalVariable(GlobalVarIR &&global_var) {
+  if (!IsLinkableMessageInExportedHeaders(&global_var)) {
+    return;
+  }
+  global_variables_.insert(
+      {global_var.GetLinkerSetKey(), std::move(global_var)});
+}
+
+
+void ModuleIR::AddRecordType(RecordTypeIR &&record_type) {
+  if (!IsLinkableMessageInExportedHeaders(&record_type)) {
+    return;
+  }
+  auto it = AddToMapAndTypeGraph(
+      std::move(record_type), &record_types_, &type_graph_);
+  const std::string &key = GetODRListMapKey(&(it->second));
+  AddToODRListMap(key, &(it->second));
+}
+
+
+void ModuleIR::AddFunctionType(FunctionTypeIR &&function_type) {
+  if (!IsLinkableMessageInExportedHeaders(&function_type)) {
+    return;
+  }
+  auto it = AddToMapAndTypeGraph(
+      std::move(function_type), &function_types_, &type_graph_);
+  const std::string &key = GetODRListMapKey(&(it->second));
+  AddToODRListMap(key, &(it->second));
+}
+
+
+void ModuleIR::AddEnumType(EnumTypeIR &&enum_type) {
+  if (!IsLinkableMessageInExportedHeaders(&enum_type)) {
+    return;
+  }
+  auto it = AddToMapAndTypeGraph(
+      std::move(enum_type), &enum_types_, &type_graph_);
+  AddToODRListMap(it->second.GetUniqueId() + it->second.GetSourceFile(),
+                  (&it->second));
+}
+
+
+void ModuleIR::AddLvalueReferenceType(
+    LvalueReferenceTypeIR &&lvalue_reference_type) {
+  if (!IsLinkableMessageInExportedHeaders(&lvalue_reference_type)) {
+    return;
+  }
+  AddToMapAndTypeGraph(std::move(lvalue_reference_type),
+                       &lvalue_reference_types_, &type_graph_);
+}
+
+
+void ModuleIR::AddRvalueReferenceType(
+    RvalueReferenceTypeIR &&rvalue_reference_type) {
+  if (!IsLinkableMessageInExportedHeaders(&rvalue_reference_type)) {
+    return;
+  }
+  AddToMapAndTypeGraph(std::move(rvalue_reference_type),
+                       &rvalue_reference_types_, &type_graph_);
+}
+
+
+void ModuleIR::AddQualifiedType(QualifiedTypeIR &&qualified_type) {
+  if (!IsLinkableMessageInExportedHeaders(&qualified_type)) {
+    return;
+  }
+  AddToMapAndTypeGraph(std::move(qualified_type), &qualified_types_,
+                       &type_graph_);
+}
+
+
+void ModuleIR::AddArrayType(ArrayTypeIR &&array_type) {
+  if (!IsLinkableMessageInExportedHeaders(&array_type)) {
+    return;
+  }
+  AddToMapAndTypeGraph(std::move(array_type), &array_types_, &type_graph_);
+}
+
+
+void ModuleIR::AddPointerType(PointerTypeIR &&pointer_type) {
+  if (!IsLinkableMessageInExportedHeaders(&pointer_type)) {
+    return;
+  }
+  AddToMapAndTypeGraph(std::move(pointer_type), &pointer_types_, &type_graph_);
+}
+
+
+void ModuleIR::AddBuiltinType(BuiltinTypeIR &&builtin_type) {
+  AddToMapAndTypeGraph(std::move(builtin_type), &builtin_types_, &type_graph_);
+}
+
+
+void ModuleIR::AddElfFunction(ElfFunctionIR &&elf_function) {
+  elf_functions_.insert(
+      {elf_function.GetName(), std::move(elf_function)});
+}
+
+
+void ModuleIR::AddElfObject(ElfObjectIR &&elf_object) {
+  elf_objects_.insert(
+      {elf_object.GetName(), std::move(elf_object)});
+}
+
+
+bool ModuleIR::IsLinkableMessageInExportedHeaders(
+    const LinkableMessageIR *linkable_message) const {
+  if (exported_headers_ == nullptr || exported_headers_->empty()) {
+    return true;
+  }
+  return exported_headers_->find(linkable_message->GetSourceFile()) !=
+         exported_headers_->end();
+}
+
+
+}  // namespace repr
+}  // namespace header_checker
diff --git a/vndk/tools/header-checker/src/repr/ir_representation.h b/vndk/tools/header-checker/src/repr/ir_representation.h
index 32ec8b0..5c993ea 100644
--- a/vndk/tools/header-checker/src/repr/ir_representation.h
+++ b/vndk/tools/header-checker/src/repr/ir_representation.h
@@ -840,6 +840,48 @@
     return odr_list_map_;
   }
 
+
+  void AddFunction(FunctionIR &&function);
+
+  void AddGlobalVariable(GlobalVarIR &&global_var);
+
+  void AddRecordType(RecordTypeIR &&record_type);
+
+  void AddFunctionType(FunctionTypeIR &&function_type);
+
+  void AddEnumType(EnumTypeIR &&enum_type);
+
+  void AddLvalueReferenceType(LvalueReferenceTypeIR &&lvalue_reference_type);
+
+  void AddRvalueReferenceType(RvalueReferenceTypeIR &&rvalue_reference_type);
+
+  void AddQualifiedType(QualifiedTypeIR &&qualified_type);
+
+  void AddArrayType(ArrayTypeIR &&array_type);
+
+  void AddPointerType(PointerTypeIR &&pointer_type);
+
+  void AddBuiltinType(BuiltinTypeIR &&builtin_type);
+
+  void AddElfFunction(ElfFunctionIR &&elf_function);
+
+  void AddElfObject(ElfObjectIR &&elf_object);
+
+  void AddToODRListMap(const std::string &key, const TypeIR *value) {
+    auto map_it = odr_list_map_.find(key);
+    if (map_it == odr_list_map_.end()) {
+      odr_list_map_.emplace(key, std::list<const TypeIR *>({value}));
+      return;
+    }
+    odr_list_map_[key].emplace_back(value);
+  }
+
+
+ private:
+  bool IsLinkableMessageInExportedHeaders(
+      const LinkableMessageIR *linkable_message) const;
+
+
  public:
   AbiElementList<RecordTypeIR> record_types_list_;
   AbiElementMap<FunctionIR> functions_;
diff --git a/vndk/tools/header-checker/src/repr/json/ir_reader.cpp b/vndk/tools/header-checker/src/repr/json/ir_reader.cpp
index 3c90bc1..a1d2df7 100644
--- a/vndk/tools/header-checker/src/repr/json/ir_reader.cpp
+++ b/vndk/tools/header-checker/src/repr/json/ir_reader.cpp
@@ -323,11 +323,7 @@
         global_variable.GetString("referenced_type"));
     global_variable_ir.SetLinkerSetKey(
         global_variable.GetString("linker_set_key"));
-    if (!IsLinkableMessageInExportedHeaders(&global_variable_ir)) {
-      continue;
-    }
-    module_->global_variables_.insert(
-        {global_variable_ir.GetLinkerSetKey(), std::move(global_variable_ir)});
+    module_->AddGlobalVariable(std::move(global_variable_ir));
   }
 }
 
@@ -335,11 +331,7 @@
   for (auto &&pointer_type : tu.GetObjects("pointer_types")) {
     PointerTypeIR pointer_type_ir;
     ReadTypeInfo(pointer_type, &pointer_type_ir);
-    if (!IsLinkableMessageInExportedHeaders(&pointer_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(pointer_type_ir), &module_->pointer_types_,
-                         &module_->type_graph_);
+    module_->AddPointerType(std::move(pointer_type_ir));
   }
 }
 
@@ -349,8 +341,7 @@
     ReadTypeInfo(builtin_type, &builtin_type_ir);
     builtin_type_ir.SetSignedness(builtin_type.GetBool("is_unsigned"));
     builtin_type_ir.SetIntegralType(builtin_type.GetBool("is_integral"));
-    AddToMapAndTypeGraph(std::move(builtin_type_ir), &module_->builtin_types_,
-                         &module_->type_graph_);
+    module_->AddBuiltinType(std::move(builtin_type_ir));
   }
 }
 
@@ -362,11 +353,7 @@
     qualified_type_ir.SetVolatility(qualified_type.GetBool("is_volatile"));
     qualified_type_ir.SetRestrictedness(
         qualified_type.GetBool("is_restricted"));
-    if (!IsLinkableMessageInExportedHeaders(&qualified_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(qualified_type_ir),
-                         &module_->qualified_types_, &module_->type_graph_);
+    module_->AddQualifiedType(std::move(qualified_type_ir));
   }
 }
 
@@ -374,11 +361,7 @@
   for (auto &&array_type : tu.GetObjects("array_types")) {
     ArrayTypeIR array_type_ir;
     ReadTypeInfo(array_type, &array_type_ir);
-    if (!IsLinkableMessageInExportedHeaders(&array_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(array_type_ir), &module_->array_types_,
-                         &module_->type_graph_);
+    module_->AddArrayType(std::move(array_type_ir));
   }
 }
 
@@ -386,12 +369,7 @@
   for (auto &&lvalue_reference_type : tu.GetObjects("lvalue_reference_types")) {
     LvalueReferenceTypeIR lvalue_reference_type_ir;
     ReadTypeInfo(lvalue_reference_type, &lvalue_reference_type_ir);
-    if (!IsLinkableMessageInExportedHeaders(&lvalue_reference_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(lvalue_reference_type_ir),
-                         &module_->lvalue_reference_types_,
-                         &module_->type_graph_);
+    module_->AddLvalueReferenceType(std::move(lvalue_reference_type_ir));
   }
 }
 
@@ -399,65 +377,35 @@
   for (auto &&rvalue_reference_type : tu.GetObjects("rvalue_reference_types")) {
     RvalueReferenceTypeIR rvalue_reference_type_ir;
     ReadTypeInfo(rvalue_reference_type, &rvalue_reference_type_ir);
-    if (!IsLinkableMessageInExportedHeaders(&rvalue_reference_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(rvalue_reference_type_ir),
-                         &module_->rvalue_reference_types_,
-                         &module_->type_graph_);
+    module_->AddRvalueReferenceType(std::move(rvalue_reference_type_ir));
   }
 }
 
 void JsonIRReader::ReadFunctions(const JsonObjectRef &tu) {
   for (auto &&function : tu.GetObjects("functions")) {
     FunctionIR function_ir = FunctionJsonToIR(function);
-    if (!IsLinkableMessageInExportedHeaders(&function_ir)) {
-      continue;
-    }
-    module_->functions_.insert(
-        {function_ir.GetLinkerSetKey(), std::move(function_ir)});
+    module_->AddFunction(std::move(function_ir));
   }
 }
 
 void JsonIRReader::ReadRecordTypes(const JsonObjectRef &tu) {
   for (auto &&record_type : tu.GetObjects("record_types")) {
     RecordTypeIR record_type_ir = RecordTypeJsonToIR(record_type);
-    if (!IsLinkableMessageInExportedHeaders(&record_type_ir)) {
-      continue;
-    }
-    auto it = AddToMapAndTypeGraph(std::move(record_type_ir),
-                                   &module_->record_types_,
-                                   &module_->type_graph_);
-    const std::string &key = GetODRListMapKey(&(it->second));
-    AddToODRListMap(key, &(it->second));
+    module_->AddRecordType(std::move(record_type_ir));
   }
 }
 
 void JsonIRReader::ReadFunctionTypes(const JsonObjectRef &tu) {
   for (auto &&function_type : tu.GetObjects("function_types")) {
     FunctionTypeIR function_type_ir = FunctionTypeJsonToIR(function_type);
-    if (!IsLinkableMessageInExportedHeaders(&function_type_ir)) {
-      continue;
-    }
-    auto it = AddToMapAndTypeGraph(std::move(function_type_ir),
-                                   &module_->function_types_,
-                                   &module_->type_graph_);
-    const std::string &key = GetODRListMapKey(&(it->second));
-    AddToODRListMap(key, &(it->second));
+    module_->AddFunctionType(std::move(function_type_ir));
   }
 }
 
 void JsonIRReader::ReadEnumTypes(const JsonObjectRef &tu) {
   for (auto &&enum_type : tu.GetObjects("enum_types")) {
     EnumTypeIR enum_type_ir = EnumTypeJsonToIR(enum_type);
-    if (!IsLinkableMessageInExportedHeaders(&enum_type_ir)) {
-      continue;
-    }
-    auto it = AddToMapAndTypeGraph(std::move(enum_type_ir),
-                                   &module_->enum_types_,
-                                   &module_->type_graph_);
-    AddToODRListMap(it->second.GetUniqueId() + it->second.GetSourceFile(),
-                    (&it->second));
+    module_->AddEnumType(std::move(enum_type_ir));
   }
 }
 
@@ -465,8 +413,7 @@
   for (auto &&elf_function : tu.GetObjects("elf_functions")) {
     ElfFunctionIR elf_function_ir(elf_function.GetString("name"),
                                   GetElfSymbolBinding(elf_function));
-    module_->elf_functions_.insert(
-        {elf_function_ir.GetName(), std::move(elf_function_ir)});
+    module_->AddElfFunction(std::move(elf_function_ir));
   }
 }
 
@@ -474,8 +421,7 @@
   for (auto &&elf_object : tu.GetObjects("elf_objects")) {
     ElfObjectIR elf_object_ir(elf_object.GetString("name"),
                               GetElfSymbolBinding(elf_object));
-    module_->elf_objects_.insert(
-        {elf_object_ir.GetName(), std::move(elf_object_ir)});
+    module_->AddElfObject(std::move(elf_object_ir));
   }
 }
 
diff --git a/vndk/tools/header-checker/src/repr/protobuf/ir_reader.cpp b/vndk/tools/header-checker/src/repr/protobuf/ir_reader.cpp
index 1f92c96..23b250d 100644
--- a/vndk/tools/header-checker/src/repr/protobuf/ir_reader.cpp
+++ b/vndk/tools/header-checker/src/repr/protobuf/ir_reader.cpp
@@ -209,11 +209,7 @@
         global_variable_protobuf.referenced_type());
     global_variable_ir.SetLinkerSetKey(
         global_variable_protobuf.linker_set_key());
-    if (!IsLinkableMessageInExportedHeaders(&global_variable_ir)) {
-      continue;
-    }
-    module_->global_variables_.insert(
-        {global_variable_ir.GetLinkerSetKey(), std::move(global_variable_ir)});
+    module_->AddGlobalVariable(std::move(global_variable_ir));
   }
 }
 
@@ -221,11 +217,7 @@
   for (auto &&pointer_type_protobuf : tu.pointer_types()) {
     PointerTypeIR pointer_type_ir;
     ReadTypeInfo(pointer_type_protobuf.type_info(), &pointer_type_ir);
-    if (!IsLinkableMessageInExportedHeaders(&pointer_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(pointer_type_ir), &module_->pointer_types_,
-                         &module_->type_graph_);
+    module_->AddPointerType(std::move(pointer_type_ir));
   }
 }
 
@@ -235,8 +227,7 @@
     ReadTypeInfo(builtin_type_protobuf.type_info(), &builtin_type_ir);
     builtin_type_ir.SetSignedness(builtin_type_protobuf.is_unsigned());
     builtin_type_ir.SetIntegralType(builtin_type_protobuf.is_integral());
-    AddToMapAndTypeGraph(std::move(builtin_type_ir), &module_->builtin_types_,
-                         &module_->type_graph_);
+    module_->AddBuiltinType(std::move(builtin_type_ir));
   }
 }
 
@@ -248,11 +239,7 @@
     qualified_type_ir.SetVolatility(qualified_type_protobuf.is_volatile());
     qualified_type_ir.SetRestrictedness(
         qualified_type_protobuf.is_restricted());
-    if (!IsLinkableMessageInExportedHeaders(&qualified_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(qualified_type_ir),
-                         &module_->qualified_types_, &module_->type_graph_);
+    module_->AddQualifiedType(std::move(qualified_type_ir));
   }
 }
 
@@ -260,11 +247,7 @@
   for (auto &&array_type_protobuf : tu.array_types()) {
     ArrayTypeIR array_type_ir;
     ReadTypeInfo(array_type_protobuf.type_info(), &array_type_ir);
-    if (!IsLinkableMessageInExportedHeaders(&array_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(array_type_ir), &module_->array_types_,
-                         &module_->type_graph_);
+    module_->AddArrayType(std::move(array_type_ir));
   }
 }
 
@@ -274,12 +257,7 @@
     LvalueReferenceTypeIR lvalue_reference_type_ir;
     ReadTypeInfo(lvalue_reference_type_protobuf.type_info(),
                  &lvalue_reference_type_ir);
-    if (!IsLinkableMessageInExportedHeaders(&lvalue_reference_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(lvalue_reference_type_ir),
-                         &module_->lvalue_reference_types_,
-                         &module_->type_graph_);
+    module_->AddLvalueReferenceType(std::move(lvalue_reference_type_ir));
   }
 }
 
@@ -289,37 +267,21 @@
     RvalueReferenceTypeIR rvalue_reference_type_ir;
     ReadTypeInfo(rvalue_reference_type_protobuf.type_info(),
                  &rvalue_reference_type_ir);
-    if (!IsLinkableMessageInExportedHeaders(&rvalue_reference_type_ir)) {
-      continue;
-    }
-    AddToMapAndTypeGraph(std::move(rvalue_reference_type_ir),
-                         &module_->rvalue_reference_types_,
-                         &module_->type_graph_);
+    module_->AddRvalueReferenceType(std::move(rvalue_reference_type_ir));
   }
 }
 
 void ProtobufIRReader::ReadFunctions(const abi_dump::TranslationUnit &tu) {
   for (auto &&function_protobuf : tu.functions()) {
     FunctionIR function_ir = FunctionProtobufToIR(function_protobuf);
-    if (!IsLinkableMessageInExportedHeaders(&function_ir)) {
-      continue;
-    }
-    module_->functions_.insert(
-        {function_ir.GetLinkerSetKey(), std::move(function_ir)});
+    module_->AddFunction(std::move(function_ir));
   }
 }
 
 void ProtobufIRReader::ReadRecordTypes(const abi_dump::TranslationUnit &tu) {
   for (auto &&record_type_protobuf : tu.record_types()) {
     RecordTypeIR record_type_ir = RecordTypeProtobufToIR(record_type_protobuf);
-    if (!IsLinkableMessageInExportedHeaders(&record_type_ir)) {
-      continue;
-    }
-    auto it = AddToMapAndTypeGraph(std::move(record_type_ir),
-                                   &module_->record_types_,
-                                   &module_->type_graph_);
-    const std::string &key = GetODRListMapKey(&(it->second));
-    AddToODRListMap(key, &(it->second));
+    module_->AddRecordType(std::move(record_type_ir));
   }
 }
 
@@ -327,28 +289,14 @@
   for (auto &&function_type_protobuf : tu.function_types()) {
     FunctionTypeIR function_type_ir =
         FunctionTypeProtobufToIR(function_type_protobuf);
-    if (!IsLinkableMessageInExportedHeaders(&function_type_ir)) {
-      continue;
-    }
-    auto it = AddToMapAndTypeGraph(std::move(function_type_ir),
-                                   &module_->function_types_,
-                                   &module_->type_graph_);
-    const std::string &key = GetODRListMapKey(&(it->second));
-    AddToODRListMap(key, &(it->second));
+    module_->AddFunctionType(std::move(function_type_ir));
   }
 }
 
 void ProtobufIRReader::ReadEnumTypes(const abi_dump::TranslationUnit &tu) {
   for (auto &&enum_type_protobuf : tu.enum_types()) {
     EnumTypeIR enum_type_ir = EnumTypeProtobufToIR(enum_type_protobuf);
-    if (!IsLinkableMessageInExportedHeaders(&enum_type_ir)) {
-      continue;
-    }
-    auto it = AddToMapAndTypeGraph(std::move(enum_type_ir),
-                                   &module_->enum_types_,
-                                   &module_->type_graph_);
-    AddToODRListMap(it->second.GetUniqueId() + it->second.GetSourceFile(),
-                    (&it->second));
+    module_->AddEnumType(std::move(enum_type_ir));
   }
 }
 
@@ -357,8 +305,7 @@
     ElfFunctionIR elf_function_ir(
         elf_function.name(),
         ElfSymbolBindingProtobufToIR(elf_function.binding()));
-    module_->elf_functions_.insert(
-        {elf_function_ir.GetName(), std::move(elf_function_ir)});
+    module_->AddElfFunction(std::move(elf_function_ir));
   }
 }
 
@@ -366,8 +313,7 @@
   for (auto &&elf_object : tu.elf_objects()) {
     ElfObjectIR elf_object_ir(
         elf_object.name(), ElfSymbolBindingProtobufToIR(elf_object.binding()));
-    module_->elf_objects_.insert(
-        {elf_object_ir.GetName(), std::move(elf_object_ir)});
+    module_->AddElfObject(std::move(elf_object_ir));
   }
 }