diff --git a/build/gen.py b/build/gen.py
index 76fddfb..6c7ac3a 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -649,7 +649,6 @@
         'src/gn/group_target_generator.cc',
         'src/gn/header_checker.cc',
         'src/gn/import_manager.cc',
-        'src/gn/inherited_libraries.cc',
         'src/gn/input_conversion.cc',
         'src/gn/input_file.cc',
         'src/gn/input_file_manager.cc',
@@ -778,7 +777,6 @@
         'src/gn/functions_unittest.cc',
         'src/gn/hash_table_base_unittest.cc',
         'src/gn/header_checker_unittest.cc',
-        'src/gn/inherited_libraries_unittest.cc',
         'src/gn/input_conversion_unittest.cc',
         'src/gn/json_project_writer_unittest.cc',
         'src/gn/rust_project_writer_unittest.cc',
diff --git a/src/gn/inherited_libraries.cc b/src/gn/inherited_libraries.cc
deleted file mode 100644
index 977e97d..0000000
--- a/src/gn/inherited_libraries.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "gn/inherited_libraries.h"
-
-#include "gn/target.h"
-
-InheritedLibraries::InheritedLibraries() = default;
-
-InheritedLibraries::~InheritedLibraries() = default;
-
-std::vector<std::pair<const Target*, bool>>
-InheritedLibraries::GetOrderedAndPublicFlag() const {
-  std::vector<std::pair<const Target*, bool>> result;
-  result.reserve(targets_.size());
-  for (size_t i = 0; i < targets_.size(); ++i)
-    result.emplace_back(targets_[i], public_flags_[i]);
-  return result;
-}
-
-void InheritedLibraries::Append(const Target* target, bool is_public) {
-  // Try to insert a new node.
-  auto ret = targets_.PushBackWithIndex(target);
-  if (ret.first) {
-    public_flags_.push_back(is_public);
-  } else if (is_public) {
-    // Target already present, if |is_public|, set its flag.
-    public_flags_[ret.second] = true;
-  }
-}
-
-void InheritedLibraries::AppendInherited(const InheritedLibraries& other,
-                                         bool is_public) {
-  // Append all items in order, mark them public only if the're already public
-  // and we're adding them publicly.
-  for (size_t i = 0; i < other.targets_.size(); ++i) {
-    Append(other.targets_[i], is_public && other.public_flags_[i]);
-  }
-}
-
-void InheritedLibraries::AppendPublicSharedLibraries(
-    const InheritedLibraries& other,
-    bool is_public) {
-  for (size_t i = 0; i < other.targets_.size(); ++i) {
-    const Target* target = other.targets_[i];
-    if (target->output_type() == Target::SHARED_LIBRARY &&
-        other.public_flags_[i]) {
-      Append(target, is_public);
-    }
-  }
-}
diff --git a/src/gn/inherited_libraries.h b/src/gn/inherited_libraries.h
deleted file mode 100644
index 7a3fc25..0000000
--- a/src/gn/inherited_libraries.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef TOOLS_GN_INHERITED_LIBRARIES_H_
-#define TOOLS_GN_INHERITED_LIBRARIES_H_
-
-#include <stddef.h>
-
-#include <utility>
-#include <vector>
-
-#include "gn/unique_vector.h"
-
-class Target;
-
-// Represents an ordered uniquified set of all shared/static libraries for
-// a given target. These are pushed up the dependency tree.
-//
-// Maintaining the order is important so GN links all libraries in the same
-// order specified in the build files.
-//
-// Since this list is uniquified, appending to the list will not actually
-// append a new item if the target already exists. However, the existing one
-// may have its is_public flag updated. "Public" always wins, so is_public will
-// be true if any dependency with that name has been set to public.
-class InheritedLibraries {
- public:
-  InheritedLibraries();
-  ~InheritedLibraries();
-
-  // Returns the list of dependencies in order, optionally with the flag
-  // indicating whether the dependency is public.
-  std::vector<const Target*> GetOrdered() const { return targets_.vector(); }
-  std::vector<std::pair<const Target*, bool>> GetOrderedAndPublicFlag() const;
-
-  // Adds a single dependency to the end of the list. See note on adding above.
-  void Append(const Target* target, bool is_public);
-
-  // Appends all items from the "other" list to the current one. The is_public
-  // parameter indicates how the current target depends on the items in
-  // "other". If is_public is true, the existing public flags of the appended
-  // items will be preserved (propagating the public-ness up the dependency
-  // chain). If is_public is false, all deps will be added as private since
-  // the current target isn't forwarding them.
-  void AppendInherited(const InheritedLibraries& other, bool is_public);
-
-  // Like AppendInherited but only appends the items in "other" that are of
-  // type SHARED_LIBRARY and only when they're marked public. This is used
-  // to push shared libraries up the dependency chain, following only public
-  // deps, to dependent targets that need to use them.
-  void AppendPublicSharedLibraries(const InheritedLibraries& other,
-                                   bool is_public);
-
- private:
-  UniqueVector<const Target*> targets_;
-  std::vector<bool> public_flags_;
-
-  InheritedLibraries(const InheritedLibraries&) = delete;
-  InheritedLibraries& operator=(const InheritedLibraries&) = delete;
-};
-
-#endif  // TOOLS_GN_INHERITED_LIBRARIES_H_
diff --git a/src/gn/inherited_libraries_unittest.cc b/src/gn/inherited_libraries_unittest.cc
deleted file mode 100644
index bd77426..0000000
--- a/src/gn/inherited_libraries_unittest.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "gn/inherited_libraries.h"
-#include "gn/target.h"
-#include "gn/test_with_scope.h"
-#include "util/test/test.h"
-
-namespace {
-
-// In these tests, Pair can't be used conveniently because the
-// "const" won't be inferred and the types won't match. This helper makes the
-// right type of pair with the const Target.
-std::pair<const Target*, bool> Pair(const Target* t, bool b) {
-  return std::pair<const Target*, bool>(t, b);
-}
-
-}  // namespace
-
-TEST(InheritedLibraries, Unique) {
-  TestWithScope setup;
-
-  Target a(setup.settings(), Label(SourceDir("//foo/"), "a"));
-  Target b(setup.settings(), Label(SourceDir("//foo/"), "b"));
-
-  // Setup, add the two targets as private.
-  InheritedLibraries libs;
-  libs.Append(&a, false);
-  libs.Append(&b, false);
-  auto result = libs.GetOrderedAndPublicFlag();
-  ASSERT_EQ(2u, result.size());
-  EXPECT_EQ(Pair(&a, false), result[0]);
-  EXPECT_EQ(Pair(&b, false), result[1]);
-
-  // Add again as private, this should be a NOP.
-  libs.Append(&a, false);
-  libs.Append(&b, false);
-  result = libs.GetOrderedAndPublicFlag();
-  ASSERT_EQ(2u, result.size());
-  EXPECT_EQ(Pair(&a, false), result[0]);
-  EXPECT_EQ(Pair(&b, false), result[1]);
-
-  // Add as public, this should make both public.
-  libs.Append(&a, true);
-  libs.Append(&b, true);
-  result = libs.GetOrderedAndPublicFlag();
-  ASSERT_EQ(2u, result.size());
-  EXPECT_EQ(Pair(&a, true), result[0]);
-  EXPECT_EQ(Pair(&b, true), result[1]);
-
-  // Add again private, they should stay public.
-  libs.Append(&a, false);
-  libs.Append(&b, false);
-  result = libs.GetOrderedAndPublicFlag();
-  ASSERT_EQ(2u, result.size());
-  EXPECT_EQ(Pair(&a, true), result[0]);
-  EXPECT_EQ(Pair(&b, true), result[1]);
-}
-
-TEST(InheritedLibraries, AppendInherited) {
-  TestWithScope setup;
-
-  Target a(setup.settings(), Label(SourceDir("//foo/"), "a"));
-  Target b(setup.settings(), Label(SourceDir("//foo/"), "b"));
-  Target w(setup.settings(), Label(SourceDir("//foo/"), "w"));
-  Target x(setup.settings(), Label(SourceDir("//foo/"), "x"));
-  Target y(setup.settings(), Label(SourceDir("//foo/"), "y"));
-  Target z(setup.settings(), Label(SourceDir("//foo/"), "z"));
-
-  InheritedLibraries libs;
-  libs.Append(&a, false);
-  libs.Append(&b, false);
-
-  // Appending these things with private inheritance should make them private,
-  // no matter how they're listed in the appended class.
-  InheritedLibraries append_private;
-  append_private.Append(&a, true);
-  append_private.Append(&b, false);
-  append_private.Append(&w, true);
-  append_private.Append(&x, false);
-  libs.AppendInherited(append_private, false);
-
-  auto result = libs.GetOrderedAndPublicFlag();
-  ASSERT_EQ(4u, result.size());
-  EXPECT_EQ(Pair(&a, false), result[0]);
-  EXPECT_EQ(Pair(&b, false), result[1]);
-  EXPECT_EQ(Pair(&w, false), result[2]);
-  EXPECT_EQ(Pair(&x, false), result[3]);
-
-  // Appending these things with public inheritance should convert them.
-  InheritedLibraries append_public;
-  append_public.Append(&a, true);
-  append_public.Append(&b, false);
-  append_public.Append(&y, true);
-  append_public.Append(&z, false);
-  libs.AppendInherited(append_public, true);
-
-  result = libs.GetOrderedAndPublicFlag();
-  ASSERT_EQ(6u, result.size());
-  EXPECT_EQ(Pair(&a, true), result[0]);  // Converted to public.
-  EXPECT_EQ(Pair(&b, false), result[1]);
-  EXPECT_EQ(Pair(&w, false), result[2]);
-  EXPECT_EQ(Pair(&x, false), result[3]);
-  EXPECT_EQ(Pair(&y, true), result[4]);  // Appended as public.
-  EXPECT_EQ(Pair(&z, false), result[5]);
-}
-
-TEST(InheritedLibraries, AppendPublicSharedLibraries) {
-  TestWithScope setup;
-  InheritedLibraries append;
-
-  // Two source sets.
-  Target set_pub(setup.settings(), Label(SourceDir("//foo/"), "set_pub"));
-  set_pub.set_output_type(Target::SOURCE_SET);
-  append.Append(&set_pub, true);
-  Target set_priv(setup.settings(), Label(SourceDir("//foo/"), "set_priv"));
-  set_priv.set_output_type(Target::SOURCE_SET);
-  append.Append(&set_priv, false);
-
-  // Two shared libraries.
-  Target sh_pub(setup.settings(), Label(SourceDir("//foo/"), "sh_pub"));
-  sh_pub.set_output_type(Target::SHARED_LIBRARY);
-  append.Append(&sh_pub, true);
-  Target sh_priv(setup.settings(), Label(SourceDir("//foo/"), "sh_priv"));
-  sh_priv.set_output_type(Target::SHARED_LIBRARY);
-  append.Append(&sh_priv, false);
-
-  InheritedLibraries libs;
-  libs.AppendPublicSharedLibraries(append, true);
-
-  auto result = libs.GetOrderedAndPublicFlag();
-  ASSERT_EQ(1u, result.size());
-  EXPECT_EQ(Pair(&sh_pub, true), result[0]);
-}
