summaryrefslogtreecommitdiff
path: root/lang
diff options
context:
space:
mode:
authormarino <marino>2012-11-29 11:42:24 +0000
committermarino <marino>2012-11-29 11:42:24 +0000
commit328bff3a978e80f7dd0d10c7847931b17920bfac (patch)
tree618f00ec34825c9c0daad31c6650fd9469534160 /lang
parent5d63d54527c77f78178fc828e2d9d25474d6e990 (diff)
downloadpkgsrc-328bff3a978e80f7dd0d10c7847931b17920bfac.tar.gz
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
Diffstat (limited to 'lang')
-rw-r--r--lang/clang/Makefile4
-rw-r--r--lang/clang/distinfo8
-rw-r--r--lang/clang/patches/patch-tools_clang_lib_Driver_ToolChains.cpp10
-rw-r--r--lang/clang/patches/patch-tools_clang_lib_Driver_Tools.cpp183
-rw-r--r--lang/clang/patches/patch-tools_clang_lib_Frontend_InitHeaderSearch.cpp28
-rw-r--r--lang/clang/patches/patch-tools_clang_test_Driver_dragonfly.c17
6 files changed, 221 insertions, 29 deletions
diff --git a/lang/clang/Makefile b/lang/clang/Makefile
index 60221c7b96b..ba426e250e8 100644
--- a/lang/clang/Makefile
+++ b/lang/clang/Makefile
@@ -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 \
diff --git a/lang/clang/distinfo b/lang/clang/distinfo
index 957dab6f762..77c00cffab6 100644
--- a/lang/clang/distinfo
+++ b/lang/clang/distinfo
@@ -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
diff --git a/lang/clang/patches/patch-tools_clang_lib_Driver_ToolChains.cpp b/lang/clang/patches/patch-tools_clang_lib_Driver_ToolChains.cpp
index ce3308de284..42a6d081c24 100644
--- a/lang/clang/patches/patch-tools_clang_lib_Driver_ToolChains.cpp
+++ b/lang/clang/patches/patch-tools_clang_lib_Driver_ToolChains.cpp
@@ -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,
diff --git a/lang/clang/patches/patch-tools_clang_lib_Driver_Tools.cpp b/lang/clang/patches/patch-tools_clang_lib_Driver_Tools.cpp
index bca832b3d3c..d7b85b2dbf4 100644
--- a/lang/clang/patches/patch-tools_clang_lib_Driver_Tools.cpp
+++ b/lang/clang/patches/patch-tools_clang_lib_Driver_Tools.cpp
@@ -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");
++ }
+ }
+
+ 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")));
+ }
- CmdArgs.push_back("-rpath");
- CmdArgs.push_back("/usr/lib");
+ addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
diff --git a/lang/clang/patches/patch-tools_clang_lib_Frontend_InitHeaderSearch.cpp b/lang/clang/patches/patch-tools_clang_lib_Frontend_InitHeaderSearch.cpp
new file mode 100644
index 00000000000..5ea627d2793
--- /dev/null
+++ b/lang/clang/patches/patch-tools_clang_lib_Frontend_InitHeaderSearch.cpp
@@ -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
diff --git a/lang/clang/patches/patch-tools_clang_test_Driver_dragonfly.c b/lang/clang/patches/patch-tools_clang_test_Driver_dragonfly.c
new file mode 100644
index 00000000000..445b2370d71
--- /dev/null
+++ b/lang/clang/patches/patch-tools_clang_test_Driver_dragonfly.c
@@ -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"
+
+