Use sandboxed clang

Change-Id: I0b9b5b7940b441aba6c6214e621d8997feef90b1
diff --git a/tools/cpp/BUILD b/tools/cpp/BUILD
index f5dfe10..bc094aa 100644
--- a/tools/cpp/BUILD
+++ b/tools/cpp/BUILD
@@ -1,168 +1,200 @@
-package(default_visibility = ['//visibility:public'])
+package(default_visibility = ["//visibility:public"])
 
 cc_library(
-  name = 'empty_main',
-  srcs = [ 'empty_main.c' ],
+    name = "empty_main",
+    srcs = ["empty_main.c"],
 )
 
 cc_library(
-  name = 'malloc',
-  deps = select({
-    '//tools:has_asan': [],
-    '//tools:has_tsan': [],
-    '//tools:cpu_cortex_m4f': [],
-    '//conditions:default': ['//third_party/gperftools:tcmalloc'],
-  }),
+    name = "malloc",
+    deps = select({
+        "//tools:has_asan": [],
+        "//tools:has_tsan": [],
+        "//tools:cpu_cortex_m4f": [],
+        "//conditions:default": ["//third_party/gperftools:tcmalloc"],
+    }),
 )
 
 cc_library(
-  name = 'stl',
+    name = "stl",
 )
 
 filegroup(
-  name = 'empty',
-  srcs = [],
+    name = "empty",
+    srcs = [],
 )
 
 # This is the entry point for --crosstool_top.
 cc_toolchain_suite(
-  name = 'toolchain',
-  toolchains = {
-    'k8|clang': ':cc-compiler-k8',
-    'roborio|gcc': ':cc-compiler-roborio',
-    'armhf-debian|clang': 'cc-compiler-armhf-debian',
-    'cortex-m4f|gcc': 'cc-compiler-cortex-m4f',
-  },
+    name = "toolchain",
+    toolchains = {
+        "k8|clang": ":cc-compiler-k8",
+        "roborio|gcc": ":cc-compiler-roborio",
+        "armhf-debian|clang": "cc-compiler-armhf-debian",
+        "cortex-m4f|gcc": "cc-compiler-cortex-m4f",
+    },
 )
 
 # Compiler inputs given by --copt etc in //tools:bazel.rc.
 filegroup(
-  name = 'flags_compiler_inputs',
-  srcs = select({
-    '//tools:has_asan': [
-      'asan-blacklist',
+    name = "flags_compiler_inputs",
+    srcs = select({
+        "//tools:has_asan": [
+            "asan-blacklist",
+        ],
+        "//tools:has_ubsan": [
+            "ubsan-blacklist",
+        ],
+        "//conditions:default": [],
+    }),
+)
+
+filegroup(
+    name = "clang_3p6_all_files",
+    srcs = [
+        ":flags_compiler_inputs",
+        "//tools/cpp/clang_3p6:as",
+        "//tools/cpp/clang_3p6:tool-wrappers",
+        "@clang_3p6_repo//:compiler_pieces",
     ],
-    '//tools:has_ubsan': [
-      'ubsan-blacklist',
+)
+
+filegroup(
+    name = "clang_3p6_linker_files",
+    srcs = [
+        "//tools/cpp/clang_3p6:ar",
+        "//tools/cpp/clang_3p6:clang",
+        "//tools/cpp/clang_3p6:clang-symlinks",
+        "//tools/cpp/clang_3p6:ld",
+        "@clang_3p6_repo//:compiler_pieces",
     ],
-    '//conditions:default': [],
-  }),
+)
+
+filegroup(
+    name = "clang_3p6_compiler_files",
+    srcs = [
+        "//tools/cpp/clang_3p6:clang",
+        "//tools/cpp/clang_3p6:ld",
+        "@clang_3p6_repo//:compiler_components",
+        "@clang_3p6_repo//:compiler_pieces",
+    ],
 )
 
 cc_toolchain(
-  name = 'cc-compiler-k8',
-  all_files = ':flags_compiler_inputs',
-  compiler_files = ':flags_compiler_inputs',
-  cpu = 'local',
-  dwp_files = ':empty',
-  dynamic_runtime_libs = [':empty'],
-  linker_files = ':empty',
-  objcopy_files = ':empty',
-  static_runtime_libs = [':empty'],
-  strip_files = ':empty',
-  supports_param_files = 1,
+    name = "cc-compiler-k8",
+    all_files = ":clang_3p6_all_files",
+    compiler_files = ":clang_3p6_compiler_files",
+    cpu = "k8",
+    dwp_files = ":empty",
+    dynamic_runtime_libs = [":empty"],
+    linker_files = ":clang_3p6_linker_files",
+    objcopy_files = "//tools/cpp/clang_3p6:objcopy",
+    static_runtime_libs = [":empty"],
+    strip_files = "//tools/cpp/clang_3p6:strip",
+    supports_param_files = 1,
 )
 
 filegroup(
-  name = 'roborio-compiler-files',
-  srcs = [
-    '//tools/cpp/arm-frc-linux-gnueabi:tool-wrappers',
-    '//tools/cpp/arm-frc-linux-gnueabi:as',
-    '@arm_frc_linux_gnueabi_repo//:compiler_pieces',
-    ':flags_compiler_inputs',
-  ],
+    name = "roborio-compiler-files",
+    srcs = [
+        ":flags_compiler_inputs",
+        "//tools/cpp/arm-frc-linux-gnueabi:as",
+        "//tools/cpp/arm-frc-linux-gnueabi:tool-wrappers",
+        "@arm_frc_linux_gnueabi_repo//:compiler_pieces",
+    ],
 )
 
 filegroup(
-  name = 'roborio_linker_files',
-  srcs = [
-    '//tools/cpp/arm-frc-linux-gnueabi:ld',
-    '//tools/cpp/arm-frc-linux-gnueabi:ar',
-    '//tools/cpp/arm-frc-linux-gnueabi:gcc',
-    '//tools/cpp/arm-frc-linux-gnueabi:libs',
-    '@arm_frc_linux_gnueabi_repo//:compiler_pieces',
-  ],
+    name = "roborio_linker_files",
+    srcs = [
+        "//tools/cpp/arm-frc-linux-gnueabi:ar",
+        "//tools/cpp/arm-frc-linux-gnueabi:gcc",
+        "//tools/cpp/arm-frc-linux-gnueabi:ld",
+        "//tools/cpp/arm-frc-linux-gnueabi:libs",
+        "@arm_frc_linux_gnueabi_repo//:compiler_pieces",
+    ],
 )
+
 filegroup(
-  name = 'roborio_compiler_files',
-  srcs = [
-    '//tools/cpp/arm-frc-linux-gnueabi:gcc',
-    '//tools/cpp/arm-frc-linux-gnueabi:ld',
-    '@arm_frc_linux_gnueabi_repo//:compiler_components',
-    '@arm_frc_linux_gnueabi_repo//:compiler_pieces',
-  ],
+    name = "roborio_compiler_files",
+    srcs = [
+        "//tools/cpp/arm-frc-linux-gnueabi:gcc",
+        "//tools/cpp/arm-frc-linux-gnueabi:ld",
+        "@arm_frc_linux_gnueabi_repo//:compiler_components",
+        "@arm_frc_linux_gnueabi_repo//:compiler_pieces",
+    ],
 )
 
 cc_toolchain(
-  name = 'cc-compiler-roborio',
-  all_files = ':roborio-compiler-files',
-  compiler_files = ':roborio_compiler_files',
-  cpu = 'roborio',
-  dwp_files = ':empty',
-  dynamic_runtime_libs = [':empty'],
-  linker_files = ':roborio_linker_files',
-  objcopy_files = '//tools/cpp/arm-frc-linux-gnueabi:objcopy',
-  static_runtime_libs = [':empty'],
-  strip_files = '//tools/cpp/arm-frc-linux-gnueabi:strip',
-  supports_param_files = 1,
+    name = "cc-compiler-roborio",
+    all_files = ":roborio-compiler-files",
+    compiler_files = ":roborio_compiler_files",
+    cpu = "roborio",
+    dwp_files = ":empty",
+    dynamic_runtime_libs = [":empty"],
+    linker_files = ":roborio_linker_files",
+    objcopy_files = "//tools/cpp/arm-frc-linux-gnueabi:objcopy",
+    static_runtime_libs = [":empty"],
+    strip_files = "//tools/cpp/arm-frc-linux-gnueabi:strip",
+    supports_param_files = 1,
 )
 
 filegroup(
-  name = 'linaro-gcc-files',
-  srcs = [
-    '//tools/cpp/linaro_linux_gcc:clang-symlinks',
-    '//tools/cpp/linaro_linux_gcc:tool-wrappers',
-    '@linaro_linux_gcc_4_9_repo//:compiler_pieces',
-  ],
+    name = "linaro-gcc-files",
+    srcs = [
+        "//tools/cpp/linaro_linux_gcc:clang-symlinks",
+        "//tools/cpp/linaro_linux_gcc:tool-wrappers",
+        "@linaro_linux_gcc_4_9_repo//:compiler_pieces",
+    ],
 )
 
 filegroup(
-  name = 'linaro_linux_linker_files',
-  srcs = [
-    '//tools/cpp/linaro_linux_gcc:gcc',
-    '//tools/cpp/linaro_linux_gcc:ld',
-    '//tools/cpp/linaro_linux_gcc:ar',
-    '//tools/cpp/linaro_linux_gcc:clang-ld',
-    '//tools/cpp/linaro_linux_gcc:clang',
-    '@linaro_linux_gcc_4_9_repo//:compiler_pieces',
-    '//tools/cpp/linaro_linux_gcc:clang-symlinks',
-  ],
+    name = "linaro_linux_linker_files",
+    srcs = [
+        "//tools/cpp/linaro_linux_gcc:ar",
+        "//tools/cpp/linaro_linux_gcc:clang",
+        "//tools/cpp/linaro_linux_gcc:clang-ld",
+        "//tools/cpp/linaro_linux_gcc:clang-symlinks",
+        "//tools/cpp/linaro_linux_gcc:gcc",
+        "//tools/cpp/linaro_linux_gcc:ld",
+        "@linaro_linux_gcc_4_9_repo//:compiler_pieces",
+    ],
 )
 
 filegroup(
-  name = 'linaro_linux_compiler_files',
-  srcs = [
-    '//tools/cpp/linaro_linux_gcc:gcc',
-    '//tools/cpp/linaro_linux_gcc:ld',
-    '//tools/cpp/linaro_linux_gcc:clang',
-    '//tools/cpp/linaro_linux_gcc:as',
-  ],
+    name = "linaro_linux_compiler_files",
+    srcs = [
+        "//tools/cpp/linaro_linux_gcc:as",
+        "//tools/cpp/linaro_linux_gcc:clang",
+        "//tools/cpp/linaro_linux_gcc:gcc",
+        "//tools/cpp/linaro_linux_gcc:ld",
+    ],
 )
 
 cc_toolchain(
-  name = 'cc-compiler-armhf-debian',
-  all_files = ':linaro-gcc-files',
-  compiler_files = ':linaro_linux_compiler_files',
-  cpu = 'armhf',
-  dwp_files = ':empty',
-  dynamic_runtime_libs = [':empty'],
-  linker_files = ':linaro_linux_linker_files',
-  objcopy_files = '//tools/cpp/linaro_linux_gcc:objcopy',
-  static_runtime_libs = [':empty'],
-  strip_files = '//tools/cpp/linaro_linux_gcc:strip',
-  supports_param_files = 1,
+    name = "cc-compiler-armhf-debian",
+    all_files = ":linaro-gcc-files",
+    compiler_files = ":linaro_linux_compiler_files",
+    cpu = "armhf",
+    dwp_files = ":empty",
+    dynamic_runtime_libs = [":empty"],
+    linker_files = ":linaro_linux_linker_files",
+    objcopy_files = "//tools/cpp/linaro_linux_gcc:objcopy",
+    static_runtime_libs = [":empty"],
+    strip_files = "//tools/cpp/linaro_linux_gcc:strip",
+    supports_param_files = 1,
 )
 
 cc_toolchain(
-  name = 'cc-compiler-cortex-m4f',
-  all_files = ':empty',
-  compiler_files = ':empty',
-  cpu = 'cortex-m4',
-  dwp_files = ':empty',
-  dynamic_runtime_libs = [':empty'],
-  linker_files = '//motors/core:linkerscript',
-  objcopy_files = ':empty',
-  static_runtime_libs = [':empty'],
-  strip_files = ':empty',
-  supports_param_files = 0,
+    name = "cc-compiler-cortex-m4f",
+    all_files = ":empty",
+    compiler_files = ":empty",
+    cpu = "cortex-m4",
+    dwp_files = ":empty",
+    dynamic_runtime_libs = [":empty"],
+    linker_files = "//motors/core:linkerscript",
+    objcopy_files = ":empty",
+    static_runtime_libs = [":empty"],
+    strip_files = ":empty",
+    supports_param_files = 0,
 )
diff --git a/tools/cpp/CROSSTOOL b/tools/cpp/CROSSTOOL
index 55abdc4..b29c5ad 100644
--- a/tools/cpp/CROSSTOOL
+++ b/tools/cpp/CROSSTOOL
@@ -79,38 +79,64 @@
   target_system_name: "k8"
   toolchain_identifier: "k8_linux"
 
-  tool_path { name: "ar" path: "/usr/bin/ar" }
-  tool_path { name: "compat-ld" path: "/usr/bin/ld" }
-  tool_path { name: "cpp" path: "/usr/bin/cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/clang-3.6" }
-  tool_path { name: "gcov" path: "/usr/bin/gcov" }
+  # These paths are relative to //tools/cpp.
+  tool_path { name: "ar" path: "clang_3p6/x86_64-linux-gnu-ar" }
+  tool_path { name: "compat-ld" path: "clang_3p6/x86_64-linux-gnu-ld" }
+  tool_path { name: "cpp" path: "clang_3p6/x86_64-linux-gnu-cpp" }
+  tool_path { name: "dwp" path: "clang_3p6/x86_64-linux-gnu-dwp" }
+  tool_path { name: "gcc" path: "clang_3p6/x86_64-linux-gnu-clang-3.6" }
+  tool_path { name: "gcov" path: "clang_3p6/x86_64-linux-gnu-gcov" }
   # C(++) compiles invoke the compiler (as that is the one knowing where
   # to find libraries), but we provide LD so other rules can invoke the linker.
-  tool_path { name: "ld" path: "/usr/bin/ld" }
-  tool_path { name: "nm" path: "/usr/bin/nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
+  tool_path { name: "ld" path: "clang_3p6/x86_64-linux-gnu-ld" }
+  tool_path { name: "nm" path: "clang_3p6/x86_64-linux-gnu-nm" }
+  tool_path { name: "objcopy" path: "clang_3p6/x86_64-linux-gnu-objcopy" }
   objcopy_embed_flag: "-I"
   objcopy_embed_flag: "binary"
-  tool_path { name: "objdump" path: "/usr/bin/objdump" }
-  tool_path { name: "strip" path: "/usr/bin/strip" }
+  tool_path { name: "objdump" path: "clang_3p6/x86_64-linux-gnu-objdump" }
+  tool_path { name: "strip" path: "clang_3p6/x86_64-linux-gnu-strip" }
   linking_mode_flags { mode: DYNAMIC }
 
+  compiler_flag: "--sysroot=external/clang_3p6_repo/"
+  compiler_flag: "-nostdinc"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/clang_3p6_repo/usr/include",
+  compiler_flag: "-isystem"
+  compiler_flag: "external/clang_3p6_repo/usr/include/x86_64-linux-gnu",
+  compiler_flag: "-isystem"
+  compiler_flag: "external/clang_3p6_repo/usr/lib/llvm-3.6/lib/clang/3.6.2/include",
+
+  cxx_flag: "-isystem"
+  cxx_flag: "external/clang_3p6_repo/usr/include/c++/4.9"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/clang_3p6_repo/usr/include/x86_64-linux-gnu/c++/4.9"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/clang_3p6_repo/usr/include/c++/4.9/backward"
+
   # TODO(bazel-team): In theory, the path here ought to exactly match the path
   # used by gcc. That works because bazel currently doesn't track files at
   # absolute locations and has no remote execution, yet. However, this will need
   # to be fixed, maybe with auto-detection?
-  cxx_builtin_include_directory: '/usr/include/c++/4.9'
-  cxx_builtin_include_directory: '/usr/include/x86_64-linux-gnu/c++/4.9'
-  cxx_builtin_include_directory: '/usr/include/c++/4.9/backward'
-  cxx_builtin_include_directory: '/usr/local/include'
-  cxx_builtin_include_directory: '/usr/lib/llvm-3.6/lib/clang/3.6.2/include'
-  cxx_builtin_include_directory: '/usr/include/x86_64-linux-gnu'
-  cxx_builtin_include_directory: '/usr/include'
-  cxx_builtin_include_directory: '/usr/lib/clang/3.6.2/include'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/c++/4.9'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/x86_64-linux-gnu/c++/4.9'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/c++/4.9/backward'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/local/include'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/lib/llvm-3.6/lib/clang/3.6.2/include'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/x86_64-linux-gnu'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/lib/clang/3.6.2/include'
 
+  linker_flag: "-nodefaultlibs"
+  linker_flag: "--sysroot=external/clang_3p6_repo/"
   linker_flag: "-lstdc++"
-  linker_flag: "-B/usr/bin/"
+  linker_flag: "-lc"
+  linker_flag: "-lgcc"
+  linker_flag: "-lgcc_s"
+  linker_flag: "-Bexternal/clang_3p6_repo/usr/bin/"
+  linker_flag: "-Ltools/cpp/clang_3p6/clang_more_libs"
+  linker_flag: "-Lexternal/clang_3p6/lib/x86_64-linux-gnu"
+  linker_flag: "-Lexternal/clang_3p6/usr/lib/x86_64-linux-gnu"
+  linker_flag: "-Lexternal/clang_3p6/usr/lib/gcc/x86_64-linux-gnu"
 
   feature {
     name: "opt"
diff --git a/tools/cpp/clang_3p6/BUILD b/tools/cpp/clang_3p6/BUILD
new file mode 100644
index 0000000..23504d7
--- /dev/null
+++ b/tools/cpp/clang_3p6/BUILD
@@ -0,0 +1,86 @@
+package(default_visibility = ["//tools/cpp:__pkg__"])
+
+filegroup(
+    name = "ar",
+    srcs = [
+        "x86_64-linux-gnu-ar",
+        "@clang_3p6_repo//:ar",
+    ],
+)
+
+filegroup(
+    name = "ld",
+    srcs = [
+        "x86_64-linux-gnu-ld",
+        "@clang_3p6_repo//:ld",
+    ],
+)
+
+filegroup(
+    name = "nm",
+    srcs = [
+        "x86_64-linux-gnu-nm",
+        "@clang_3p6_repo//:nm",
+    ],
+)
+
+filegroup(
+    name = "objcopy",
+    srcs = [
+        "x86_64-linux-gnu-objcopy",
+        "@clang_3p6_repo//:objcopy",
+    ],
+)
+
+filegroup(
+    name = "objdump",
+    srcs = [
+        "x86_64-linux-gnu-objdump",
+        "@clang_3p6_repo//:objdump",
+    ],
+)
+
+filegroup(
+    name = "strip",
+    srcs = [
+        "x86_64-linux-gnu-strip",
+        "@clang_3p6_repo//:strip",
+    ],
+)
+
+filegroup(
+    name = "as",
+    srcs = [
+        "x86_64-linux-gnu-as",
+        "@clang_3p6_repo//:as",
+    ],
+)
+
+filegroup(
+    name = "clang",
+    srcs = [
+        "x86_64-linux-gnu-clang-3.6",
+        "@clang_3p6_repo//:clang",
+    ],
+)
+
+filegroup(
+    name = "tool-wrappers",
+    srcs = [
+        ":ar",
+        ":as",
+        ":clang",
+        ":ld",
+        ":nm",
+        ":objcopy",
+        ":objdump",
+        ":strip",
+    ],
+)
+
+filegroup(
+    name = "clang-symlinks",
+    srcs = glob([
+        "clang_more_libs/**",
+    ]),
+)
diff --git a/tools/cpp/clang_3p6/clang_3p6.BUILD b/tools/cpp/clang_3p6/clang_3p6.BUILD
new file mode 100644
index 0000000..648a511
--- /dev/null
+++ b/tools/cpp/clang_3p6/clang_3p6.BUILD
@@ -0,0 +1,112 @@
+package(default_visibility = ["//visibility:public"])
+
+filegroup(
+    name = "clang-format",
+    srcs = [
+        "usr/bin/clang-3.6",
+        ":compiler_pieces",
+    ],
+)
+
+filegroup(
+    name = "clang",
+    srcs = [
+        "usr/bin/clang-3.6",
+    ],
+)
+
+filegroup(
+    name = "ar",
+    srcs = [
+        "usr/bin/ar",
+    ],
+)
+
+filegroup(
+    name = "ld",
+    srcs = [
+        "usr/bin/ld",
+    ],
+)
+
+filegroup(
+    name = "nm",
+    srcs = [
+        "usr/bin/nm",
+    ],
+)
+
+filegroup(
+    name = "objcopy",
+    srcs = [
+        "usr/bin/objcopy",
+    ],
+)
+
+filegroup(
+    name = "objdump",
+    srcs = [
+        "usr/bin/objdump",
+    ],
+)
+
+filegroup(
+    name = "strip",
+    srcs = [
+        "usr/bin/strip",
+    ],
+)
+
+filegroup(
+    name = "as",
+    srcs = [
+        "usr/bin/as",
+    ],
+)
+
+cc_library(
+    name = "librt",
+    srcs = [
+        "usr/lib/x86_64-linux-gnu/librt.so",
+    ],
+)
+
+cc_library(
+    name = "libdl",
+    srcs = [
+        "usr/lib/x86_64-linux-gnu/libdl.so",
+    ],
+)
+
+cc_library(
+    name = "libm",
+    srcs = [
+        "usr/lib/x86_64-linux-gnu/libm.so",
+    ],
+)
+
+filegroup(
+    name = "compiler_pieces",
+    srcs = glob(
+        [
+            "**",
+        ],
+        exclude = [
+            "usr/share/**",
+        ],
+    ),
+)
+
+filegroup(
+    name = "compiler_components",
+    srcs = [
+        ":ar",
+        ":as",
+        ":clang",
+        ":ld",
+        ":nm",
+        ":objcopy",
+        ":objdump",
+        ":strip",
+    ],
+)
diff --git a/tools/cpp/clang_3p6/clang_more_libs/libc.so b/tools/cpp/clang_3p6/clang_more_libs/libc.so
new file mode 100644
index 0000000..5800d08
--- /dev/null
+++ b/tools/cpp/clang_3p6/clang_more_libs/libc.so
@@ -0,0 +1,5 @@
+/* GNU ld script
+   Use the shared library, but some functions are only in
+   the static library, so try that secondarily.  */
+OUTPUT_FORMAT(elf64-x86-64)
+GROUP ( libc.so.6 libc_nonshared.a  AS_NEEDED ( ld-linux-x86-64.so.2 ) )
diff --git a/tools/cpp/clang_3p6/clang_more_libs/libpthread.so b/tools/cpp/clang_3p6/clang_more_libs/libpthread.so
new file mode 100644
index 0000000..f02ce72
--- /dev/null
+++ b/tools/cpp/clang_3p6/clang_more_libs/libpthread.so
@@ -0,0 +1,5 @@
+/* GNU ld script
+   Use the shared library, but some functions are only in
+   the static library, so try that secondarily.  */
+OUTPUT_FORMAT(elf64-x86-64)
+GROUP ( libpthread.so.0 libpthread_nonshared.a )
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-ar b/tools/cpp/clang_3p6/x86_64-linux-gnu-ar
new file mode 100755
index 0000000..b8ba259
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-ar
@@ -0,0 +1,9 @@
+#!/bin/bash --norc
+
+LD_LIBRARY_PATH="${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib/x86_64-linux-gnu"
+LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib"
+export LD_LIBRARY_PATH
+
+exec -a ar \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/ar \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-as b/tools/cpp/clang_3p6/x86_64-linux-gnu-as
new file mode 100755
index 0000000..f264544
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-as
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a as \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/as \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-clang-3.6 b/tools/cpp/clang_3p6/x86_64-linux-gnu-clang-3.6
new file mode 100755
index 0000000..369bf41
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-clang-3.6
@@ -0,0 +1,11 @@
+#!/bin/bash --norc
+
+LD_LIBRARY_PATH="${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib/x86_64-linux-gnu"
+# TODO(Brian): Figure out why it segfaults with this enabled, and re-enable it.
+#LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/lib/x86_64-linux-gnu"
+LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib"
+export LD_LIBRARY_PATH
+
+exec \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/clang-3.6 \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-cpp b/tools/cpp/clang_3p6/x86_64-linux-gnu-cpp
new file mode 100755
index 0000000..adf3869
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-cpp
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a cpp \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/cpp \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-gcc b/tools/cpp/clang_3p6/x86_64-linux-gnu-gcc
new file mode 100755
index 0000000..4fe1d67
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-gcc
@@ -0,0 +1,6 @@
+#!/bin/bash --norc
+
+PATH="${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib/gcc/x86_64-linux-gnu/4.9:$PATH" \
+  exec \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/gcc \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-gcov b/tools/cpp/clang_3p6/x86_64-linux-gnu-gcov
new file mode 100755
index 0000000..e71ab3e
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-gcov
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a gcov \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/gcov \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-ld b/tools/cpp/clang_3p6/x86_64-linux-gnu-ld
new file mode 100755
index 0000000..803a818
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-ld
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a ld \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/ld \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-nm b/tools/cpp/clang_3p6/x86_64-linux-gnu-nm
new file mode 100755
index 0000000..f8d1eb7
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-nm
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a nm \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/nm \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-objcopy b/tools/cpp/clang_3p6/x86_64-linux-gnu-objcopy
new file mode 100755
index 0000000..2a49155
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-objcopy
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a objcopy \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/objcopy \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-objdump b/tools/cpp/clang_3p6/x86_64-linux-gnu-objdump
new file mode 100755
index 0000000..a549b29
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-objdump
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a objdump \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/objdump \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-strip b/tools/cpp/clang_3p6/x86_64-linux-gnu-strip
new file mode 100755
index 0000000..0817069
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-strip
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a strip \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/strip \
+  "$@"