tp: don't ship actual chain implementations in export_json target

export_json doesn't use any of the filtering logic so simply ship a
dummy chain for it to reduce binary size.

Change-Id: I6391820ee0d40b27f8b97c63a22ced985aad7011
diff --git a/Android.bp b/Android.bp
index 9650218..73487c9 100644
--- a/Android.bp
+++ b/Android.bp
@@ -2323,10 +2323,10 @@
         ":perfetto_src_shared_lib_test_utils",
         ":perfetto_src_trace_processor_containers_containers",
         ":perfetto_src_trace_processor_db_column_column",
-        ":perfetto_src_trace_processor_db_column_minimal",
+        ":perfetto_src_trace_processor_db_column_make_chain",
         ":perfetto_src_trace_processor_db_db",
         ":perfetto_src_trace_processor_db_minimal",
-        ":perfetto_src_trace_processor_export_json",
+        ":perfetto_src_trace_processor_export_json_sources",
         ":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
         ":perfetto_src_trace_processor_importers_common_common",
         ":perfetto_src_trace_processor_importers_common_parser_types",
@@ -10933,10 +10933,15 @@
 filegroup {
     name: "perfetto_src_trace_processor_db_column_column",
     srcs: [
+        "src/trace_processor/db/column/arrangement_overlay.cc",
+        "src/trace_processor/db/column/data_layer.cc",
         "src/trace_processor/db/column/dense_null_overlay.cc",
+        "src/trace_processor/db/column/dummy_storage.cc",
         "src/trace_processor/db/column/id_storage.cc",
         "src/trace_processor/db/column/null_overlay.cc",
         "src/trace_processor/db/column/numeric_storage.cc",
+        "src/trace_processor/db/column/range_overlay.cc",
+        "src/trace_processor/db/column/selector_overlay.cc",
         "src/trace_processor/db/column/set_id_storage.cc",
         "src/trace_processor/db/column/string_storage.cc",
         "src/trace_processor/db/column/utils.cc",
@@ -10951,15 +10956,11 @@
     ],
 }
 
-// GN: //src/trace_processor/db/column:minimal
+// GN: //src/trace_processor/db/column:make_chain
 filegroup {
-    name: "perfetto_src_trace_processor_db_column_minimal",
+    name: "perfetto_src_trace_processor_db_column_make_chain",
     srcs: [
-        "src/trace_processor/db/column/arrangement_overlay.cc",
-        "src/trace_processor/db/column/data_layer.cc",
-        "src/trace_processor/db/column/dummy_storage.cc",
-        "src/trace_processor/db/column/range_overlay.cc",
-        "src/trace_processor/db/column/selector_overlay.cc",
+        "src/trace_processor/db/column/make_chain.cc",
     ],
 }
 
@@ -11031,9 +11032,9 @@
     ],
 }
 
