diff --git a/tools/gn/BUILD.gn b/tools/gn/BUILD.gn
index 198bf8d..a655a43 100644
--- a/tools/gn/BUILD.gn
+++ b/tools/gn/BUILD.gn
@@ -312,13 +312,3 @@
     "//testing/gtest",
   ]
 }
-
-executable("generate_test_gn_data") {
-  sources = [
-    "generate_test_gn_data.cc",
-  ]
-  deps = [
-    "//base",
-    "//build/config/sanitizers:deps",
-  ]
-}
diff --git a/tools/gn/bootstrap/bootstrap.py b/tools/gn/bootstrap/bootstrap.py
index cd72fe7..ddabe31 100755
--- a/tools/gn/bootstrap/bootstrap.py
+++ b/tools/gn/bootstrap/bootstrap.py
@@ -152,7 +152,7 @@
       continue
     if name.endswith('_unittest.cc'):
       continue
-    if name in ['generate_test_gn_data.cc', 'run_all_unittests.cc']:
+    if name == 'run_all_unittests.cc':
       continue
     full_path = os.path.join(GN_ROOT, name)
     static_libraries['gn']['sources'].append(
diff --git a/tools/gn/generate_test_gn_data.cc b/tools/gn/generate_test_gn_data.cc
deleted file mode 100644
index f80a4c2..0000000
--- a/tools/gn/generate_test_gn_data.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (c) 2013 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 <stddef.h>
-
-#include <fstream>
-#include <iostream>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-
-// Usage: just run in the directory where you want your test source root to be.
-
-int files_written = 0;
-int targets_written = 0;
-
-base::FilePath UTF8ToFilePath(const std::string& s) {
-return base::FilePath::FromUTF8Unsafe(s);
-}
-
-std::string FilePathToUTF8(const base::FilePath& path) {
-#if defined(OS_WIN)
-  return base::WideToUTF8(path.value());
-#else
-  return path.value();
-#endif
-}
-
-base::FilePath RepoPathToPathName(const std::vector<int>& repo_path) {
-  base::FilePath ret;
-  for (const auto& elem : repo_path) {
-    ret = ret.Append(UTF8ToFilePath(base::IntToString(elem)));
-  }
-  return ret;
-}
-
-std::string TargetIndexToLetter(int target_index) {
-  char ret[2];
-  ret[0] = static_cast<char>('a' + target_index);
-  ret[1] = 0;
-  return ret;
-}
-
-std::string RepoPathToTargetName(const std::vector<int>& repo_path,
-                                 int target_index) {
-  std::string ret;
-  for (size_t i = 0; i < repo_path.size(); i++) {
-    if (i != 0)
-      ret.push_back('_');
-    ret.append(base::IntToString(repo_path[i]));
-  }
-  ret += TargetIndexToLetter(target_index);
-  return ret;
-}
-
-std::string RepoPathToFullTargetName(const std::vector<int>& repo_path,
-                                 int target_index) {
-  std::string ret;
-  for (const auto& elem : repo_path) {
-    ret.push_back('/');
-    ret.append(base::IntToString(elem));
-  }
-
-  ret += ":" + RepoPathToTargetName(repo_path, target_index);
-  return ret;
-}
-
-void WriteLevel(const std::vector<int>& repo_path,
-                int spread,
-                int max_depth,
-                int targets_per_level,
-                int files_per_target) {
-  base::FilePath dirname = RepoPathToPathName(repo_path);
-  base::FilePath filename = dirname.AppendASCII("BUILD.gn");
-  std::cout << "Writing " << FilePathToUTF8(filename) << "\n";
-
-  // Don't keep the file open while recursing.
-  {
-    base::CreateDirectory(dirname);
-
-    std::ofstream file;
-    file.open(FilePathToUTF8(filename).c_str(),
-              std::ios_base::out | std::ios_base::binary);
-    files_written++;
-
-    for (int i = 0; i < targets_per_level; i++) {
-      targets_written++;
-      file << "executable(\"" << RepoPathToTargetName(repo_path, i)
-           << "\") {\n";
-      file << "  sources = [\n";
-      for (int f = 0; f < files_per_target; f++)
-        file << "    \"" << base::IntToString(f) << ".cc\",\n";
-
-      if (repo_path.size() < (size_t)max_depth) {
-        file << "  ]\n";
-        file << "  deps = [\n";
-        for (int d = 0; d < spread; d++) {
-          std::vector<int> cur = repo_path;
-          cur.push_back(d);
-          for (int t = 0; t < targets_per_level; t++)
-            file << "    \"" << RepoPathToFullTargetName(cur, t) << "\",\n";
-        }
-      }
-      file << "  ]\n}\n\n";
-    }
-  }
-  if (repo_path.size() < (size_t)max_depth) {
-    // Recursively generate subdirs.
-    for (int i = 0; i < spread; i++) {
-      std::vector<int> cur = repo_path;
-      cur.push_back(i);
-      WriteLevel(cur, spread, max_depth, targets_per_level, files_per_target);
-    }
-  }
-}
-
-int main() {
-  WriteLevel(std::vector<int>(), 5, 4, 3, 50);  // 781 files, 2343 targets
-  //WriteLevel(std::vector<int>(), 6, 4, 2, 50);
-  std::cout << "Wrote " << files_written << " files and "
-            << targets_written << " targets.\n";
-  return 0;
-}
diff --git a/tools/gn/gn.gyp b/tools/gn/gn.gyp
index 524e1cd..ade8d3a 100644
--- a/tools/gn/gn.gyp
+++ b/tools/gn/gn.gyp
@@ -267,16 +267,6 @@
         '../../testing/gtest.gyp:gtest',
       ],
     },
-    {
-      'target_name': 'generate_test_gn_data',
-      'type': 'executable',
-      'sources': [
-        'generate_test_gn_data.cc',
-      ],
-      'dependencies': [
-        '../../base/base.gyp:base',
-      ],
-    }
   ],
   'conditions': [
     ['test_isolation_mode != "noop"', {
