diff options
| author | Florian Hahn <florian.hahn@arm.com> | 2016-12-01 11:02:59 +0000 |
|---|---|---|
| committer | Florian Hahn <florian.hahn@arm.com> | 2016-12-01 11:02:59 +0000 |
| commit | 15be03a922f85c97b65d606d6e8b3691c0d69504 (patch) | |
| tree | 7a3fe8f1c3824432621e102d607ae82880845232 /clang | |
| parent | 2ce221646903a31d41fc7cdd98f94a2c50eee23f (diff) | |
| download | bcm5719-llvm-15be03a922f85c97b65d606d6e8b3691c0d69504.tar.gz bcm5719-llvm-15be03a922f85c97b65d606d6e8b3691c0d69504.zip | |
Fix crash with unsupported architectures in Linux/Gnu target triples.
Summary: This patch adds a check and an error message to gnutools::Linker::ConstructJob in case the architecture is not supported. For most other operating systems, the error message is created in lib/Basic/Targets.cpp:AllocateTarget, but when construction the linker arguments for the gnutools linker a supported architecture is required.
Reviewers: rafael, joerg, echristo
Subscribers: mehdi_amini, joerg, dschuff, cfe-commits
Differential Revision: https://reviews.llvm.org/D27066
llvm-svn: 288327
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 11 | ||||
| -rw-r--r-- | clang/test/Driver/unsupported-target-arch.c | 25 |
2 files changed, 33 insertions, 3 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 8760b85e4fb..757c0ced3ce 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -9941,7 +9941,7 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) { return "elf32_x86_64"; return "elf_x86_64"; default: - llvm_unreachable("Unexpected arch"); + return nullptr; } } @@ -10014,8 +10014,13 @@ void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("--eh-frame-hdr"); } - CmdArgs.push_back("-m"); - CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args)); + if (const char *LDMOption = getLDMOption(ToolChain.getTriple(), Args)) { + CmdArgs.push_back("-m"); + CmdArgs.push_back(LDMOption); + } else { + D.Diag(diag::err_target_unknown_triple) << Triple.str(); + return; + } if (Args.hasArg(options::OPT_static)) { if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb || diff --git a/clang/test/Driver/unsupported-target-arch.c b/clang/test/Driver/unsupported-target-arch.c new file mode 100644 index 00000000000..7c55850f499 --- /dev/null +++ b/clang/test/Driver/unsupported-target-arch.c @@ -0,0 +1,25 @@ +// Tests that clang does not crash with invalid architectures in target triples. +// +// RUN: not %clang --target=noarch-unknown-linux -o %t.o %s 2> %t.err +// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-NOARCH-LINUX %s +// CHECK-NOARCH-LINUX: error: unknown target triple 'noarch-unknown-linux', please use -triple or -arch +// +// RUN: not %clang --target=noarch-unknown-darwin -o %t.o %s 2> %t.err +// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-NOARCH-DARWIN %s +// CHECK-NOARCH-DARWIN: error: unknown target triple 'unknown-unknown-macosx{{.+}}', please use -triple or -arch +// +// RUN: not %clang --target=noarch-unknown-windows -o %t.o %s 2> %t.err +// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-NOARCH-WINDOWS %s +// CHECK-NOARCH-WINDOWS: error: unknown target triple 'noarch-unknown-windows-{{.+}}', please use -triple or -arch +// +// RUN: not %clang --target=noarch-unknown-freebsd -o %t.o %s 2> %t.err +// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-NOARCH-FREEBSD %s +// CHECK-NOARCH-FREEBSD: error: unknown target triple 'noarch-unknown-freebsd', please use -triple or -arch +// +// RUN: not %clang --target=noarch-unknown-netbsd -o %t.o %s 2> %t.err +// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-NOARCH-NETBSD %s +// CHECK-NOARCH-NETBSD: error: unknown target triple 'noarch-unknown-netbsd', please use -triple or -arch +// +// RUN: not %clang --target=noarch-unknown-nacl -o %t.o %s 2> %t.err +// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-NOARCH-NACL %s +// CHECK-NOARCH-NACL: error: the target architecture 'noarch' is not supported by the target 'Native Client' |