-// GN: //src/trace_processor:export_json
+// GN: //src/trace_processor:export_json_sources
 filegroup {
-    name: "perfetto_src_trace_processor_export_json",
+    name: "perfetto_src_trace_processor_export_json_sources",
     srcs: [
         "src/trace_processor/export_json.cc",
     ],
@@ -13810,13 +13811,13 @@
         ":perfetto_src_trace_processor_containers_unittests",
         ":perfetto_src_trace_processor_db_column_column",
         ":perfetto_src_trace_processor_db_column_fake_storage",
-        ":perfetto_src_trace_processor_db_column_minimal",
+        ":perfetto_src_trace_processor_db_column_make_chain",
         ":perfetto_src_trace_processor_db_column_unittests",
         ":perfetto_src_trace_processor_db_compare",
         ":perfetto_src_trace_processor_db_db",
         ":perfetto_src_trace_processor_db_minimal",
         ":perfetto_src_trace_processor_db_unittests",
-        ":perfetto_src_trace_processor_export_json",
+        ":perfetto_src_trace_processor_export_json_sources",
         ":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
         ":perfetto_src_trace_processor_importers_android_bugreport_unittests",
         ":perfetto_src_trace_processor_importers_common_common",
@@ -14531,10 +14532,10 @@
         ":perfetto_src_protozero_protozero",
         ":perfetto_src_trace_processor_containers_containers",
         ":perfetto_src_trace_processor_db_column_column",
-        ":perfetto_src_trace_processor_db_column_minimal",
+        ":perfetto_src_trace_processor_db_column_make_chain",
         ":perfetto_src_trace_processor_db_db",
         ":perfetto_src_trace_processor_db_minimal",
-        ":perfetto_src_trace_processor_export_json",
+        ":perfetto_src_trace_processor_export_json_sources",
         ":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
         ":perfetto_src_trace_processor_importers_common_common",
         ":perfetto_src_trace_processor_importers_common_parser_types",
@@ -14768,10 +14769,10 @@
         ":perfetto_src_protozero_protozero",
         ":perfetto_src_trace_processor_containers_containers",
         ":perfetto_src_trace_processor_db_column_column",
-        ":perfetto_src_trace_processor_db_column_minimal",
+        ":perfetto_src_trace_processor_db_column_make_chain",
         ":perfetto_src_trace_processor_db_db",
         ":perfetto_src_trace_processor_db_minimal",
-        ":perfetto_src_trace_processor_export_json",
+        ":perfetto_src_trace_processor_export_json_sources",
         ":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
         ":perfetto_src_trace_processor_importers_common_common",
         ":perfetto_src_trace_processor_importers_common_parser_types",
diff --git a/BUILD b/BUILD
index c3bddeb..a60811a 100644
--- a/BUILD
+++ b/BUILD
@@ -217,10 +217,10 @@
         ":src_kernel_utils_syscall_table",
         ":src_protozero_proto_ring_buffer",
         ":src_trace_processor_db_column_column",
-        ":src_trace_processor_db_column_minimal",
+        ":src_trace_processor_db_column_make_chain",
         ":src_trace_processor_db_db",
         ":src_trace_processor_db_minimal",
-        ":src_trace_processor_export_json",
+        ":src_trace_processor_export_json_sources",
         ":src_trace_processor_importers_android_bugreport_android_bugreport",
         ":src_trace_processor_importers_common_common",
         ":src_trace_processor_importers_common_parser_types",
@@ -1375,38 +1375,39 @@
 perfetto_filegroup(
     name = "src_trace_processor_db_column_column",
     srcs = [
+        "src/trace_processor/db/column/arrangement_overlay.cc",
+        "src/trace_processor/db/column/arrangement_overlay.h",
+        "src/trace_processor/db/column/data_layer.cc",
+        "src/trace_processor/db/column/data_layer.h",
         "src/trace_processor/db/column/dense_null_overlay.cc",
         "src/trace_processor/db/column/dense_null_overlay.h",
+        "src/trace_processor/db/column/dummy_storage.cc",
+        "src/trace_processor/db/column/dummy_storage.h",
         "src/trace_processor/db/column/id_storage.cc",
         "src/trace_processor/db/column/id_storage.h",
         "src/trace_processor/db/column/null_overlay.cc",
         "src/trace_processor/db/column/null_overlay.h",
         "src/trace_processor/db/column/numeric_storage.cc",
         "src/trace_processor/db/column/numeric_storage.h",
+        "src/trace_processor/db/column/range_overlay.cc",
+        "src/trace_processor/db/column/range_overlay.h",
+        "src/trace_processor/db/column/selector_overlay.cc",
+        "src/trace_processor/db/column/selector_overlay.h",
         "src/trace_processor/db/column/set_id_storage.cc",
         "src/trace_processor/db/column/set_id_storage.h",
         "src/trace_processor/db/column/string_storage.cc",
         "src/trace_processor/db/column/string_storage.h",
+        "src/trace_processor/db/column/types.h",
         "src/trace_processor/db/column/utils.cc",
         "src/trace_processor/db/column/utils.h",
     ],
 )
 
-# GN target: //src/trace_processor/db/column:minimal
+# GN target: //src/trace_processor/db/column:make_chain
 perfetto_filegroup(
-    name = "src_trace_processor_db_column_minimal",
+    name = "src_trace_processor_db_column_make_chain",
     srcs = [
-        "src/trace_processor/db/column/arrangement_overlay.cc",
-        "src/trace_processor/db/column/arrangement_overlay.h",
-        "src/trace_processor/db/column/data_layer.cc",
-        "src/trace_processor/db/column/data_layer.h",
-        "src/trace_processor/db/column/dummy_storage.cc",
-        "src/trace_processor/db/column/dummy_storage.h",
-        "src/trace_processor/db/column/range_overlay.cc",
-        "src/trace_processor/db/column/range_overlay.h",
-        "src/trace_processor/db/column/selector_overlay.cc",
-        "src/trace_processor/db/column/selector_overlay.h",
-        "src/trace_processor/db/column/types.h",
+        "src/trace_processor/db/column/make_chain.cc",
     ],
 )
 
@@ -2838,9 +2839,9 @@
     linkstatic = True,
 )
 
