aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/toolchains
diff options
context:
space:
mode:
authorGravatar Jianwei Xie <xiejw@google.com>2018-01-24 10:02:35 -0800
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-01-24 10:06:06 -0800
commitd9f93c42a50b1f1401d9c186eac0ae8dc9093c3b (patch)
tree178d1a692f56580c266139642b5a1d0d155c477e /third_party/toolchains
parent7b62a71e2d46c148df7d5704972f4592bc5e0f1b (diff)
Merge changes from github.
PiperOrigin-RevId: 183100142
Diffstat (limited to 'third_party/toolchains')
-rw-r--r--third_party/toolchains/clang6/BUILD1
-rw-r--r--third_party/toolchains/clang6/CROSSTOOL.tpl587
-rw-r--r--third_party/toolchains/clang6/README.md101
-rw-r--r--third_party/toolchains/clang6/clang.BUILD162
-rw-r--r--third_party/toolchains/clang6/repo.bzl30
5 files changed, 881 insertions, 0 deletions
diff --git a/third_party/toolchains/clang6/BUILD b/third_party/toolchains/clang6/BUILD
new file mode 100644
index 0000000000..ffd0fb0cdc
--- /dev/null
+++ b/third_party/toolchains/clang6/BUILD
@@ -0,0 +1 @@
+package(default_visibility = ["//visibility:public"])
diff --git a/third_party/toolchains/clang6/CROSSTOOL.tpl b/third_party/toolchains/clang6/CROSSTOOL.tpl
new file mode 100644
index 0000000000..6b7e5a8808
--- /dev/null
+++ b/third_party/toolchains/clang6/CROSSTOOL.tpl
@@ -0,0 +1,587 @@
+major_version: "v1"
+minor_version: "llvm:6.0.0"
+default_target_cpu: "k8"
+
+default_toolchain {
+ cpu: "k8"
+ toolchain_identifier: "k8-clang-6.0-cxx-4.8-linux-gnu"
+}
+
+toolchain {
+ compiler: "clang6" # bazel build --compiler=clang6
+ target_cpu: "k8" # bazel build --cpu=k8
+ target_libc: "GLIBC_2.19" # bazel build --glibc=GLIBC_2.19
+
+ abi_libc_version: "2.19"
+ abi_version: "gcc-4.8-cxx11"
+ builtin_sysroot: ""
+ cc_target_os: "linux-gnu"
+ default_python_version: "python2.7"
+ dynamic_runtimes_filegroup: "dynamic-runtime-libs-k8"
+ host_system_name: "x86_64-unknown-linux-gnu"
+ needsPic: true
+ static_runtimes_filegroup: "static-runtime-libs-k8"
+ supports_embedded_runtimes: true
+ supports_fission: true
+ supports_gold_linker: true
+ supports_incremental_linker: true
+ supports_interface_shared_objects: true
+ supports_normalizing_ar: true
+ supports_start_end_lib: true
+ supports_thin_archives: true
+ target_system_name: "x86_64-unknown-linux-gnu"
+ toolchain_identifier: "k8-clang-6.0-cxx-4.8-linux-gnu"
+
+ tool_path { name: "ar" path: "%package(@local_config_clang6//clang6)%/llvm/bin/llvm-ar" }
+ tool_path { name: "as" path: "%package(@local_config_clang6//clang6)%/llvm/bin/llvm-as" }
+ tool_path { name: "compat-ld" path: "%package(@local_config_clang6//clang6)%/llvm/bin/ld.lld" }
+ tool_path { name: "cpp" path: "%package(@local_config_clang6//clang6)%/llvm/bin/llvm-cpp" }
+ tool_path { name: "dwp" path: "%package(@local_config_clang6//clang6)%/llvm/bin/llvm-dwp" }
+ tool_path { name: "gcc" path: "%package(@local_config_clang6//clang6)%/llvm/bin/clang" }
+ tool_path { name: "gcov" path: "%package(@local_config_clang6//clang6)%/llvm/bin/llvm-cov" }
+ tool_path { name: "ld" path: "%package(@local_config_clang6//clang6)%/llvm/bin/ld.lld" }
+ tool_path { name: "llvm-profdata" path: "%package(@local_config_clang6//clang6)%/llvm/bin/llvm-profdata" }
+ tool_path { name: "nm" path: "%package(@local_config_clang6//clang6)%/llvm/bin/llvm-nm" }
+ tool_path { name: "objcopy" path: "%package(@local_config_clang6//clang6)%/llvm/bin/llvm-objcopy" }
+ tool_path { name: "objdump" path: "%package(@local_config_clang6//clang6)%/sbin/objdump" }
+ tool_path { name: "strip" path: "%package(@local_config_clang6//clang6)%/sbin/strip" }
+
+ unfiltered_cxx_flag: "-no-canonical-prefixes"
+
+ # Make C++ compilation deterministic. Use linkstamping instead of these
+ # compiler symbols.
+ unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
+ unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
+ unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
+ unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
+
+ objcopy_embed_flag: "-I"
+ objcopy_embed_flag: "binary"
+
+ # This action_config makes features flags propagate
+ # to CC_FLAGS for genrules, and eventually skylark.
+ action_config {
+ action_name: "cc-flags-make-variable"
+ config_name: "cc-flags-make-variable"
+ }
+
+ # Security hardening on by default.
+ # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
+ # We need to undef it before redefining it as some distributions now have
+ # it enabled by default.
+ compiler_flag: "-U_FORTIFY_SOURCE"
+ compiler_flag: "-D_FORTIFY_SOURCE=1"
+ compiler_flag: "-fstack-protector"
+ linker_flag: "-Wl,-z,relro,-z,now"
+
+ # This adds a little bit more durability to our Clang build.
+ #
+ # At the moment, this only only be needed for:
+ # - add_boringssl_s390x.patch: --Wa,--noexecstack
+ #
+ # Folks who do maintenance work on TF Bazel Clang should consider
+ # commenting out these lines, while doing that work, to gain a better
+ # understanding of what the intersection of support looks like between GCC
+ # and Clang. Please note that, Bazel does not support
+ # -Xclang-only / -Xgcc-only.
+ compiler_flag: "-Wno-unknown-warning-option"
+ compiler_flag: "-Wno-unused-command-line-argument"
+ compiler_flag: "-Wno-ignored-optimization-argument"
+
+ #### Common compiler options. ####
+ compiler_flag: "-D_REENTRANT"
+ compiler_flag: "-D__STDC_FORMAT_MACROS"
+ compiler_flag: "-DSUPPRESS_USE_FILE_OFFSET64"
+ compiler_flag: "-Wall"
+ compiler_flag: "-Wformat-security"
+ compiler_flag: "-Wframe-larger-than=16384"
+ compiler_flag: "-Wno-char-subscripts"
+ compiler_flag: "-Wno-error=deprecated-declarations"
+ compiler_flag: "-Wno-uninitialized"
+ compiler_flag: "-Wno-sign-compare"
+ compiler_flag: "-Wno-strict-overflow"
+ compiler_flag: "-Wno-unused-function"
+ compiler_flag: "-fdiagnostics-show-option"
+ compiler_flag: "-fmessage-length=0"
+ compiler_flag: "-fno-exceptions"
+ compiler_flag: "-fno-omit-frame-pointer"
+ compiler_flag: "-fno-strict-aliasing"
+ compiler_flag: "-fno-use-init-array"
+ compiler_flag: "-funsigned-char"
+ compiler_flag: "-gmlt"
+ cxx_flag: "-Wno-deprecated"
+ cxx_flag: "-Wno-invalid-offsetof" # Needed for protobuf code (2017-11-07)
+ cxx_flag: "-fshow-overloads=best"
+ compiler_flag: "-Wthread-safety-analysis"
+
+ # Python extensions unfortunately make this go wild.
+ compiler_flag: "-Wno-writable-strings"
+
+ # GCC's warning produces too many false positives:
+ cxx_flag: "-Woverloaded-virtual"
+ cxx_flag: "-Wnon-virtual-dtor"
+
+ # Enable coloring even if there's no attached terminal. Bazel removes the
+ # escape sequences if --nocolor is specified. This isn't supported by gcc
+ # on Ubuntu 14.04.
+ compiler_flag: "-fcolor-diagnostics"
+
+ # Disable some broken warnings from Clang.
+ compiler_flag: "-Wno-ambiguous-member-template"
+ compiler_flag: "-Wno-pointer-sign"
+
+ # These warnings have a low signal to noise ratio.
+ compiler_flag: "-Wno-reserved-user-defined-literal"
+ compiler_flag: "-Wno-return-type-c-linkage"
+ compiler_flag: "-Wno-invalid-source-encoding"
+
+ # Per default we switch off any layering related warnings.
+ compiler_flag: "-Wno-private-header"
+
+ # Clang-specific warnings that we explicitly enable for TensorFlow. Some of
+ # these aren't on by default, or under -Wall, or are subsets of warnings
+ # turned off above.
+ compiler_flag: "-Wfloat-overflow-conversion"
+ compiler_flag: "-Wfloat-zero-conversion"
+ compiler_flag: "-Wfor-loop-analysis"
+ compiler_flag: "-Wgnu-redeclared-enum"
+ compiler_flag: "-Winfinite-recursion"
+ compiler_flag: "-Wliteral-conversion"
+ compiler_flag: "-Wself-assign"
+ compiler_flag: "-Wstring-conversion"
+ compiler_flag: "-Wtautological-overlap-compare"
+ compiler_flag: "-Wunused-comparison"
+ compiler_flag: "-Wvla"
+ cxx_flag: "-Wdeprecated-increment-bool"
+
+ # Clang code-generation flags for performance optimization.
+ compiler_flag: "-faligned-allocation"
+ compiler_flag: "-fnew-alignment=8"
+
+ # Clang defaults to C99 while GCC defaults to C89. GCC plugins are written in
+ # C89 and don't have a BUILD rule we could add a copts flag to.
+ gcc_plugin_compiler_flag: "-std=gnu89"
+
+ compilation_mode_flags {
+ mode: FASTBUILD
+ }
+
+ compilation_mode_flags {
+ mode: DBG
+ compiler_flag: "-g"
+ }
+
+ compilation_mode_flags {
+ mode: OPT
+ compiler_flag: "-g0"
+ compiler_flag: "-fdebug-types-section"
+ compiler_flag: "-DNDEBUG"
+ compiler_flag: "-fno-split-dwarf-inlining"
+ compiler_flag: "-Os"
+ compiler_flag: "-fexperimental-new-pass-manager"
+ compiler_flag: "-fdebug-info-for-profiling"
+ compiler_flag: "-ffunction-sections"
+ compiler_flag: "-fdata-sections"
+ linker_flag: "-Wl,--gc-sections"
+ linker_flag: "-Wl,-z,relro,-z,now"
+ }
+
+ # Features indicating whether this is a host compile or not. Exactly one of
+ # these will be implicitly provided by bazel.
+ feature { name: "host" }
+ feature { name: "nonhost" }
+
+ # Features indicating which compiler will be used for code generation.
+ feature {
+ name: "llvm_codegen"
+ provides: "codegen"
+ enabled: true
+ }
+
+ # Features for compilation modes. Exactly one of these will be implicitly
+ # provided by bazel.
+ feature { name: "fastbuild" }
+ feature { name: "dbg" }
+ feature { name: "opt" }
+
+ # Features controlling the C++ language mode.
+ feature {
+ name: "c++11"
+ provides: "c++std"
+ flag_set {
+ action: "c++-compile"
+ action: "c++-header-parsing"
+ action: "c++-header-preprocessing"
+ action: "c++-module-compile"
+ action: "linkstamp-compile"
+ flag_group {
+ flag: "-nostdinc++"
+ flag: "-std=c++11"
+ flag: "-Wc++14-extensions"
+ flag: "-Wc++2a-extensions"
+ flag: "-Wno-binary-literal"
+ }
+ }
+ }
+ feature {
+ name: "c++14"
+ provides: "c++std"
+ flag_set {
+ action: "c++-compile"
+ action: "c++-header-parsing"
+ action: "c++-header-preprocessing"
+ action: "c++-module-compile"
+ action: "linkstamp-compile"
+ flag_group {
+ flag: "-nostdinc++"
+ flag: "-std=c++14"
+ flag: "-Wc++11-compat"
+ flag: "-Wno-c++11-compat-binary-literal"
+ flag: "-Wc++2a-extensions"
+ }
+ }
+ }
+ feature {
+ name: "c++17"
+ provides: "c++std"
+ flag_set {
+ action: "c++-compile"
+ action: "c++-header-parsing"
+ action: "c++-header-preprocessing"
+ action: "c++-module-compile"
+ action: "linkstamp-compile"
+ flag_group {
+ flag: "-nostdinc++"
+ flag: "-std=c++17"
+ flag: "-Wc++11-compat"
+ flag: "-Wno-c++11-compat-binary-literal"
+ flag: "-Wc++2a-extensions"
+ }
+ }
+ }
+ feature {
+ name: "c++2a"
+ provides: "c++std"
+ flag_set {
+ action: "c++-compile"
+ action: "c++-header-parsing"
+ action: "c++-header-preprocessing"
+ action: "c++-module-compile"
+ action: "linkstamp-compile"
+ flag_group {
+ flag: "-nostdinc++"
+ flag: "-std=c++2a"
+ flag: "-Wc++11-compat"
+ flag: "-Wno-c++11-compat-binary-literal"
+ }
+ }
+ }
+ feature {
+ name: "c++default"
+ enabled: true
+ flag_set {
+ # Provide the c++11 flags if no standard is selected
+ with_feature {
+ not_feature: "c++11"
+ not_feature: "c++14"
+ not_feature: "c++17"
+ not_feature: "c++2a"
+ }
+ action: "c++-compile"
+ action: "c++-header-parsing"
+ action: "c++-header-preprocessing"
+ action: "c++-module-compile"
+ action: "linkstamp-compile"
+ flag_group {
+ flag: "-nostdinc++"
+ flag: "-std=c++11"
+ flag: "-Wc++14-extensions"
+ flag: "-Wc++2a-extensions"
+ flag: "-Wno-binary-literal"
+ }
+ }
+ }
+
+ feature {
+ name: "use_compiler_rt"
+ requires { feature: "llvm_codegen" }
+ # TODO(saugustine): At the moment, "use_compiler_rt" also
+ # requires "linking_mode_flags { mode: FULLY_STATIC" ... },
+ # but that isn't a feature. We should probably convert it.
+ flag_set {
+ action: "c++-link"
+ action: "c++-link-interface-dynamic-library"
+ action: "c++-link-dynamic-library"
+ action: "c++-link-executable"
+ # "link" is a misnomer for these actions. They are really just
+ # invocations of ar.
+ #action: "c++-link-pic-static-library"
+ #action: "c++-link-static-library"
+ #action: "c++-link-alwayslink-static-library"
+ #action: "c++-link-pic-static-library"
+ #action: "c++-link-alwayslink-pic-static-library"
+ flag_group {
+ flag: "-rtlib=compiler-rt"
+ flag: "-lunwind"
+ }
+ }
+ }
+
+ feature {
+ name: "pie"
+ flag_set {
+ action: "assemble"
+ action: "preprocess-assemble"
+ action: "c-compile"
+ action: "c++-compile"
+ action: "c++-header-parsing"
+ action: "c++-header-preprocessing"
+ action: "c++-module-compile"
+ action: "c++-module-codegen"
+ action: "cc-flags-make-variable"
+ action: "lto-backend"
+ action: "linkstamp-compile"
+ flag_group {
+ flag: "-mpie-copy-relocations"
+ flag: "-fPIE"
+ }
+ }
+ flag_set {
+ action: "cc-flags-make-variable"
+ action: "c++-link-executable"
+ flag_group {
+ flag: "-pie"
+ }
+ }
+ }
+
+ # Pic must appear after pie, because pic may need to override pie, and bazel
+ # turns it on selectively. These don't interact with other options.
+ #
+ # TODO: In practice, normal vs pic vs pie is a ternary mode. We should
+ # implement it that way. This will require changes to bazel, which only
+ # calculates whether or not pic is needed, not pie.
+ #
+ # NOTE: Bazel might make this all a moot point.
+ feature {
+ name: "pic"
+ flag_set {
+ action: "assemble"
+ action: "preprocess-assemble"
+ action: "c-compile"
+ action: "c++-compile"
+ action: "c++-module-codegen"
+ action: "c++-module-compile"
+ action: "linkstamp-compile"
+ expand_if_all_available: "pic"
+ flag_group {
+ flag: "-fPIC"
+ }
+ }
+ }
+
+ feature {
+ name: "gold"
+ enabled: true
+ flag_set {
+ action: "c++-link-executable"
+ action: "c++-link-dynamic-library"
+ action: "c++-link-interface-dynamic-library"
+ flag_group {
+ expand_if_none_available: "lto"
+ flag: "-fuse-ld=gold"
+ }
+ }
+ }
+
+ # This is great if you want linking TensorFlow to take ten minutes.
+ feature {
+ name: "lto"
+ requires { feature: "nonhost" }
+ flag_set {
+ action: "c-compile"
+ action: "c++-compile"
+ flag_group {
+ flag: "-flto=thin"
+ }
+ }
+ flag_set {
+ action: "c++-link-executable"
+ action: "c++-link-dynamic-library"
+ action: "c++-link-interface-dynamic-library"
+ flag_group {
+ flag: "-flto=thin"
+ }
+ }
+ }
+
+ feature {
+ name: "parse_headers"
+ flag_set {
+ action: "c++-header-parsing"
+ flag_group {
+ flag: "-xc++-header"
+ flag: "-fsyntax-only"
+ }
+ }
+ }
+
+ feature {
+ name: "preprocess_headers"
+ flag_set {
+ action: "c++-header-preprocessing"
+ flag_group {
+ flag: "-xc++"
+ flag: "-E"
+ }
+ }
+ }
+
+ feature {
+ name: "per_object_debug_info"
+ flag_set {
+ action: "c-compile"
+ action: "c++-compile"
+ action: "c++-module-codegen"
+ action: "assemble"
+ action: "preprocess-assemble"
+ action: "lto-backend"
+ flag_group {
+ flag: "-gsplit-dwarf"
+ flag: "-ggnu-pubnames"
+ }
+ }
+ flag_set {
+ action: "c++-link-executable"
+ action: "c++-link-dynamic-library"
+ action: "c++-link-interface-dynamic-library"
+ flag_group {
+ expand_if_all_available: "is_using_fission"
+ flag: "-Wl,--gdb-index"
+ }
+ }
+ }
+
+ feature {
+ name: "xray"
+ requires {
+ feature: "llvm_codegen"
+ feature: "nonhost"
+ }
+ flag_set {
+ action: "c-compile"
+ action: "c++-compile"
+ action: "c++-header-parsing"
+ action: "c++-header-preprocessing"
+ action: "c++-module-compile"
+ action: "c++-link-interface-dynamic-library"
+ action: "c++-link-dynamic-library"
+ action: "c++-link-executable"
+ flag_group {
+ flag: "-fxray-instrument"
+ }
+ }
+ }
+
+ feature {
+ name: "minimal_ubsan"
+ requires { feature: "llvm_codegen" }
+ flag_set {
+ action: "c-compile"
+ action: "c++-compile"
+ action: "c++-header-parsing"
+ action: "c++-header-preprocessing"
+ action: "c++-module-compile"
+ action: "c++-module-codegen"
+ flag_group {
+ flag: "-fsanitize=return,returns-nonnull-attribute,vla-bound,unreachable,float-cast-overflow"
+ flag: "-fsanitize-trap=all"
+ flag: "-DUNDEFINED_BEHAVIOR_SANITIZER"
+ }
+ }
+ }
+
+ feature {
+ name: "minimal_ubsan_enabled_by_default"
+ requires {
+ feature: "llvm_codegen"
+ feature: "fastbuild"
+ }
+ enabled: true
+ implies: "minimal_ubsan"
+ }
+
+ cxx_builtin_include_directory: "%package(@local_config_clang6//clang6)%/llvm/lib/clang/6.0.0/include"
+ cxx_builtin_include_directory: "/usr/include"
+
+ unfiltered_cxx_flag: "-cxx-isystem"
+ unfiltered_cxx_flag: "/usr/include/c++/4.8"
+ unfiltered_cxx_flag: "-cxx-isystem"
+ unfiltered_cxx_flag: "/usr/include/x86_64-linux-gnu/c++/4.8"
+ unfiltered_cxx_flag: "-isystem"
+ unfiltered_cxx_flag: "%package(@local_config_clang6//clang6)%/llvm/lib/clang/6.0.0/include"
+ unfiltered_cxx_flag: "-isystem"
+ unfiltered_cxx_flag: "/usr/include/x86_64-linux-gnu"
+ unfiltered_cxx_flag: "-isystem"
+ unfiltered_cxx_flag: "/usr/include"
+
+ linker_flag: "-Wl,--build-id=md5"
+ linker_flag: "-Wl,--fatal-warnings"
+ linker_flag: "-Wl,--hash-style=gnu"
+ linker_flag: "-no-canonical-prefixes"
+ linker_flag: "--target=x86_64-unknown-linux-gnu"
+
+ linker_flag: "-L/usr/lib/gcc/x86_64-linux-gnu/4.8"
+
+ # This is the minimum x86 architecture TensorFlow supports.
+ compiler_flag: "-DARCH_K8"
+ compiler_flag: "-m64"
+
+ # These are for Linux.
+ ld_embed_flag: "-melf_x86_64"
+ linker_flag: "-Wl,--eh-frame-hdr"
+ linker_flag: "-Wl,-z,max-page-size=0x1000"
+
+ # Google never uses the stack like a heap, e.g. alloca(), because tcmalloc
+ # and jemalloc are so fast. However copts=["$(STACK_FRAME_UNLIMITED)"] can be
+ # specified when that can't be the case.
+ make_variable {
+ name: "STACK_FRAME_UNLIMITED"
+ value: "-Wframe-larger-than=100000000 -Wno-vla"
+ }
+
+ # These flags are for folks who build C/C++ code inside genrules.
+ make_variable {
+ name: "CC_FLAGS"
+ value: "-no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fno-omit-frame-pointer -fno-tree-vrp -msse3"
+ }
+
+ feature {
+ name: "copts"
+ flag_set {
+ expand_if_all_available: "copts"
+ action: "assemble"
+ action: "preprocess-assemble"
+ action: "c-compile"
+ action: "c++-compile"
+ action: "c++-header-parsing"
+ action: "c++-header-preprocessing"
+ action: "c++-module-compile"
+ action: "c++-module-codegen"
+ action: "lto-backend"
+ flag_group {
+ iterate_over: "copts"
+ flag: "%{copts}"
+ }
+ }
+ }
+
+ # Please do not statically link libstdc++. This would probably lead to a lot
+ # of bloat since OpKernels need to use linkstatic=1 because b/27630669 and
+ # it could cause memory leaks since Python uses dlopen() on our libraries:
+ # https://stackoverflow.com/a/35015415
+ linker_flag: "-lstdc++"
+ linker_flag: "-lm"
+ linker_flag: "-lpthread"
+ linker_flag: "-l:/lib/x86_64-linux-gnu/libc-2.19.so"
+}
diff --git a/third_party/toolchains/clang6/README.md b/third_party/toolchains/clang6/README.md
new file mode 100644
index 0000000000..0c6be25a0e
--- /dev/null
+++ b/third_party/toolchains/clang6/README.md
@@ -0,0 +1,101 @@
+# TensorFlow Bazel Clang
+
+This is a specialized toolchain that uses an old Debian with a new Clang that
+can cross compile to any x86_64 microarchitecture. It's intended to build Linux
+binaries that only require the following ABIs:
+
+- GLIBC_2.18
+- CXXABI_1.3.7 (GCC 4.8.3)
+- GCC_4.2.0
+
+Which are available on at least the following Linux platforms:
+
+- Ubuntu 14+
+- CentOS 7+
+- Debian 8+
+- SuSE 13.2+
+- Mint 17.3+
+- Manjaro 0.8.11
+
+# System Install
+
+On Debian 8 (Jessie) Clang 6.0 can be installed as follows:
+
+```sh
+cat >>/etc/apt/sources.list <<'EOF'
+deb http://apt.llvm.org/jessie/ llvm-toolchain-jessie main
+deb-src http://apt.llvm.org/jessie/ llvm-toolchain-jessie main
+EOF
+wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
+apt-key fingerprint |& grep '6084 F3CF 814B 57C1 CF12 EFD5 15CF 4D18 AF4F 7421'
+apt-get update
+apt-get install clang lld
+```
+
+# Bazel Configuration
+
+This toolchain can compile TensorFlow in 2m30s on a 96-core Skylake GCE VM if
+the following `.bazelrc` settings are added:
+
+```
+startup --host_jvm_args=-Xmx30G
+startup --host_jvm_args=-Xms30G
+startup --host_jvm_args=-XX:MaxNewSize=3g
+startup --host_jvm_args=-XX:-UseAdaptiveSizePolicy
+startup --host_jvm_args=-XX:+UseConcMarkSweepGC
+startup --host_jvm_args=-XX:TargetSurvivorRatio=70
+startup --host_jvm_args=-XX:SurvivorRatio=6
+startup --host_jvm_args=-XX:+UseCMSInitiatingOccupancyOnly
+startup --host_jvm_args=-XX:CMSFullGCsBeforeCompaction=1
+startup --host_jvm_args=-XX:CMSInitiatingOccupancyFraction=75
+
+build --jobs=100
+build --local_resources=200000,100,100
+build --crosstool_top=@local_config_clang6//clang6
+build --noexperimental_check_output_files
+build --nostamp
+build --config=opt
+build --noexperimental_check_output_files
+build --copt=-march=native
+build --host_copt=-march=native
+```
+
+# x86_64 Microarchitectures
+
+## Intel CPU Line
+
+- 2003 P6 M SSE SSE2
+- 2004 prescott SSE3 SSSE3 (-march=prescott)
+- 2006 core X64 SSE4.1 (only on 45nm variety) (-march=core2)
+- 2008 nehalem SSE4.2 VT-x VT-d (-march=nehalem)
+- 2010 westmere CLMUL AES (-march=westmere)
+- 2012 sandybridge AVX TXT (-march=sandybridge)
+- 2012 ivybridge F16C MOVBE (-march=ivybridge)
+- 2013 haswell AVX2 TSX BMI2 FMA (-march=haswell)
+- 2014 broadwell RDSEED ADCX PREFETCHW (-march=broadwell - works on trusty gcc4.9)
+- 2015 skylake SGX ADX MPX AVX-512[xeon-only] (-march=skylake / -march=skylake-avx512 - needs gcc7)
+- 2018 cannonlake AVX-512 SHA (-march=cannonlake - needs clang5)
+
+## Intel Low Power CPU Line
+
+- 2013 silvermont SSE4.1 SSE4.2 VT-x (-march=silvermont)
+- 2016 goldmont SHA (-march=goldmont - needs clang5)
+
+## AMD CPU Line
+
+- 2003 k8 SSE SSE2 (-march=k8)
+- 2005 k8 (Venus) SSE3 (-march=k8-sse3)
+- 2008 barcelona SSE4a?! (-march=barcelona)
+- 2011 bulldozer SSE4.1 SSE4.2 CLMUL AVX AES FMA4?! (-march=bdver1)
+- 2011 piledriver FMA (-march=bdver2)
+- 2015 excavator AVX2 BMI2 MOVBE (-march=bdver4)
+
+## Google Compute Engine Supported CPUs
+
+- 2012 sandybridge 2.6gHz -march=sandybridge
+- 2012 ivybridge 2.5gHz -march=ivybridge
+- 2013 haswell 2.3gHz -march=haswell
+- 2014 broadwell 2.2gHz -march=broadwell
+- 2015 skylake 2.0gHz -march=skylake-avx512
+
+See: <https://cloud.google.com/compute/docs/cpu-platforms>
diff --git a/third_party/toolchains/clang6/clang.BUILD b/third_party/toolchains/clang6/clang.BUILD
new file mode 100644
index 0000000000..802d62c17c
--- /dev/null
+++ b/third_party/toolchains/clang6/clang.BUILD
@@ -0,0 +1,162 @@
+package(default_visibility = ["//visibility:public"])
+
+# Please note that the output of these tools is unencumbered.
+licenses(["restricted"]) # NCSA, GPLv3 (e.g. gold)
+
+filegroup(
+ name = "ar",
+ srcs = ["llvm/bin/llvm-ar"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "as",
+ srcs = ["llvm/bin/llvm-as"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "cpp",
+ srcs = ["llvm/bin/llvm-cpp"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "dwp",
+ srcs = ["llvm/bin/llvm-dwp"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "gcc",
+ srcs = ["llvm/bin/clang"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "gcov",
+ srcs = ["llvm/bin/llvm-cov"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "ld",
+ srcs = ["llvm/bin/ld.lld"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "nm",
+ srcs = ["llvm/bin/llvm-nm"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "objcopy",
+ srcs = ["llvm/bin/llvm-objcopy"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "objdump",
+ srcs = ["llvm/bin/llvm-objdump"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "profdata",
+ srcs = ["llvm/bin/llvm-profdata"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "strip",
+ srcs = ["sbin/strip"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "xray",
+ srcs = ["llvm/bin/llvm-xray"],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "includes",
+ srcs = glob(["llvm/lib/clang/6.0.0/include/**"]),
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "libraries",
+ srcs = glob([
+ "lib/*.*",
+ "lib/clang/6.0.0/lib/linux/*.*",
+ ]),
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "compiler_files",
+ srcs = [
+ ":as",
+ ":gcc",
+ ":includes",
+ ],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "linker_files",
+ srcs = [
+ ":ar",
+ ":ld",
+ ":libraries",
+ ],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "all_files",
+ srcs = [
+ ":compiler_files",
+ ":dwp",
+ ":gcov",
+ ":linker_files",
+ ":nm",
+ ":objcopy",
+ ":objdump",
+ ":profdata",
+ ":strip",
+ ":xray",
+ ],
+ output_licenses = ["unencumbered"],
+)
+
+filegroup(
+ name = "empty",
+ srcs = [], # bazel crashes without this
+ output_licenses = ["unencumbered"],
+)
+
+cc_toolchain_suite(
+ name = "clang6",
+ toolchains = {
+ "k8|clang6": ":clang6-k8",
+ },
+)
+
+cc_toolchain(
+ name = "clang6-k8",
+ all_files = ":all_files",
+ compiler_files = ":compiler_files",
+ cpu = "k8",
+ dwp_files = ":dwp",
+ dynamic_runtime_libs = [":empty"],
+ linker_files = ":linker_files",
+ objcopy_files = ":objcopy",
+ output_licenses = ["unencumbered"],
+ static_runtime_libs = [":empty"],
+ strip_files = ":strip",
+ supports_param_files = 1,
+)
diff --git a/third_party/toolchains/clang6/repo.bzl b/third_party/toolchains/clang6/repo.bzl
new file mode 100644
index 0000000000..b81f44506f
--- /dev/null
+++ b/third_party/toolchains/clang6/repo.bzl
@@ -0,0 +1,30 @@
+"""Repository rule for Debian 8 Jessie Clang-6.0 portable Linux builds."""
+
+def _clang6_configure(ctx):
+ # TODO(jart): It'd probably be better to use Bazel's struct.to_proto()
+ # method to generate a gigantic CROSSTOOL file that allows
+ # Clang to support everything.
+ ctx.symlink(
+ ctx.os.environ.get('TF_LLVM_PATH',
+ '/usr/lib/llvm-6.0'),
+ 'clang6/llvm')
+ ctx.symlink(
+ ctx.os.environ.get('STRIP', '/usr/bin/strip'),
+ 'clang6/sbin/strip')
+ ctx.symlink(
+ ctx.os.environ.get('OBJDUMP', '/usr/bin/objdump'),
+ 'clang6/sbin/objdump')
+ ctx.symlink(ctx.attr._build, 'clang6/BUILD')
+ ctx.template('clang6/CROSSTOOL', ctx.attr._crosstool, {
+ '%package(@local_config_clang6//clang6)%': str(ctx.path('clang6')),
+ })
+
+clang6_configure = repository_rule(
+ implementation = _clang6_configure,
+ attrs = {
+ '_build': attr.label(
+ default=str(Label('//third_party/toolchains/clang6:clang.BUILD'))),
+ '_crosstool': attr.label(
+ default=str(Label('//third_party/toolchains/clang6:CROSSTOOL.tpl'))),
+ },
+)