[cfe-commits] [PATCH] Support ARM hard float (arm-linux-gnueabihf) in clang driver
Jiangning Liu
jiangning.liu at arm.com
Thu Jul 26 01:33:53 PDT 2012
PING... Who can help to review this piece of code change?
Thanks,
-Jiangning
> -----Original Message-----
> From: cfe-commits-bounces at cs.uiuc.edu [mailto:cfe-commits-
> bounces at cs.uiuc.edu] On Behalf Of Jiangning Liu
> Sent: Friday, July 13, 2012 4:07 PM
> To: cfe-commits at cs.uiuc.edu
> Subject: [cfe-commits] [PATCH] Support ARM hard float (arm-linux-
> gnueabihf) in clang driver
>
> Hi,
>
> Clang driver doesn't support folder structure for ARM hard float
> architecture yet, so this patch intends to add this support. With this
> patch, Clang driver will be able to find correct library paths for
> target arm-linux-gnueabihf. A new test input folder is added for
> ubuntu_12.04_LTS_multiarch_tree accordingly.
>
> Thanks,
> -Jiangning
>
> diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index
> b858c3e..ecaab40 100644
> --- a/lib/Driver/ToolChains.cpp
> +++ b/lib/Driver/ToolChains.cpp
> @@ -1098,6 +1098,9 @@
> Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
> "arm-linux-gnueabi",
> "arm-linux-androideabi"
> };
> + static const char *const ARMHFTriples[] = {
> + "arm-linux-gnueabihf",
> + };
>
> static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
> static const char *const X86_64Triples[] = { @@ -1154,8 +1157,13 @@
> Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
> case llvm::Triple::arm:
> case llvm::Triple::thumb:
> LibDirs.append(ARMLibDirs, ARMLibDirs +
> llvm::array_lengthof(ARMLibDirs));
> - TripleAliases.append(
> - ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
> + if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
> + TripleAliases.append(
> + ARMHFTriples, ARMHFTriples +
> llvm::array_lengthof(ARMHFTriples));
> + } else {
> + TripleAliases.append(
> + ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
> + }
> break;
> case llvm::Triple::x86_64:
> LibDirs.append(
> @@ -1907,8 +1915,13 @@ static std::string getMultiarchTriple(const
> llvm::Triple TargetTriple,
> // regardless of what the actual target triple is.
> case llvm::Triple::arm:
> case llvm::Triple::thumb:
> - if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
> - return "arm-linux-gnueabi";
> + if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
> + if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
> + return "arm-linux-gnueabihf";
> + } else {
> + if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
> + return "arm-linux-gnueabi";
> + }
> return TargetTriple.str();
> case llvm::Triple::x86:
> if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu")) @@ -
> 2154,7 +2167,12 @@ void Linux::AddClangSystemIncludeArgs(const ArgList
> &DriverArgs,
> "/usr/include/i486-linux-gnu"
> };
> const StringRef ARMMultiarchIncludeDirs[] = {
> - "/usr/include/arm-linux-gnueabi"
> + "/usr/include/arm-linux-gnueabi",
> + "/usr/arm-linux-gnueabi/include"
> + };
> + const StringRef ARMHFMultiarchIncludeDirs[] = {
> + "/usr/include/arm-linux-gnueabihf",
> + "/usr/arm-linux-gnueabihf/include"
> };
> const StringRef MIPSMultiarchIncludeDirs[] = {
> "/usr/include/mips-linux-gnu"
> @@ -2174,7 +2192,10 @@ void Linux::AddClangSystemIncludeArgs(const
> ArgList &DriverArgs,
> } else if (getTriple().getArch() == llvm::Triple::x86) {
> MultiarchIncludeDirs = X86MultiarchIncludeDirs;
> } else if (getTriple().getArch() == llvm::Triple::arm) {
> - MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
> + if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
> + MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
> + else
> + MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
> } else if (getTriple().getArch() == llvm::Triple::mips) {
> MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
> } else if (getTriple().getArch() == llvm::Triple::mipsel) { diff --
> git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp old mode 100644 new
> mode 100755 index 66d792f..7a365c0
> --- a/lib/Driver/Tools.cpp
> +++ b/lib/Driver/Tools.cpp
> @@ -629,16 +629,11 @@ static StringRef getARMFloatABI(const Driver &D,
> break;
> }
>
> - case llvm::Triple::Linux: {
> - if (Triple.getEnvironment() == llvm::Triple::GNUEABI) {
> - FloatABI = "softfp";
> - break;
> - }
> - }
> - // fall through
> -
> default:
> switch(Triple.getEnvironment()) {
> + case llvm::Triple::GNUEABIHF:
> + FloatABI = "hard";
> + break;
> case llvm::Triple::GNUEABI:
> FloatABI = "softfp";
> break;
> @@ -685,6 +680,7 @@ void Clang::AddARMTargetArgs(const ArgList &Args,
> switch(Triple.getEnvironment()) {
> case llvm::Triple::ANDROIDEABI:
> case llvm::Triple::GNUEABI:
> + case llvm::Triple::GNUEABIHF:
> ABIName = "aapcs-linux";
> break;
> case llvm::Triple::EABI:
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/lib/.keep
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/lib/.keep
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/include/.keep
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/include/.keep
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/.keep
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/.keep
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bi/crt1.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bi/crt1.o
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bi/crti.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bi/crti.o
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bi/crtn.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bi/crtn.o
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bihf/crt1.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bihf/crt1.o
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bihf/crti.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bihf/crti.o
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bihf/crtn.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/arm-linux-
> gnuea
> bihf/crtn.o
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/gcc/arm-
> linux-g
> nueabi/4.6.1/crtbegin.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/gcc/arm-
> linux-g
> nueabi/4.6.1/crtbegin.o
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/gcc/arm-
> linux-g
> nueabi/4.6.1/crtend.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/gcc/arm-
> linux-g
> nueabi/4.6.1/crtend.o
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/gcc/arm-
> linux-g
> nueabihf/4.6.3/crtbegin.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/gcc/arm-
> linux-g
> nueabihf/4.6.3/crtbegin.o
> new file mode 100644
> index 0000000..e69de29
> diff --git
> a/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/gcc/arm-
> linux-g
> nueabihf/4.6.3/crtend.o
> b/test/Driver/Inputs/ubuntu_12.04_LTS_multiarch_tree/usr/lib/gcc/arm-
> linux-g
> nueabihf/4.6.3/crtend.o
> new file mode 100644
> index 0000000..e69de29
> diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c index
> a9decfd..89f3bc3 100644
> --- a/test/Driver/linux-ld.c
> +++ b/test/Driver/linux-ld.c
> @@ -174,6 +174,39 @@
> // CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/lib"
> // CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib"
> //
> +// Check multi arch support on Ubuntu 12.04 LTS.
> +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
> +// RUN: -target arm-unknown-linux-gnueabihf \
> +// RUN: --sysroot=%S/Inputs/ubuntu_12.04_LTS_multiarch_tree \
> +// RUN: | FileCheck --check-prefix=CHECK-UBUNTU-12-04-ARM-HF %s
> +// CHECK-UBUNTU-12-04-ARM-HF: "{{.*}}ld{{(.exe)?}}"
> "--sysroot=[[SYSROOT:[^"]+]]"
> +// CHECK-UBUNTU-12-04-ARM-HF:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/../../../arm-linux-
> gnueabihf/c
> rt1.o"
> +// CHECK-UBUNTU-12-04-ARM-HF:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/../../../arm-linux-
> gnueabihf/c
> rti.o"
> +// CHECK-UBUNTU-12-04-ARM-HF:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/crtbegin.o"
> +// CHECK-UBUNTU-12-04-ARM-HF:
> "-L[[SYSROOT]]/usr/lib/gcc/arm-linux-gnueabihf/4.6.3"
> +// CHECK-UBUNTU-12-04-ARM-HF:
> "-L[[SYSROOT]]/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/../../../arm-linux-
> gnue
> abihf"
> +// CHECK-UBUNTU-12-04-ARM-HF: "-L[[SYSROOT]]/lib/arm-linux-gnueabihf"
> +// CHECK-UBUNTU-12-04-ARM-HF: "-L[[SYSROOT]]/usr/lib/arm-linux-
> gnueabihf"
> +// CHECK-UBUNTU-12-04-ARM-HF:
> "-L[[SYSROOT]]/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/../../.."
> +// CHECK-UBUNTU-12-04-ARM-HF:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/crtend.o"
> +// CHECK-UBUNTU-12-04-ARM-HF:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/../../../arm-linux-
> gnueabihf/c
> rtn.o"
> +//
> +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
> +// RUN: -target arm-unknown-linux-gnueabi \
> +// RUN: --sysroot=%S/Inputs/ubuntu_12.04_LTS_multiarch_tree \
> +// RUN: | FileCheck --check-prefix=CHECK-UBUNTU-12-04-ARM %s
> +// CHECK-UBUNTU-12-04-ARM: "{{.*}}ld{{(.exe)?}}"
> "--sysroot=[[SYSROOT:[^"]+]]"
> +// CHECK-UBUNTU-12-04-ARM:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabi/4.6.1/../../../arm-linux-
> gnueabi/crt1.
> o"
> +// CHECK-UBUNTU-12-04-ARM:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabi/4.6.1/../../../arm-linux-
> gnueabi/crti.
> o"
> +// CHECK-UBUNTU-12-04-ARM:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabi/4.6.1/crtbegin.o"
> +// CHECK-UBUNTU-12-04-ARM:
> "-L[[SYSROOT]]/usr/lib/gcc/arm-linux-gnueabi/4.6.1"
> +// CHECK-UBUNTU-12-04-ARM:
> "-L[[SYSROOT]]/usr/lib/gcc/arm-linux-gnueabi/4.6.1/../../../arm-linux-
> gnueab
> i"
> +// CHECK-UBUNTU-12-04-ARM: "-L[[SYSROOT]]/lib/arm-linux-gnueabi"
> +// CHECK-UBUNTU-12-04-ARM: "-L[[SYSROOT]]/usr/lib/arm-linux-gnueabi"
> +// CHECK-UBUNTU-12-04-ARM:
> "-L[[SYSROOT]]/usr/lib/gcc/arm-linux-gnueabi/4.6.1/../../.."
> +// CHECK-UBUNTU-12-04-ARM:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabi/4.6.1/crtend.o"
> +// CHECK-UBUNTU-12-04-ARM:
> "{{.*}}/usr/lib/gcc/arm-linux-gnueabi/4.6.1/../../../arm-linux-
> gnueabi/crtn.
> o"
> +//
> // Test the setup that shipped in SUSE 10.3 on ppc64.
> // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
> // RUN: -target powerpc64-suse-linux \
More information about the cfe-commits
mailing list