-# GN target: //src/trace_processor:export_json
+# GN target: //src/trace_processor:export_json_sources
 perfetto_filegroup(
-    name = "src_trace_processor_export_json",
+    name = "src_trace_processor_export_json_sources",
     srcs = [
         "src/trace_processor/export_json.cc",
         "src/trace_processor/export_json.h",
@@ -5552,10 +5553,10 @@
     srcs = [
         ":src_kernel_utils_syscall_table",
         ":src_trace_processor_db_column_column",
-        ":src_trace_processor_db_column_minimal",
+        ":src_trace_processor_db_column_make_chain",
         ":src_trace_processor_db_db",
         ":src_trace_processor_db_minimal",
-        ":src_trace_processor_export_json",
+        ":src_trace_processor_export_json_sources",
         ":src_trace_processor_importers_android_bugreport_android_bugreport",
         ":src_trace_processor_importers_common_common",
         ":src_trace_processor_importers_common_parser_types",
@@ -5720,10 +5721,10 @@
         ":src_profiling_symbolizer_symbolizer",
         ":src_protozero_proto_ring_buffer",
         ":src_trace_processor_db_column_column",
-        ":src_trace_processor_db_column_minimal",
+        ":src_trace_processor_db_column_make_chain",
         ":src_trace_processor_db_db",
         ":src_trace_processor_db_minimal",
-        ":src_trace_processor_export_json",
+        ":src_trace_processor_export_json_sources",
         ":src_trace_processor_importers_android_bugreport_android_bugreport",
         ":src_trace_processor_importers_common_common",
         ":src_trace_processor_importers_common_parser_types",
@@ -5946,10 +5947,10 @@
         ":src_profiling_symbolizer_symbolizer",
         ":src_protozero_proto_ring_buffer",
         ":src_trace_processor_db_column_column",
-        ":src_trace_processor_db_column_minimal",
+        ":src_trace_processor_db_column_make_chain",
         ":src_trace_processor_db_db",
         ":src_trace_processor_db_minimal",
-        ":src_trace_processor_export_json",
+        ":src_trace_processor_export_json_sources",
         ":src_trace_processor_importers_android_bugreport_android_bugreport",
         ":src_trace_processor_importers_common_common",
         ":src_trace_processor_importers_common_parser_types",
diff --git a/gn/standalone/BUILD.gn b/gn/standalone/BUILD.gn
index 1fb8196..c397d5c 100644
--- a/gn/standalone/BUILD.gn
+++ b/gn/standalone/BUILD.gn
@@ -65,7 +65,10 @@
   # Disable variadic macro warning as we make extensive use of them in trace
   # processor and client API.
   if (is_clang) {
-    if (!is_fuzzer) {
+    # Only enable -Weverything on hermetic clang as system clang might be quite
+    # out of date.
+    if (is_hermetic_clang && current_toolchain == host_toolchain &&
+        !is_fuzzer) {
       # Disable Weverything on fuzzers to avoid breakages when new versions of
       # clang are rolled into OSS-fuzz.
       cflags += [ "-Weverything" ]
diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn
index c20ba5e..dab8c3f 100644
--- a/src/trace_processor/BUILD.gn
+++ b/src/trace_processor/BUILD.gn
@@ -43,6 +43,18 @@
   }
 }
 
+# Depended upon by Chrome to do proto -> JSON conversion of traces.
+# Must be small binary size as all code here needs to be shipped in
+# Chrome.
+static_library("export_json") {
+  deps = [
+    ":export_json_sources",
+    "../../gn:default_deps",
+    "db/column:make_chain_minimal",
+  ]
+  public_deps = [ "../../include/perfetto/ext/trace_processor:export_json" ]
+}
+
 source_set("metatrace") {
   sources = [
     "tp_metatrace.cc",
@@ -117,7 +129,7 @@
   public_deps = [ "../../include/perfetto/trace_processor:storage" ]
 }
 
-source_set("export_json") {
+source_set("export_json_sources") {
   sources = [
     "export_json.cc",
     "export_json.h",
@@ -125,12 +137,12 @@
   deps = [
     ":storage_minimal",
     "../../gn:default_deps",
+    "../../include/perfetto/ext/trace_processor:export_json",
     "../base",
     "importers/json:minimal",
     "storage",
     "types",
   ]
-  public_deps = [ "../../include/perfetto/ext/trace_processor:export_json" ]
 }
 
 if (enable_perfetto_trace_processor_sqlite) {
@@ -156,6 +168,7 @@
       "../base",
       "../protozero",
       "db",
+      "db/column:make_chain",
       "importers/android_bugreport",
       "importers/common",
       "importers/etw:full",
@@ -249,8 +262,9 @@
     # windows.
     sources += [ "export_json_unittest.cc" ]
     deps += [
-      ":export_json",
+      ":export_json_sources",
       "../../gn:jsoncpp",
+      "../../include/perfetto/ext/trace_processor:export_json",
       "containers",
       "importers/common",
       "importers/proto:minimal",
@@ -350,5 +364,6 @@
     ":storage_minimal",
     "../../gn:default_deps",
     "../base",
+    "db/column:make_chain_minimal",
   ]
 }
diff --git a/src/trace_processor/db/BUILD.gn b/src/trace_processor/db/BUILD.gn
index 38664b3..cbd4304 100644
--- a/src/trace_processor/db/BUILD.gn
+++ b/src/trace_processor/db/BUILD.gn
@@ -39,7 +39,7 @@
     "../util:glob",
     "../util:regex",
     "../util:util",
-    "column:minimal",
+    "column",
   ]
 }
 
diff --git a/src/trace_processor/db/column/BUILD.gn b/src/trace_processor/db/column/BUILD.gn
index bdca5e9..786fb91 100644
--- a/src/trace_processor/db/column/BUILD.gn
+++ b/src/trace_processor/db/column/BUILD.gn
@@ -14,44 +14,31 @@
 
 import("../../../../gn/test.gni")
 
-source_set("minimal") {
+source_set("column") {
   sources = [
     "arrangement_overlay.cc",
     "arrangement_overlay.h",
     "data_layer.cc",
     "data_layer.h",
-    "dummy_storage.cc",
-    "dummy_storage.h",
-    "range_overlay.cc",
-    "range_overlay.h",
-    "selector_overlay.cc",
-    "selector_overlay.h",
-    "types.h",
-  ]
-  deps = [
-    "../..:metatrace",
-    "../../../../gn:default_deps",
-    "../../../../include/perfetto/trace_processor",
-    "../../../../include/perfetto/trace_processor:basic_types",
-    "../../../../protos/perfetto/trace_processor:zero",
-    "../../containers",
-  ]
-}
-
-source_set("column") {
-  sources = [
     "dense_null_overlay.cc",
     "dense_null_overlay.h",
+    "dummy_storage.cc",
+    "dummy_storage.h",
     "id_storage.cc",
     "id_storage.h",
     "null_overlay.cc",
     "null_overlay.h",
     "numeric_storage.cc",
     "numeric_storage.h",
+    "range_overlay.cc",
+    "range_overlay.h",
+    "selector_overlay.cc",
+    "selector_overlay.h",
     "set_id_storage.cc",
     "set_id_storage.h",
     "string_storage.cc",
     "string_storage.h",
+    "types.h",
     "utils.cc",
     "utils.h",
   ]
@@ -66,7 +53,22 @@
     "../../util:glob",
     "../../util:regex",
   ]
-  public_deps = [ ":minimal" ]
+}
+
+source_set("make_chain_minimal") {
+  sources = [ "make_chain_minimal.cc" ]
+  deps = [
+    ":column",
+    "../../../../gn:default_deps",
+  ]
+}
+
+source_set("make_chain") {
+  sources = [ "make_chain.cc" ]
+  deps = [
+    ":column",
+    "../../../../gn:default_deps",
+  ]
 }
 
 perfetto_unittest_source_set("fake_storage") {
diff --git a/src/trace_processor/db/column/arrangement_overlay.cc b/src/trace_processor/db/column/arrangement_overlay.cc
index 4ad4184..7325689 100644
--- a/src/trace_processor/db/column/arrangement_overlay.cc
+++ b/src/trace_processor/db/column/arrangement_overlay.cc
@@ -38,14 +38,6 @@
                                        Indices::State arrangement_state)
     : arrangement_(arrangement), arrangement_state_(arrangement_state) {}
 
-std::unique_ptr<DataLayerChain> ArrangementOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner,
-    ChainCreationArgs args) {
-  return std::make_unique<ChainImpl>(std::move(inner), arrangement_,
-                                     arrangement_state_,
-                                     args.does_layer_order_chain_contents);
-}
-
 ArrangementOverlay::ChainImpl::ChainImpl(
     std::unique_ptr<DataLayerChain> inner,
     const std::vector<uint32_t>* arrangement,
diff --git a/src/trace_processor/db/column/dense_null_overlay.cc b/src/trace_processor/db/column/dense_null_overlay.cc
index fb51bb5..fcd22bb 100644
--- a/src/trace_processor/db/column/dense_null_overlay.cc
+++ b/src/trace_processor/db/column/dense_null_overlay.cc
@@ -37,12 +37,6 @@
 DenseNullOverlay::DenseNullOverlay(const BitVector* non_null)
     : non_null_(non_null) {}
 
-std::unique_ptr<DataLayerChain> DenseNullOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner,
-    ChainCreationArgs) {
-  return std::make_unique<ChainImpl>(std::move(inner), non_null_);
-}
-
 DenseNullOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> inner,
                                        const BitVector* non_null)
     : inner_(std::move(inner)), non_null_(non_null) {}
diff --git a/src/trace_processor/db/column/dummy_storage.cc b/src/trace_processor/db/column/dummy_storage.cc
index 519aa61..71a3a5c 100644
--- a/src/trace_processor/db/column/dummy_storage.cc
+++ b/src/trace_processor/db/column/dummy_storage.cc
@@ -26,10 +26,6 @@
 
 namespace perfetto::trace_processor::column {
 
-std::unique_ptr<DataLayerChain> DummyStorage::MakeChain() {
-  return std::make_unique<ChainImpl>();
-}
-
 SingleSearchResult DummyStorage::ChainImpl::SingleSearch(FilterOp,
                                                          SqlValue,
                                                          uint32_t) const {
diff --git a/src/trace_processor/db/column/dummy_storage.h b/src/trace_processor/db/column/dummy_storage.h
index a9bbc5b..b723c2e 100644
--- a/src/trace_processor/db/column/dummy_storage.h
+++ b/src/trace_processor/db/column/dummy_storage.h
@@ -30,9 +30,6 @@
 // on them.
 class DummyStorage final : public DataLayer {
  public:
-  std::unique_ptr<DataLayerChain> MakeChain() override;
-
- private:
   class ChainImpl : public DataLayerChain {
    public:
     ChainImpl() = default;
@@ -64,6 +61,7 @@
 
     std::string DebugString() const override { return "DummyStorage"; }
   };
+  std::unique_ptr<DataLayerChain> MakeChain() override;
 };
 
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/id_storage.cc b/src/trace_processor/db/column/id_storage.cc
index bf8fd41..6fdb800 100644
--- a/src/trace_processor/db/column/id_storage.cc
+++ b/src/trace_processor/db/column/id_storage.cc
@@ -151,10 +151,6 @@
   return SearchValidationResult::kOk;
 }
 
-std::unique_ptr<DataLayerChain> IdStorage::MakeChain() {
-  return std::make_unique<ChainImpl>();
-}
-
 SingleSearchResult IdStorage::ChainImpl::SingleSearch(FilterOp op,
                                                       SqlValue sql_val,
                                                       uint32_t index) const {
diff --git a/src/trace_processor/db/column/make_chain.cc b/src/trace_processor/db/column/make_chain.cc
new file mode 100644
index 0000000..15ee387
--- /dev/null
+++ b/src/trace_processor/db/column/make_chain.cc
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2024 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 <memory>
+#include <utility>
+
+#include "src/trace_processor/db/column/arrangement_overlay.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/dense_null_overlay.h"
+#include "src/trace_processor/db/column/dummy_storage.h"
+#include "src/trace_processor/db/column/id_storage.h"
+#include "src/trace_processor/db/column/null_overlay.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
+#include "src/trace_processor/db/column/range_overlay.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
+#include "src/trace_processor/db/column/set_id_storage.h"
+#include "src/trace_processor/db/column/string_storage.h"
+
+// This file contains the implementation of MakeChain for all the
+// DataLayer implementations. They are all centralised here because
+// there is an alternative set of implementations (see make_chain_minimal.cc)
+// the "minimal" target used by export_json in Chrome.
+
+namespace perfetto::trace_processor::column {
+
+std::unique_ptr<DataLayerChain> ArrangementOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs args) {
+  return std::make_unique<ChainImpl>(std::move(inner), arrangement_,
+                                     arrangement_state_,
+                                     args.does_layer_order_chain_contents);
+}
+
+std::unique_ptr<DataLayerChain> DenseNullOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs) {
+  return std::make_unique<ChainImpl>(std::move(inner), non_null_);
+}
+
+std::unique_ptr<DataLayerChain> DummyStorage::MakeChain() {
+  return std::make_unique<ChainImpl>();
+}
+
+std::unique_ptr<DataLayerChain> IdStorage::MakeChain() {
+  return std::make_unique<ChainImpl>();
+}
+
+std::unique_ptr<DataLayerChain> NullOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs) {
+  return std::make_unique<ChainImpl>(std::move(inner), non_null_);
+}
+
+template <typename T>
+std::unique_ptr<DataLayerChain> NumericStorage<T>::MakeChain() {
+  return std::make_unique<ChainImpl>(vector_, storage_type_, is_sorted_);
+}
+template std::unique_ptr<DataLayerChain> NumericStorage<double>::MakeChain();
+template std::unique_ptr<DataLayerChain> NumericStorage<uint32_t>::MakeChain();
+template std::unique_ptr<DataLayerChain> NumericStorage<int32_t>::MakeChain();
+template std::unique_ptr<DataLayerChain> NumericStorage<int64_t>::MakeChain();
+
+std::unique_ptr<DataLayerChain> RangeOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs) {
+  return std::make_unique<ChainImpl>(std::move(inner), range_);
+}
+
+std::unique_ptr<DataLayerChain> SelectorOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs) {
+  return std::make_unique<ChainImpl>(std::move(inner), selector_);
+}
+
+std::unique_ptr<DataLayerChain> SetIdStorage::MakeChain() {
+  return std::make_unique<ChainImpl>(values_);
+}
+
+std::unique_ptr<DataLayerChain> StringStorage::MakeChain() {
+  return std::make_unique<ChainImpl>(string_pool_, data_, is_sorted_);
+}
+
+}  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/make_chain_minimal.cc b/src/trace_processor/db/column/make_chain_minimal.cc
new file mode 100644
index 0000000..7a23549
--- /dev/null
+++ b/src/trace_processor/db/column/make_chain_minimal.cc
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2024 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 <memory>
+
+#include "src/trace_processor/db/column/arrangement_overlay.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/dense_null_overlay.h"
+#include "src/trace_processor/db/column/dummy_storage.h"
+#include "src/trace_processor/db/column/id_storage.h"
+#include "src/trace_processor/db/column/null_overlay.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
+#include "src/trace_processor/db/column/range_overlay.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
+#include "src/trace_processor/db/column/set_id_storage.h"
+#include "src/trace_processor/db/column/string_storage.h"
+
+// This file contains the implementation of MakeChain for all the
+// DataLayer implementations the "minimal" target used by export_json in Chrome.
+// See make_chain.cc for the real implementations for these functions.
+
+namespace perfetto::trace_processor::column {
+
+std::unique_ptr<DataLayerChain> ArrangementOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain>,
+    ChainCreationArgs) {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+
+std::unique_ptr<DataLayerChain> DenseNullOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain>,
+    ChainCreationArgs) {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+
+std::unique_ptr<DataLayerChain> DummyStorage::MakeChain() {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+
+std::unique_ptr<DataLayerChain> IdStorage::MakeChain() {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+
+std::unique_ptr<DataLayerChain> NullOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain>,
+    ChainCreationArgs) {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+
+template <typename T>
+std::unique_ptr<DataLayerChain> NumericStorage<T>::MakeChain() {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+template std::unique_ptr<DataLayerChain> NumericStorage<double>::MakeChain();
+template std::unique_ptr<DataLayerChain> NumericStorage<uint32_t>::MakeChain();
+template std::unique_ptr<DataLayerChain> NumericStorage<int32_t>::MakeChain();
+template std::unique_ptr<DataLayerChain> NumericStorage<int64_t>::MakeChain();
+
+std::unique_ptr<DataLayerChain> RangeOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain>,
+    ChainCreationArgs) {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+
+std::unique_ptr<DataLayerChain> SelectorOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain>,
+    ChainCreationArgs) {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+
+std::unique_ptr<DataLayerChain> SetIdStorage::MakeChain() {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+
+std::unique_ptr<DataLayerChain> StringStorage::MakeChain() {
+  return std::make_unique<DummyStorage::ChainImpl>();
+}
+
+}  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/null_overlay.cc b/src/trace_processor/db/column/null_overlay.cc
index 25fddd4..2ddc004 100644
--- a/src/trace_processor/db/column/null_overlay.cc
+++ b/src/trace_processor/db/column/null_overlay.cc
@@ -80,12 +80,6 @@
 
 NullOverlay::NullOverlay(const BitVector* non_null) : non_null_(non_null) {}
 
-std::unique_ptr<DataLayerChain> NullOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner,
-    ChainCreationArgs) {
-  return std::make_unique<ChainImpl>(std::move(inner), non_null_);
-}
-
 SingleSearchResult NullOverlay::ChainImpl::SingleSearch(FilterOp op,
                                                         SqlValue sql_val,
                                                         uint32_t index) const {
diff --git a/src/trace_processor/db/column/numeric_storage.cc b/src/trace_processor/db/column/numeric_storage.cc
index 9c56c85..2c88b38 100644
--- a/src/trace_processor/db/column/numeric_storage.cc
+++ b/src/trace_processor/db/column/numeric_storage.cc
@@ -22,6 +22,7 @@
 #include <cstdint>
 #include <functional>
 #include <limits>
+#include <memory>
 #include <optional>
 #include <string>
 #include <utility>
@@ -700,4 +701,11 @@
   }
 }
 
+// Define explicit instantiation of the necessary templates here to reduce
+// binary size bloat.
+template class NumericStorage<double>;
+template class NumericStorage<uint32_t>;
+template class NumericStorage<int32_t>;
+template class NumericStorage<int64_t>;
+
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/numeric_storage.h b/src/trace_processor/db/column/numeric_storage.h
index e0fa5d1..f6f450a 100644
--- a/src/trace_processor/db/column/numeric_storage.h
+++ b/src/trace_processor/db/column/numeric_storage.h
@@ -93,9 +93,10 @@
                                     bool is_sorted)
       : NumericStorageBase(type, is_sorted), vector_(vec) {}
 
-  std::unique_ptr<DataLayerChain> MakeChain() override {
-    return std::make_unique<ChainImpl>(vector_, storage_type_, is_sorted_);
-  }
+  // The implementation of this function is given by
+  // make_chain.cc/make_chain_minimal.cc depending on whether this is a minimal
+  // or full build of trace processor.
+  std::unique_ptr<DataLayerChain> MakeChain() override;
 
  private:
   class ChainImpl : public NumericStorageBase::ChainImpl {
@@ -155,6 +156,22 @@
   const std::vector<T>* vector_;
 };
 
+// Define external templates to reduce binary size bloat.
+extern template class NumericStorage<double>;
+extern template class NumericStorage<uint32_t>;
+extern template class NumericStorage<int32_t>;
+extern template class NumericStorage<int64_t>;
+
+// Define external templates to allow splitting minimal vs full targets.
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<double>::MakeChain();
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<uint32_t>::MakeChain();
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<int32_t>::MakeChain();
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<int64_t>::MakeChain();
+
 }  // namespace perfetto::trace_processor::column
 
 #endif  // SRC_TRACE_PROCESSOR_DB_COLUMN_NUMERIC_STORAGE_H_
