lang/clang: Improve DragonFly support
1) Don't pass both gcc 4.4 and gcc 4.7 paths to the driver. Detect if gcc47 is available and use those paths, otherwise fall back to gcc44. 2) Add support for exception handling 3) Add rdynamic support 4) Add gnu-hash style support 5) Fix (!!) crtstuff (This was obsolete, include PIE support) 6) Remove rpath-link 7) Remove unneeded duplicate libgcc handling 8) Make libgcc handling match gcc specs (different for gcc 4.4 and 4.7) 9) Update dragonfly driver test
This commit is contained in:
parent
e782f4e0fa
commit
9b5ae05fa2
6 changed files with 221 additions and 29 deletions
|
@ -1,7 +1,7 @@
|
|||
# $NetBSD: Makefile,v 1.16 2012/11/22 22:45:15 marino Exp $
|
||||
# $NetBSD: Makefile,v 1.17 2012/11/29 11:42:24 marino Exp $
|
||||
|
||||
DISTNAME= clang-3.1
|
||||
PKGREVISION= 2
|
||||
PKGREVISION= 3
|
||||
CATEGORIES= lang
|
||||
MASTER_SITES= http://llvm.org/releases/${PKGVERSION_NOREV}/
|
||||
DISTFILES= llvm-${PKGVERSION_NOREV}.src.tar.gz \
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
$NetBSD: distinfo,v 1.12 2012/11/22 22:45:15 marino Exp $
|
||||
$NetBSD: distinfo,v 1.13 2012/11/29 11:42:24 marino Exp $
|
||||
|
||||
SHA1 (clang-3.1.src.tar.gz) = 19f33b187a50d22fda2a6f9ed989699a9a9efd62
|
||||
RMD160 (clang-3.1.src.tar.gz) = 5ae09d3d69d4f1e50e07f6bf3474da96e6a84feb
|
||||
|
@ -10,5 +10,7 @@ SHA1 (patch-ab) = 140ac84d513cf20c9eb30a9e8e2f6b87bdd074fe
|
|||
SHA1 (patch-ac) = 676fbc85e25a8d338a7ac13f79af53666b27da4a
|
||||
SHA1 (patch-ad) = 2767a9931b157552f8d6796641e23cce7979dc3d
|
||||
SHA1 (patch-projects_sample_autoconf_config.sub) = 7e8449c46ed0c3e5530235d33a35f7f4e083d0b0
|
||||
SHA1 (patch-tools_clang_lib_Driver_ToolChains.cpp) = 80b9890fdc5b4932c4b9301c50809b80212d0e48
|
||||
SHA1 (patch-tools_clang_lib_Driver_Tools.cpp) = 9dcb364d1fd31ddb5672ad4d8b247dab1fe179c6
|
||||
SHA1 (patch-tools_clang_lib_Driver_ToolChains.cpp) = 8298ea94d4a69354be9a6e535e539887eb322ab8
|
||||
SHA1 (patch-tools_clang_lib_Driver_Tools.cpp) = f932d4e56bb0c35441a75afd7844358deb5d4361
|
||||
SHA1 (patch-tools_clang_lib_Frontend_InitHeaderSearch.cpp) = 18b558f48e73e73e2b90dfb40d512357c0d40da4
|
||||
SHA1 (patch-tools_clang_test_Driver_dragonfly.c) = 7e2cf2e40bce1037eb229f8cb399d095385f293e
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
$NetBSD: patch-tools_clang_lib_Driver_ToolChains.cpp,v 1.1 2012/11/22 22:45:15 marino Exp $
|
||||
$NetBSD: patch-tools_clang_lib_Driver_ToolChains.cpp,v 1.2 2012/11/29 11:42:25 marino Exp $
|
||||
|
||||
DragonFly no longer has gcc 4.1 in base, so clang stopped working.
|
||||
We prefer to use gcc 4.7 if available due to a better libstdc++.
|
||||
|
@ -6,13 +6,15 @@ The fallback is gcc 4.4 which has been available for several years.
|
|||
|
||||
--- tools/clang/lib/Driver/ToolChains.cpp.orig 2012-05-12 00:16:02.000000000 +0000
|
||||
+++ tools/clang/lib/Driver/ToolChains.cpp
|
||||
@@ -2307,7 +2307,8 @@ DragonFly::DragonFly(const Driver &D, co
|
||||
@@ -2307,7 +2307,10 @@ DragonFly::DragonFly(const Driver &D, co
|
||||
|
||||
getFilePaths().push_back(getDriver().Dir + "/../lib");
|
||||
getFilePaths().push_back("/usr/lib");
|
||||
- getFilePaths().push_back("/usr/lib/gcc41");
|
||||
+ getFilePaths().push_back("/usr/lib/gcc47");
|
||||
+ getFilePaths().push_back("/usr/lib/gcc44");
|
||||
+ if (llvm::sys::fs::exists("/usr/lib/gcc47"))
|
||||
+ getFilePaths().push_back("/usr/lib/gcc47");
|
||||
+ else
|
||||
+ getFilePaths().push_back("/usr/lib/gcc44");
|
||||
}
|
||||
|
||||
Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
|
||||
|
|
|
@ -1,33 +1,176 @@
|
|||
$NetBSD: patch-tools_clang_lib_Driver_Tools.cpp,v 1.1 2012/11/22 22:45:15 marino Exp $
|
||||
$NetBSD: patch-tools_clang_lib_Driver_Tools.cpp,v 1.2 2012/11/29 11:42:25 marino Exp $
|
||||
|
||||
DragonFly no longer has gcc 4.1 in base, so clang stopped working.
|
||||
We prefer to use gcc 4.7 if available due to a better libstdc++.
|
||||
The fallback is gcc 4.4 which has been available for several years.
|
||||
* DragonFly no longer has gcc 4.1 in base, so clang stopped working.
|
||||
We prefer to use gcc 4.7 if available due to a better libstdc++.
|
||||
The fallback is gcc 4.4 which has been available for several years.
|
||||
The libgcc specs are different between 4.4 and 4.7
|
||||
* DragonFly: Removed duplicate libgcc handling
|
||||
* DragonFly: Removed redundant rpath-link
|
||||
* DragonFly: Added -export-dynamic (matches gcc dumpspecs)
|
||||
* DragonFly: Added gnu-hash to shared objects
|
||||
|
||||
--- tools/clang/lib/Driver/Tools.cpp.orig 2012-04-18 21:32:25.000000000 +0000
|
||||
+++ tools/clang/lib/Driver/Tools.cpp
|
||||
@@ -5499,14 +5499,21 @@ void dragonfly::Link::ConstructJob(Compi
|
||||
@@ -5441,21 +5441,28 @@ void dragonfly::Link::ConstructJob(Compi
|
||||
const InputInfoList &Inputs,
|
||||
const ArgList &Args,
|
||||
const char *LinkingOutput) const {
|
||||
+ bool UseGCC47;
|
||||
const Driver &D = getToolChain().getDriver();
|
||||
ArgStringList CmdArgs;
|
||||
|
||||
+ llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47);
|
||||
+
|
||||
if (!D.SysRoot.empty())
|
||||
CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
|
||||
|
||||
+ CmdArgs.push_back("--eh-frame-hdr");
|
||||
if (Args.hasArg(options::OPT_static)) {
|
||||
CmdArgs.push_back("-Bstatic");
|
||||
} else {
|
||||
+ if (Args.hasArg(options::OPT_rdynamic))
|
||||
+ CmdArgs.push_back("-export-dynamic");
|
||||
if (Args.hasArg(options::OPT_shared))
|
||||
CmdArgs.push_back("-Bshareable");
|
||||
else {
|
||||
CmdArgs.push_back("-dynamic-linker");
|
||||
CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
|
||||
}
|
||||
+ CmdArgs.push_back("--hash-style=both");
|
||||
}
|
||||
|
||||
// When building 32-bit code on DragonFly/pc64, we have to explicitly
|
||||
@@ -5475,18 +5482,26 @@ void dragonfly::Link::ConstructJob(Compi
|
||||
if (!Args.hasArg(options::OPT_nostdlib) &&
|
||||
!Args.hasArg(options::OPT_nostartfiles)) {
|
||||
if (!Args.hasArg(options::OPT_shared)) {
|
||||
- CmdArgs.push_back(
|
||||
- Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
|
||||
- CmdArgs.push_back(
|
||||
- Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
|
||||
- CmdArgs.push_back(
|
||||
- Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
|
||||
- } else {
|
||||
- CmdArgs.push_back(
|
||||
- Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
|
||||
- CmdArgs.push_back(
|
||||
- Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
|
||||
+ if (Args.hasArg(options::OPT_pg))
|
||||
+ CmdArgs.push_back(Args.MakeArgString(
|
||||
+ getToolChain().GetFilePath("gcrt1.o")));
|
||||
+ else {
|
||||
+ if (Args.hasArg(options::OPT_pie))
|
||||
+ CmdArgs.push_back(Args.MakeArgString(
|
||||
+ getToolChain().GetFilePath("Scrt1.o")));
|
||||
+ else
|
||||
+ CmdArgs.push_back(Args.MakeArgString(
|
||||
+ getToolChain().GetFilePath("crt1.o")));
|
||||
+ }
|
||||
}
|
||||
+ CmdArgs.push_back(Args.MakeArgString(
|
||||
+ getToolChain().GetFilePath("crti.o")));
|
||||
+ if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
|
||||
+ CmdArgs.push_back(Args.MakeArgString(
|
||||
+ getToolChain().GetFilePath("crtbeginS.o")));
|
||||
+ else
|
||||
+ CmdArgs.push_back(Args.MakeArgString(
|
||||
+ getToolChain().GetFilePath("crtbegin.o")));
|
||||
}
|
||||
|
||||
Args.AddAllArgs(CmdArgs, options::OPT_L);
|
||||
@@ -5499,20 +5514,19 @@ void dragonfly::Link::ConstructJob(Compi
|
||||
!Args.hasArg(options::OPT_nodefaultlibs)) {
|
||||
// FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
|
||||
// rpaths
|
||||
- CmdArgs.push_back("-L/usr/lib/gcc41");
|
||||
+ CmdArgs.push_back("-L/usr/lib/gcc47");
|
||||
+ CmdArgs.push_back("-L/usr/lib/gcc44");
|
||||
+ if (UseGCC47)
|
||||
+ CmdArgs.push_back("-L/usr/lib/gcc47");
|
||||
+ else
|
||||
+ CmdArgs.push_back("-L/usr/lib/gcc44");
|
||||
|
||||
if (!Args.hasArg(options::OPT_static)) {
|
||||
CmdArgs.push_back("-rpath");
|
||||
- CmdArgs.push_back("-rpath");
|
||||
- CmdArgs.push_back("/usr/lib/gcc41");
|
||||
+ CmdArgs.push_back("/usr/lib/gcc47");
|
||||
|
||||
CmdArgs.push_back("-rpath-link");
|
||||
-
|
||||
- CmdArgs.push_back("-rpath-link");
|
||||
- CmdArgs.push_back("/usr/lib/gcc41");
|
||||
+ CmdArgs.push_back("/usr/lib/gcc47");
|
||||
+
|
||||
+ CmdArgs.push_back("-rpath");
|
||||
+ CmdArgs.push_back("/usr/lib/gcc44");
|
||||
+
|
||||
+ CmdArgs.push_back("-rpath-link");
|
||||
+ CmdArgs.push_back("/usr/lib/gcc44");
|
||||
-
|
||||
- CmdArgs.push_back("-rpath");
|
||||
- CmdArgs.push_back("/usr/lib");
|
||||
-
|
||||
- CmdArgs.push_back("-rpath-link");
|
||||
- CmdArgs.push_back("/usr/lib");
|
||||
+ if (UseGCC47) {
|
||||
+ CmdArgs.push_back("-rpath");
|
||||
+ CmdArgs.push_back("/usr/lib/gcc47");
|
||||
+ } else {
|
||||
+ CmdArgs.push_back("-rpath");
|
||||
+ CmdArgs.push_back("/usr/lib/gcc44");
|
||||
+ }
|
||||
}
|
||||
|
||||
CmdArgs.push_back("-rpath");
|
||||
CmdArgs.push_back("/usr/lib");
|
||||
if (D.CCCIsCXX) {
|
||||
@@ -5520,13 +5534,6 @@ void dragonfly::Link::ConstructJob(Compi
|
||||
CmdArgs.push_back("-lm");
|
||||
}
|
||||
|
||||
- if (Args.hasArg(options::OPT_shared)) {
|
||||
- CmdArgs.push_back("-lgcc_pic");
|
||||
- } else {
|
||||
- CmdArgs.push_back("-lgcc");
|
||||
- }
|
||||
-
|
||||
-
|
||||
if (Args.hasArg(options::OPT_pthread))
|
||||
CmdArgs.push_back("-lpthread");
|
||||
|
||||
@@ -5534,23 +5541,42 @@ void dragonfly::Link::ConstructJob(Compi
|
||||
CmdArgs.push_back("-lc");
|
||||
}
|
||||
|
||||
- if (Args.hasArg(options::OPT_shared)) {
|
||||
- CmdArgs.push_back("-lgcc_pic");
|
||||
+ if (UseGCC47) {
|
||||
+ if (Args.hasArg(options::OPT_static) ||
|
||||
+ Args.hasArg(options::OPT_static_libgcc)) {
|
||||
+ CmdArgs.push_back("-lgcc");
|
||||
+ CmdArgs.push_back("-lgcc_eh");
|
||||
+ } else {
|
||||
+ if (Args.hasArg(options::OPT_shared_libgcc)) {
|
||||
+ CmdArgs.push_back("-lgcc_pic");
|
||||
+ if (!Args.hasArg(options::OPT_shared))
|
||||
+ CmdArgs.push_back("-lgcc");
|
||||
+ } else {
|
||||
+ CmdArgs.push_back("-lgcc");
|
||||
+ CmdArgs.push_back("--as-needed");
|
||||
+ CmdArgs.push_back("-lgcc_pic");
|
||||
+ CmdArgs.push_back("--no-as-needed");
|
||||
+ }
|
||||
+ }
|
||||
} else {
|
||||
- CmdArgs.push_back("-lgcc");
|
||||
+ if (Args.hasArg(options::OPT_shared)) {
|
||||
+ CmdArgs.push_back("-lgcc_pic");
|
||||
+ } else {
|
||||
+ CmdArgs.push_back("-lgcc");
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
if (!Args.hasArg(options::OPT_nostdlib) &&
|
||||
!Args.hasArg(options::OPT_nostartfiles)) {
|
||||
- if (!Args.hasArg(options::OPT_shared))
|
||||
+ if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
|
||||
CmdArgs.push_back(Args.MakeArgString(
|
||||
- getToolChain().GetFilePath("crtend.o")));
|
||||
+ getToolChain().GetFilePath("crtendS.o")));
|
||||
else
|
||||
CmdArgs.push_back(Args.MakeArgString(
|
||||
- getToolChain().GetFilePath("crtendS.o")));
|
||||
+ getToolChain().GetFilePath("crtend.o")));
|
||||
CmdArgs.push_back(Args.MakeArgString(
|
||||
- getToolChain().GetFilePath("crtn.o")));
|
||||
+ getToolChain().GetFilePath("crtn.o")));
|
||||
}
|
||||
|
||||
addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
$NetBSD: patch-tools_clang_lib_Frontend_InitHeaderSearch.cpp,v 1.1 2012/11/29 11:42:25 marino Exp $
|
||||
|
||||
DragonFly no longer has gcc 4.1 in base, so clang stopped working.
|
||||
We prefer to use gcc 4.7 if available due to a better libstdc++.
|
||||
The fallback is gcc 4.4 which has been available for several years.
|
||||
|
||||
--- tools/clang/lib/Frontend/InitHeaderSearch.cpp.orig 2012-03-25 22:46:17.000000000 +0000
|
||||
+++ tools/clang/lib/Frontend/InitHeaderSearch.cpp
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
+#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
|
||||
#include "clang/Config/config.h" // C_INCLUDE_DIRS
|
||||
@@ -395,7 +396,10 @@ AddDefaultCPlusPlusIncludePaths(const ll
|
||||
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.3.0");
|
||||
break;
|
||||
case llvm::Triple::DragonFly:
|
||||
- AddPath("/usr/include/c++/4.1", CXXSystem, true, false, false);
|
||||
+ if (llvm::sys::fs::exists("/usr/lib/gcc47"))
|
||||
+ AddPath("/usr/include/c++/4.7", CXXSystem, true, false, false);
|
||||
+ else
|
||||
+ AddPath("/usr/include/c++/4.4", CXXSystem, true, false, false);
|
||||
break;
|
||||
case llvm::Triple::FreeBSD:
|
||||
// FreeBSD 8.0
|
17
lang/clang/patches/patch-tools_clang_test_Driver_dragonfly.c
Normal file
17
lang/clang/patches/patch-tools_clang_test_Driver_dragonfly.c
Normal file
|
@ -0,0 +1,17 @@
|
|||
$NetBSD: patch-tools_clang_test_Driver_dragonfly.c,v 1.1 2012/11/29 11:42:25 marino Exp $
|
||||
|
||||
Update DragonFly driver test to reflect the current reality
|
||||
|
||||
--- tools/clang/test/Driver/dragonfly.c.orig 2012-01-24 01:55:55.000000000 +0000
|
||||
+++ tools/clang/test/Driver/dragonfly.c
|
||||
@@ -1,7 +1,7 @@
|
||||
-// RUN: %clang -no-canonical-prefixes -target amd64-pc-dragonfly %s -### 2> %t.log
|
||||
+// RUN: %clang -no-canonical-prefixes -target x86_64-pc-dragonfly %s -### 2> %t.log
|
||||
// RUN: FileCheck -input-file %t.log %s
|
||||
|
||||
-// CHECK: clang{{.*}}" "-cc1" "-triple" "amd64-pc-dragonfly"
|
||||
-// CHECK: ld{{.*}}" "-dynamic-linker" "{{.*}}ld-elf.{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbegin.o" "{{.*}}.o" "-L{{.*}}/gcc{{.*}}" {{.*}} "-lc" "-lgcc" "{{.*}}crtend.o" "{{.*}}crtn.o"
|
||||
+// CHECK: clang{{.*}}" "-cc1" "-triple" "x86_64-pc-dragonfly"
|
||||
+// CHECK: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/usr/libexec/ld-elf.so.{{.*}}" "--hash-style=both" "-o" "a.out" "/usr/lib/crt1.o" "/usr/lib/crti.o" "{{.*}}crtbegin.o" "{{.*}}.o" "-L/usr/lib/gcc4{{.*}}" "-rpath" "/usr/lib/gcc4{{.*}}" "-lc" "-lgcc" "{{.*}}crtend.o" "/usr/lib/crtn.o"
|
||||
|
||||
|
Loading…
Reference in a new issue