[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs added a comment. In https://reviews.llvm.org/D33259#772184, @mgorny wrote: > This causes a test failure with non-standard CLANG_RESOURCE_DIR: https://reviews.llvm.org/D33877 (thanks for the patch) https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
mgorny added a comment. This causes a test failure with non-standard CLANG_RESOURCE_DIR: Command Output (stderr): -- /var/tmp/portage/sys-devel/clang-/work/x/y/clang-/test/Driver/baremetal.cpp:8:22: error: expected string not found in input // CHECK-V6M-C-SAME: "-resource-dir" "[[PREFIX_DIR]]{{[/\\]+}}lib{{(64)?}}{{[/\\]+}}clang{{[/\\]+}}[[VERSION:[^"]*]]" ^ :5:128: note: scanning from here "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/./bin/clang" "-cc1" "-triple" "thumbv6m-none--eabi" "-emit-obj" "-mrelax-all" "-disable-free" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "baremetal.cpp" "-mrelocation-model" "static" "-mthread-model" "single" "-mdisable-fp-elim" "-fmath-errno" "-no-integrated-as" "-mconstructor-aliases" "-nostdsysteminc" "-target-cpu" "cortex-m0" "-target-feature" "+soft-float-abi" "-target-feature" "+strict-align" "-target-abi" "aapcs" "-mfloat-abi" "soft" "-dwarf-column-info" "-debugger-tuning=gdb" "-resource-dir" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/./bin/../../../../lib/clang/5.0.0" "-isysroot" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang-/test/Driver/Inputs/baremetal_arm" "-internal-isystem" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang-/test/Driver/Inputs/baremetal_arm/include/c++/v1" "-internal-isystem" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/./bin/../../../../lib/clang/5.0.0/include" "-internal-isystem" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang-/test/Driver/Inputs/baremetal_arm/include" "-fdeprecated-macro" "-fdebug-compilation-dir" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/test/Driver" "-ferror-limit" "19" "-fmessage-length" "0" "-fallow-half-arguments-and-returns" "-fno-signed-char" "-fobjc-runtime=gcc" "-fcxx-exceptions" "-fexceptions" "-fdiagnostics-show-option" "-o" "/var/tmp/portage/sys-devel/clang-/temp/baremetal-6b1d37.o" "-x" "c++" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang-/test/Driver/baremetal.cpp" ^ :5:128: note: with variable "PREFIX_DIR" equal to "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/." "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/./bin/clang" "-cc1" "-triple" "thumbv6m-none--eabi" "-emit-obj" "-mrelax-all" "-disable-free" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "baremetal.cpp" "-mrelocation-model" "static" "-mthread-model" "single" "-mdisable-fp-elim" "-fmath-errno" "-no-integrated-as" "-mconstructor-aliases" "-nostdsysteminc" "-target-cpu" "cortex-m0" "-target-feature" "+soft-float-abi" "-target-feature" "+strict-align" "-target-abi" "aapcs" "-mfloat-abi" "soft" "-dwarf-column-info" "-debugger-tuning=gdb" "-resource-dir" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/./bin/../../../../lib/clang/5.0.0" "-isysroot" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang-/test/Driver/Inputs/baremetal_arm" "-internal-isystem" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang-/test/Driver/Inputs/baremetal_arm/include/c++/v1" "-internal-isystem" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/./bin/../../../../lib/clang/5.0.0/include" "-internal-isystem" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang-/test/Driver/Inputs/baremetal_arm/include" "-fdeprecated-macro" "-fdebug-compilation-dir" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/test/Driver" "-ferror-limit" "19" "-fmessage-length" "0" "-fallow-half-arguments-and-returns" "-fno-signed-char" "-fobjc-runtime=gcc" "-fcxx-exceptions" "-fexceptions" "-fdiagnostics-show-option" "-o" "/var/tmp/portage/sys-devel/clang-/temp/baremetal-6b1d37.o" "-x" "c++" "/var/tmp/portage/sys-devel/clang-/work/x/y/clang-/test/Driver/baremetal.cpp" ^ :5:588: note: possible intended match here "/var/tmp/portage/sys-devel/clang-/work/x/y/clang--abi_x86_32.x86/./bin/clang" "-cc1" "-triple" "thumbv6m-none--eabi" "-emit-obj" "-mrelax-all" "-disable-free" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "baremetal.cpp" "-mrelocation-model" "static" "-mthread-model" "single" "-mdisable-fp-elim" "-fmath-errno" "-no-integrated-as" "-mconstructor-aliases" "-nostdsysteminc" "-target-cpu" "cortex-m0" "-target-feature" "+soft-float-abi" "-target-feature" "+strict-align" "-target-abi" "aapcs" "-mfloat-abi" "soft" "-dwarf-column-info" "-debugger-tuning=gdb" "-resource-dir"
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs closed this revision. jroelofs added a comment. r303873 https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs updated this revision to Diff 100177. jroelofs marked an inline comment as done. jroelofs added a comment. Fix a cmake warning: Platform/baremetal to use this system, please send your config file to cm...@www.cmake.org so it can be added to cmake Your CMakeCache.txt file was copied to CopyOfCMakeCache.txt. Please send that file to cm...@www.cmake.org. Generic does what we want already, it just has a name that's not useful. https://reviews.llvm.org/D33259 Files: cmake/caches/BaremetalARM.cmake lib/Driver/CMakeLists.txt lib/Driver/Driver.cpp lib/Driver/ToolChains/BareMetal.cpp lib/Driver/ToolChains/BareMetal.h lib/Driver/ToolChains/Gnu.cpp lib/Driver/ToolChains/Linux.cpp test/Driver/Inputs/baremetal_arm/include/c++/5.0.0/.keep test/Driver/Inputs/baremetal_arm/include/c++/6.0.0/.keep test/Driver/Inputs/baremetal_arm/include/c++/v1/.keep test/Driver/baremetal.cpp Index: test/Driver/baremetal.cpp === --- /dev/null +++ test/Driver/baremetal.cpp @@ -0,0 +1,77 @@ +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -T semihosted.lds \ +// RUN: -L some/directory/user/asked/for \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-C %s +// CHECK-V6M-C: "[[PREFIX_DIR:.*]]/bin/clang" "-cc1" "-triple" "thumbv6m-none--eabi" +// CHECK-V6M-C-SAME: "-resource-dir" "[[PREFIX_DIR]]/lib/clang/[[VERSION:[^"]*]]" +// CHECK-V6M-C-SAME: "-isysroot" "[[SYSROOT:[^"]*]]" +// CHECK-V6M-C-SAME: "-internal-isystem" "[[SYSROOT]]/include/c++/v1" +// CHECk-V6M-C-SAME: "-internal-isystem" "[[SYSROOT]]/include" +// CHECK-V6M-C-SAME: "-x" "c++" "{{.*}}baremetal.cpp" +// CHECK-V6M-C-NEXT: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-C-SAME: "-L[[PREFIX_DIR]]/lib/clang/[[VERSION]]/lib/baremetal" +// CHECK-V6M-C-SAME: "-T" "semihosted.lds" "-Lsome/directory/user/asked/for" +// CHECK-V6M-C-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-C-SAME: "-o" "{{.*}}.o" + +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -nostdlibinc -nobuiltininc \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBINC %s +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -nostdinc \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBINC %s +// CHECK-V6M-LIBINC-NOT: "-internal-isystem" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-DEFAULTCXX %s +// CHECK-V6M-DEFAULTCXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-DEFAULTCXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-DEFAULTCXX-SAME: "-lc++" "-lc++abi" "-lunwind" +// CHECK-V6M-DEFAULTCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-DEFAULTCXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: -stdlib=libc++ \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBCXX %s +// CHECK-V6M-LIBCXX-NOT: "-internal-isystem" "{{[^"]+}}/include/c++/{{[^v].*}}" +// CHECK-V6M-LIBCXX: "-internal-isystem" "{{[^"]+}}/include/c++/v1" +// CHECK-V6M-LIBCXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-LIBCXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-LIBCXX-SAME: "-lc++" "-lc++abi" "-lunwind" +// CHECK-V6M-LIBCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-LIBCXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: -stdlib=libstdc++ \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBSTDCXX %s +// CHECK-V6M-LIBSTDCXX-NOT: "-internal-isystem" "{{[^"]+}}/include/c++/v1" +// CHECK-V6M-LIBSTDCXX: "-internal-isystem" "{{[^"]+}}/include/c++/6.0.0" +// CHECK-V6M-LIBSTDCXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-LIBSTDCXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-LIBSTDCXX-SAME: "-lstdc++" "-lsupc++" "-lunwind" +// CHECK-V6M-LIBSTDCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-LIBSTDCXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: -nodefaultlibs \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-NDL %s +// CHECK-V6M-NDL: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-NDL-SAME:
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs marked 2 inline comments as done. jroelofs added inline comments. Comment at: lib/Driver/ToolChains/BareMetal.cpp:110 + SmallString<128> Dir(SysRoot); + llvm::sys::path::append(Dir, "include", "c++", "v1"); + return Dir.str(); compnerd wrote: > Is this layout consistent between libc++ and libstdc++? Damn, no it's not. Comment at: lib/Driver/ToolChains/BareMetal.cpp:130-133 +if (Value == "libc++") + return ToolChain::CST_Libcxx; +else if (Value == "libstdc++") + return ToolChain::CST_Libstdcxx; compnerd wrote: > Use `StringSwitch`? `StringSwitch` isn't great when you want to error out of the default case. That being said, this whole function is unnecessary: I can just defer to the base class' implementation, which does almost the same thing. Comment at: lib/Driver/ToolChains/BareMetal.h:39 + bool isPICDefaultForced() const override { return false; } + bool SupportsProfiling() const override { return true; } + bool SupportsObjCGC() const override { return false; } compnerd wrote: > Is the profiler support in compiler-rt sufficiently standalone to build it > for baremetal? IIRC, there was a test case that wanted this on for one of the arm-none-eabi triples. This is when my patches were against 4.0. After rebasing to trunk, I think that particular test is gone (split up into separate ones, I guess?). I'll leave it off for now until someone confirms it is actually supported. Comment at: lib/Driver/ToolChains/Linux.cpp:379 -/*static*/ -Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) { - const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""}; Noticed that this was in the wrong place, and also, surprisingly, that it was incorrectly qualified. https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs updated this revision to Diff 100131. jroelofs added a comment. implement feedback https://reviews.llvm.org/D33259 Files: cmake/caches/BaremetalARM.cmake lib/Driver/CMakeLists.txt lib/Driver/Driver.cpp lib/Driver/ToolChains/BareMetal.cpp lib/Driver/ToolChains/BareMetal.h lib/Driver/ToolChains/Gnu.cpp lib/Driver/ToolChains/Linux.cpp test/Driver/Inputs/baremetal_arm/include/c++/5.0.0/.keep test/Driver/Inputs/baremetal_arm/include/c++/6.0.0/.keep test/Driver/Inputs/baremetal_arm/include/c++/v1/.keep test/Driver/baremetal.cpp Index: test/Driver/baremetal.cpp === --- /dev/null +++ test/Driver/baremetal.cpp @@ -0,0 +1,77 @@ +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -T semihosted.lds \ +// RUN: -L some/directory/user/asked/for \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-C %s +// CHECK-V6M-C: "[[PREFIX_DIR:.*]]/bin/clang" "-cc1" "-triple" "thumbv6m-none--eabi" +// CHECK-V6M-C-SAME: "-resource-dir" "[[PREFIX_DIR]]/lib/clang/[[VERSION:[^"]*]]" +// CHECK-V6M-C-SAME: "-isysroot" "[[SYSROOT:[^"]*]]" +// CHECK-V6M-C-SAME: "-internal-isystem" "[[SYSROOT]]/include/c++/v1" +// CHECk-V6M-C-SAME: "-internal-isystem" "[[SYSROOT]]/include" +// CHECK-V6M-C-SAME: "-x" "c++" "{{.*}}baremetal.cpp" +// CHECK-V6M-C-NEXT: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-C-SAME: "-L[[PREFIX_DIR]]/lib/clang/[[VERSION]]/lib/baremetal" +// CHECK-V6M-C-SAME: "-T" "semihosted.lds" "-Lsome/directory/user/asked/for" +// CHECK-V6M-C-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-C-SAME: "-o" "{{.*}}.o" + +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -nostdlibinc -nobuiltininc \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBINC %s +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -nostdinc \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBINC %s +// CHECK-V6M-LIBINC-NOT: "-internal-isystem" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-DEFAULTCXX %s +// CHECK-V6M-DEFAULTCXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-DEFAULTCXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-DEFAULTCXX-SAME: "-lc++" "-lc++abi" "-lunwind" +// CHECK-V6M-DEFAULTCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-DEFAULTCXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: -stdlib=libc++ \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBCXX %s +// CHECK-V6M-LIBCXX-NOT: "-internal-isystem" "{{[^"]+}}/include/c++/{{[^v].*}}" +// CHECK-V6M-LIBCXX: "-internal-isystem" "{{[^"]+}}/include/c++/v1" +// CHECK-V6M-LIBCXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-LIBCXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-LIBCXX-SAME: "-lc++" "-lc++abi" "-lunwind" +// CHECK-V6M-LIBCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-LIBCXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: -stdlib=libstdc++ \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBSTDCXX %s +// CHECK-V6M-LIBSTDCXX-NOT: "-internal-isystem" "{{[^"]+}}/include/c++/v1" +// CHECK-V6M-LIBSTDCXX: "-internal-isystem" "{{[^"]+}}/include/c++/6.0.0" +// CHECK-V6M-LIBSTDCXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-LIBSTDCXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-LIBSTDCXX-SAME: "-lstdc++" "-lsupc++" "-lunwind" +// CHECK-V6M-LIBSTDCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-LIBSTDCXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: -nodefaultlibs \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-NDL %s +// CHECK-V6M-NDL: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-NDL-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" "-o" "{{.*}}.o" + +// RUN: %clangxx -target arm-none-eabi -v 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-THREAD-MODEL +// CHECK-THREAD-MODEL: Thread model: single Index: lib/Driver/ToolChains/Linux.cpp === ---
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
compnerd added inline comments. Comment at: cmake/caches/BaremetalARM.cmake:1 +set(LLVM_TARGETS_TO_BUILD ARM CACHE STRING "") + jroelofs wrote: > compnerd wrote: > > Please rename this file to `BareMetalARMv6.cmake`. (I'm interested in the > > suffix primarily). > My plan is to eventually add multilibs to this configuration, so while that > makes sense short term, I don't think it makes sense long term. > > With that in mind, do you still want me to rename it? I think it makes sense longer term still. ARMv6 vs ARMv7. Even if you do multilib, that wouldnt take care of that right? Comment at: lib/Driver/ToolChains/BareMetal.cpp:68 + SmallString<128> Dir(getDriver().ResourceDir); + llvm::sys::path::append(Dir, "lib", "baremetal"); + return Dir.str(); jroelofs wrote: > compnerd wrote: > > Why not just the standard `arm` directory? > There are a few differences between the stuff in the existing ones, and what > is needed on baremetal. For example __enable_execute_stack, emutls, as well > as anything else that assumes existence of pthreads support shouldn't be > there. Well, I think that "baremetal" here is a bad idea. How about using the android approach? Use `clang_rt.builtins-arm-baremetal.a` ? Comment at: lib/Driver/ToolChains/BareMetal.cpp:107-108 +ArgStringList ) const { + CmdArgs.push_back("-lc++"); + CmdArgs.push_back("-lc++abi"); + CmdArgs.push_back("-lunwind"); jroelofs wrote: > jroelofs wrote: > > compnerd wrote: > > > I think that this is a bit extreme. We already have `-stdlib=libc++` and > > > `-stdlib=libstdc++`. Why not just honor that? > > I wasn't going for "support every possible thing out of the tin", instead > > preferring incremental development :) > Added support for `-stdlib=`. > > I made the assumption that `-stdlib=libstdc++` implies the user wants > libsupc++ as their ABI library, though someone may want libstdc++ + > libc++abi, or other combinations. If that's the case, we can add `-abilib=`, > and likewise `-unwinder=`... but let's save that for another patch, on > another day. Yeah, switching between libc++/libc++abi and libstdc++/libsupc++ sounds reasonable. Anything beyond that is something which doesnt work well within the driver anyways. I should polish off my `-unwinder` patch. Comment at: lib/Driver/ToolChains/BareMetal.h:42 + + const char *getDefaultLinker() const override { return "ld.lld"; } + jroelofs wrote: > compnerd wrote: > > I think that this really should be `ld` still, as that is the canonical > > name for the linker. > You mean `lld`? > > ``` > $ lld > lld is a generic driver. > Invoke ld.lld (Unix), ld (macOS) or lld-link (Windows) instead. > ``` > > Or are you saying: "make binutils ld the default, not llvm's lld"? Im saying use the name "ld". ld is a symlink on most linux distributions these days. ld -> ld.gold, ld.bfd, ld.lld https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs marked 2 inline comments as done. jroelofs added inline comments. Comment at: lib/Driver/ToolChains/BareMetal.cpp:107-108 +ArgStringList ) const { + CmdArgs.push_back("-lc++"); + CmdArgs.push_back("-lc++abi"); + CmdArgs.push_back("-lunwind"); jroelofs wrote: > compnerd wrote: > > I think that this is a bit extreme. We already have `-stdlib=libc++` and > > `-stdlib=libstdc++`. Why not just honor that? > I wasn't going for "support every possible thing out of the tin", instead > preferring incremental development :) Added support for `-stdlib=`. I made the assumption that `-stdlib=libstdc++` implies the user wants libsupc++ as their ABI library, though someone may want libstdc++ + libc++abi, or other combinations. If that's the case, we can add `-abilib=`, and likewise `-unwinder=`... but let's save that for another patch, on another day. https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs updated this revision to Diff 99350. https://reviews.llvm.org/D33259 Files: cmake/caches/BaremetalARM.cmake lib/Driver/CMakeLists.txt lib/Driver/Driver.cpp lib/Driver/ToolChains/BareMetal.cpp lib/Driver/ToolChains/BareMetal.h test/Driver/Inputs/baremetal_arm/include/c++/v1/.keep test/Driver/baremetal.cpp Index: test/Driver/baremetal.cpp === --- /dev/null +++ test/Driver/baremetal.cpp @@ -0,0 +1,53 @@ +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -T semihosted.lds \ +// RUN: -L some/directory/user/asked/for \ +// RUN: --sysroot=%S/Inputs/baremetal_arm \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-C %s +// CHECK-V6M-C: "[[PREFIX_DIR:.*]]/bin/clang" "-cc1" "-triple" "thumbv6m-none--eabi" +// CHECK-V6M-C-SAME: "-resource-dir" "[[PREFIX_DIR]]/lib/clang/[[VERSION:[^"]*]]" +// CHECK-V6M-C-SAME: "-isysroot" "[[SYSROOT:[^"]*]]" +// CHECK-V6M-C-SAME: "-internal-isystem" "[[SYSROOT]]/include/c++/v1" +// CHECk-V6M-C-SAME: "-internal-isystem" "[[SYSROOT]]/include" +// CHECK-V6M-C-SAME: "-x" "c++" "{{.*}}baremetal.cpp" +// CHECK-V6M-C-NEXT: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-C-SAME: "-L[[PREFIX_DIR]]/lib/clang/[[VERSION]]/lib/baremetal" +// CHECK-V6M-C-SAME: "-T" "semihosted.lds" "-Lsome/directory/user/asked/for" +// CHECK-V6M-C-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-C-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-DEFAULTCXX %s +// CHECK-V6M-DEFAULTCXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-DEFAULTCXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-DEFAULTCXX-SAME: "-lc++" "-lc++abi" "-lunwind" +// CHECK-V6M-DEFAULTCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-DEFAULTCXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -stdlib=libc++ \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBCXX %s +// CHECK-V6M-LIBCXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-LIBCXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-LIBCXX-SAME: "-lc++" "-lc++abi" "-lunwind" +// CHECK-V6M-LIBCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-LIBCXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -stdlib=libstdc++ \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-LIBSTDCXX %s +// CHECK-V6M-LIBSTDCXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-LIBSTDCXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-LIBSTDCXX-SAME: "-lstdc++" "-lsupc++" "-lunwind" +// CHECK-V6M-LIBSTDCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-LIBSTDCXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -nodefaultlibs \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-NDL %s +// CHECK-V6M-NDL: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-NDL-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" "-o" "{{.*}}.o" Index: lib/Driver/ToolChains/BareMetal.h === --- /dev/null +++ lib/Driver/ToolChains/BareMetal.h @@ -0,0 +1,84 @@ +//===--- BareMetal.h - Bare Metal Tool and ToolChain -*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===--===// + +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H + +#include "clang/Driver/Tool.h" +#include "clang/Driver/ToolChain.h" + +#include + +namespace clang { +namespace driver { + +namespace toolchains { + +class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain { +public: + BareMetal(const Driver , const llvm::Triple , +const llvm::opt::ArgList ); + ~BareMetal() override; + + static bool handlesTarget(const llvm::Triple ); +protected: + Tool *buildLinker() const override; + +public: + bool useIntegratedAs() const override { return true; } + bool isCrossCompiling() const override { return true; } + bool isPICDefault() const override { return false; } + bool isPIEDefault() const override { return false; } + bool isPICDefaultForced() const override { return false; } + bool SupportsProfiling() const override { return true; } + bool SupportsObjCGC() const override { return false; } + + const char *getDefaultLinker() const override {
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs added inline comments. Comment at: lib/Driver/ToolChains/BareMetal.h:42 + + const char *getDefaultLinker() const override { return "ld.lld"; } + compnerd wrote: > I think that this really should be `ld` still, as that is the canonical name > for the linker. You mean `lld`? ``` $ lld lld is a generic driver. Invoke ld.lld (Unix), ld (macOS) or lld-link (Windows) instead. ``` Or are you saying: "make binutils ld the default, not llvm's lld"? https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs planned changes to this revision. jroelofs added inline comments. Comment at: cmake/caches/BaremetalARM.cmake:1 +set(LLVM_TARGETS_TO_BUILD ARM CACHE STRING "") + compnerd wrote: > Please rename this file to `BareMetalARMv6.cmake`. (I'm interested in the > suffix primarily). My plan is to eventually add multilibs to this configuration, so while that makes sense short term, I don't think it makes sense long term. With that in mind, do you still want me to rename it? Comment at: lib/Driver/ToolChains/BareMetal.cpp:68 + SmallString<128> Dir(getDriver().ResourceDir); + llvm::sys::path::append(Dir, "lib", "baremetal"); + return Dir.str(); compnerd wrote: > Why not just the standard `arm` directory? There are a few differences between the stuff in the existing ones, and what is needed on baremetal. For example __enable_execute_stack, emutls, as well as anything else that assumes existence of pthreads support shouldn't be there. Comment at: lib/Driver/ToolChains/BareMetal.cpp:74 + SmallString<128> Dir(getDriver().ResourceDir); + llvm::sys::path::append(Dir, "include", "c++", "v1"); + return Dir.str(); compnerd wrote: > This seems wrong. The libc++ headers should *not* be in the resource dir. > This should be based off of the sysroot IMO. Oh, excellent point. I was just making that same argument a few weeks ago. Comment at: lib/Driver/ToolChains/BareMetal.cpp:107-108 +ArgStringList ) const { + CmdArgs.push_back("-lc++"); + CmdArgs.push_back("-lc++abi"); + CmdArgs.push_back("-lunwind"); compnerd wrote: > I think that this is a bit extreme. We already have `-stdlib=libc++` and > `-stdlib=libstdc++`. Why not just honor that? I wasn't going for "support every possible thing out of the tin", instead preferring incremental development :) https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
compnerd requested changes to this revision. compnerd added inline comments. This revision now requires changes to proceed. Comment at: cmake/caches/BaremetalARM.cmake:1 +set(LLVM_TARGETS_TO_BUILD ARM CACHE STRING "") + Please rename this file to `BareMetalARMv6.cmake`. (I'm interested in the suffix primarily). Comment at: lib/Driver/ToolChains/BareMetal.cpp:68 + SmallString<128> Dir(getDriver().ResourceDir); + llvm::sys::path::append(Dir, "lib", "baremetal"); + return Dir.str(); Why not just the standard `arm` directory? Comment at: lib/Driver/ToolChains/BareMetal.cpp:74 + SmallString<128> Dir(getDriver().ResourceDir); + llvm::sys::path::append(Dir, "include", "c++", "v1"); + return Dir.str(); This seems wrong. The libc++ headers should *not* be in the resource dir. This should be based off of the sysroot IMO. Comment at: lib/Driver/ToolChains/BareMetal.cpp:107-108 +ArgStringList ) const { + CmdArgs.push_back("-lc++"); + CmdArgs.push_back("-lc++abi"); + CmdArgs.push_back("-lunwind"); I think that this is a bit extreme. We already have `-stdlib=libc++` and `-stdlib=libstdc++`. Why not just honor that? Comment at: lib/Driver/ToolChains/BareMetal.h:42 + + const char *getDefaultLinker() const override { return "ld.lld"; } + I think that this really should be `ld` still, as that is the canonical name for the linker. Comment at: lib/Driver/ToolChains/BareMetal.h:57 + llvm::opt::ArgStringList ) const; +protected: +}; Unnecessary? Comment at: lib/Driver/ToolChains/BareMetal.h:67 +public: + Linker(const ToolChain ) : Tool("baremetal::Linker", "ld.lld", TC) {} + bool isLinkJob() const override { return true; } Update this accordingly. https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs added a comment. > I would expect this to changes wildly depending on the specific environment. My assertion is that our default "specific environment" ought to cater to using llvm's own tools... at least until someone comes along and says they actually want `-fuse-ld=gcc`, or whatever. https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
joerg added a comment. While I fully agree that the current fallback-to-GCC behavior is far from helpful, I'm not sure how much sense providing linker support for bare-metal makes. I would expect this to changes wildly depending on the specific environment. https://reviews.llvm.org/D33259 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs updated this revision to Diff 99210. jroelofs added a comment. pass through linker flags, and remove my own paths from the test. https://reviews.llvm.org/D33259 Files: cmake/caches/BaremetalARM.cmake lib/Driver/CMakeLists.txt lib/Driver/Driver.cpp lib/Driver/ToolChains/BareMetal.cpp lib/Driver/ToolChains/BareMetal.h test/Driver/baremetal.cpp Index: test/Driver/baremetal.cpp === --- /dev/null +++ test/Driver/baremetal.cpp @@ -0,0 +1,31 @@ +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -T semihosted.lds \ +// RUN: -L some/directory/user/asked/for \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-C %s +// CHECK-V6M-C: "[[PREFIX_DIR:.*]]/bin/clang" "-cc1" "-triple" "thumbv6m-none--eabi" +// CHECK-V6M-C-SAME: "-resource-dir" "[[PREFIX_DIR]]/lib/clang/[[VERSION:[^"]*]]" +// CHECK-V6M-C-SAME: "-internal-isystem" "[[PREFIX_DIR]]/lib/clang/[[VERSION]]/include/c++/v1" +// CHECk-V6M-C-SAME: "-internal-isystem" "[[PREFIX_DIR]]/lib/clang/[[VERSION]]/include" +// CHECK-V6M-C-SAME: "-x" "c++" "{{.*}}baremetal.cpp" +// CHECK-V6M-C-NEXT: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-C-SAME: "-L[[PREFIX_DIR]]/lib/clang/[[VERSION]]/lib/baremetal" +// CHECK-V6M-C-SAME: "-T" "semihosted.lds" "-Lsome/directory/user/asked/for" +// CHECK-V6M-C-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-C-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-CXX %s +// CHECK-V6M-CXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-CXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-CXX-SAME: "-lc++" "-lc++abi" "-lunwind" +// CHECK-V6M-CXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-CXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -nodefaultlibs \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-NDL %s +// CHECK-V6M-NDL: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-NDL-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" "-o" "{{.*}}.o" Index: lib/Driver/ToolChains/BareMetal.h === --- /dev/null +++ lib/Driver/ToolChains/BareMetal.h @@ -0,0 +1,82 @@ +//===--- BareMetal.h - Bare Metal Tool and ToolChain -*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===--===// + +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H + +#include "clang/Driver/Tool.h" +#include "clang/Driver/ToolChain.h" + +#include + +namespace clang { +namespace driver { + +namespace toolchains { + +class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain { +public: + BareMetal(const Driver , const llvm::Triple , +const llvm::opt::ArgList ); + ~BareMetal() override; + + static bool handlesTarget(const llvm::Triple ); +protected: + Tool *buildLinker() const override; + +public: + bool useIntegratedAs() const override { return true; } + bool isCrossCompiling() const override { return true; } + bool isPICDefault() const override { return false; } + bool isPIEDefault() const override { return false; } + bool isPICDefaultForced() const override { return false; } + bool SupportsProfiling() const override { return true; } + bool SupportsObjCGC() const override { return false; } + + const char *getDefaultLinker() const override { return "ld.lld"; } + + std::string getRuntimesDir() const; + std::string findLibCxxIncludePath() const; + void AddClangSystemIncludeArgs(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; + void addClangTargetOptions(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; + void AddClangCXXStdlibIncludeArgs( + const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; + void AddCXXStdlibLibArgs(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; + void AddLinkRuntimeLib(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const; +protected: +}; + +} // namespace toolchains + +namespace tools { +namespace baremetal { + +class LLVM_LIBRARY_VISIBILITY Linker : public Tool { +public: + Linker(const ToolChain ) : Tool("baremetal::Linker", "ld.lld", TC) {} + bool isLinkJob() const override { return true; } + bool hasIntegratedCPP() const override { return false; } + void ConstructJob(Compilation ,
[PATCH] D33259: Don't defer to the GCC driver for linking arm-baremetal
jroelofs created this revision. Herald added subscribers: javed.absar, mgorny, rengolin, aemerson. https://reviews.llvm.org/D33259 Files: cmake/caches/BaremetalARM.cmake lib/Driver/CMakeLists.txt lib/Driver/Driver.cpp lib/Driver/ToolChains/BareMetal.cpp lib/Driver/ToolChains/BareMetal.h test/Driver/baremetal.cpp Index: test/Driver/baremetal.cpp === --- /dev/null +++ test/Driver/baremetal.cpp @@ -0,0 +1,28 @@ +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-C %s +// CHECK-V6M-C: "[[PREFIX_DIR:.*]]/bin/clang" "-cc1" "-triple" "thumbv6m-none--eabi" +// CHECK-V6M-C-SAME: "-resource-dir" "/scratch/jroelofs/arm-lite/./lib/clang/5.0.0" +// CHECK-V6M-C-SAME: "-internal-isystem" "/scratch/jroelofs/arm-lite/./lib/clang/5.0.0/include/c++/v1" +// CHECk-V6M-C-SAME: "-internal-isystem" "/scratch/jroelofs/arm-lite/./lib/clang/5.0.0/include" +// CHECK-V6M-C-SAME: "-x" "c++" "{{.*}}baremetal.cpp" +// CHECK-V6M-C-NEXT: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-C-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-C-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-C-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-CXX %s +// CHECK-V6M-CXX: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-CXX-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" +// CHECK-V6M-CXX-SAME: "-lc++" "-lc++abi" "-lunwind" +// CHECK-V6M-CXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m.a" +// CHECK-V6M-CXX-SAME: "-o" "{{.*}}.o" + +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: -nodefaultlibs \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-NDL %s +// CHECK-V6M-NDL: "[[PREFIX_DIR:.*]]/bin/ld.lld" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-NDL-SAME: "-L[[PREFIX_DIR]]/lib/clang/{{.*}}/lib/baremetal" "-o" "{{.*}}.o" Index: lib/Driver/ToolChains/BareMetal.h === --- /dev/null +++ lib/Driver/ToolChains/BareMetal.h @@ -0,0 +1,82 @@ +//===--- BareMetal.h - Bare Metal Tool and ToolChain -*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===--===// + +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H + +#include "clang/Driver/Tool.h" +#include "clang/Driver/ToolChain.h" + +#include + +namespace clang { +namespace driver { + +namespace toolchains { + +class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain { +public: + BareMetal(const Driver , const llvm::Triple , +const llvm::opt::ArgList ); + ~BareMetal() override; + + static bool handlesTarget(const llvm::Triple ); +protected: + Tool *buildLinker() const override; + +public: + bool useIntegratedAs() const override { return true; } + bool isCrossCompiling() const override { return true; } + bool isPICDefault() const override { return false; } + bool isPIEDefault() const override { return false; } + bool isPICDefaultForced() const override { return false; } + bool SupportsProfiling() const override { return true; } + bool SupportsObjCGC() const override { return false; } + + const char *getDefaultLinker() const override { return "ld.lld"; } + + std::string getRuntimesDir() const; + std::string findLibCxxIncludePath() const; + void AddClangSystemIncludeArgs(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; + void addClangTargetOptions(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; + void AddClangCXXStdlibIncludeArgs( + const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; + void AddCXXStdlibLibArgs(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; + void AddLinkRuntimeLib(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const; +protected: +}; + +} // namespace toolchains + +namespace tools { +namespace baremetal { + +class LLVM_LIBRARY_VISIBILITY Linker : public Tool { +public: + Linker(const ToolChain ) : Tool("baremetal::Linker", "ld.lld", TC) {} + bool isLinkJob() const override { return true; } + bool hasIntegratedCPP() const override { return false; } + void ConstructJob(Compilation , const JobAction , +const InputInfo , const InputInfoList , +const llvm::opt::ArgList , +const char *LinkingOutput) const override;