diff --git a/src/trace_processor/db/column/range_overlay.cc b/src/trace_processor/db/column/range_overlay.cc
index d3f3797..5a92138 100644
--- a/src/trace_processor/db/column/range_overlay.cc
+++ b/src/trace_processor/db/column/range_overlay.cc
@@ -36,12 +36,6 @@
 
 RangeOverlay::RangeOverlay(const Range* range) : range_(range) {}
 
-std::unique_ptr<DataLayerChain> RangeOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner,
-    ChainCreationArgs) {
-  return std::make_unique<ChainImpl>(std::move(inner), range_);
-}
-
 RangeOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> inner,
                                    const Range* range)
     : inner_(std::move(inner)), range_(range) {
diff --git a/src/trace_processor/db/column/selector_overlay.cc b/src/trace_processor/db/column/selector_overlay.cc
index e024d4d..47df692 100644
--- a/src/trace_processor/db/column/selector_overlay.cc
+++ b/src/trace_processor/db/column/selector_overlay.cc
@@ -37,12 +37,6 @@
 SelectorOverlay::SelectorOverlay(const BitVector* selector)
     : selector_(selector) {}
 
-std::unique_ptr<DataLayerChain> SelectorOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner,
-    ChainCreationArgs) {
-  return std::make_unique<ChainImpl>(std::move(inner), selector_);
-}
-
 SelectorOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> inner,
                                       const BitVector* selector)
     : inner_(std::move(inner)), selector_(selector) {}
diff --git a/src/trace_processor/db/column/set_id_storage.cc b/src/trace_processor/db/column/set_id_storage.cc
index 58bbe96..dd22def 100644
--- a/src/trace_processor/db/column/set_id_storage.cc
+++ b/src/trace_processor/db/column/set_id_storage.cc
@@ -69,10 +69,6 @@
 SetIdStorage::SetIdStorage(const std::vector<uint32_t>* values)
     : values_(values) {}
 
-std::unique_ptr<DataLayerChain> SetIdStorage::MakeChain() {
-  return std::make_unique<ChainImpl>(values_);
-}
-
 SetIdStorage::ChainImpl::ChainImpl(const std::vector<uint32_t>* values)
     : values_(values) {}
 
diff --git a/src/trace_processor/db/column/string_storage.cc b/src/trace_processor/db/column/string_storage.cc
index ec004aa..5eaf950 100644
--- a/src/trace_processor/db/column/string_storage.cc
+++ b/src/trace_processor/db/column/string_storage.cc
@@ -202,10 +202,6 @@
                              bool is_sorted)
     : data_(data), string_pool_(string_pool), is_sorted_(is_sorted) {}
 
-std::unique_ptr<DataLayerChain> StringStorage::MakeChain() {
-  return std::make_unique<ChainImpl>(string_pool_, data_, is_sorted_);
-}
-
 StringStorage::ChainImpl::ChainImpl(StringPool* string_pool,
                                     const std::vector<StringPool::Id>* data,
                                     bool is_sorted)
diff --git a/src/trace_processor/perfetto_sql/intrinsics/functions/BUILD.gn b/src/trace_processor/perfetto_sql/intrinsics/functions/BUILD.gn
index e34973c..ea8b3ae 100644
--- a/src/trace_processor/perfetto_sql/intrinsics/functions/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/intrinsics/functions/BUILD.gn
@@ -42,7 +42,7 @@
   ]
   deps = [
     "../../..:demangle",
-    "../../..:export_json",
+    "../../..:export_json_sources",
     "../../..:metatrace",
     "../../../../../gn:default_deps",
     "../../../../../gn:sqlite",