[PATCH] D41500: ananas: Add shared library support
This revision was automatically updated to reflect the committed changes. Closed by commit rC322064: ananas: Add shared library support (authored by ed, committed by ). Changed prior to commit: https://reviews.llvm.org/D41500?vs=127907&id=129045#toc Repository: rC Clang https://reviews.llvm.org/D41500 Files: lib/Driver/ToolChains/Ananas.cpp test/Driver/ananas.c Index: test/Driver/ananas.c === --- test/Driver/ananas.c +++ test/Driver/ananas.c @@ -7,3 +7,11 @@ // CHECK-STATIC: crtbegin.o // CHECK-STATIC: crtend.o // CHECK-STATIC: crtn.o + +// RUN: %clang -no-canonical-prefixes -target x86_64-unknown-ananas -shared %s \ +// RUN: --sysroot=%S/Inputs/ananas-tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SHARED %s +// CHECK-SHARED: crti.o +// CHECK-SHARED: crtbeginS.o +// CHECK-SHARED: crtendS.o +// CHECK-SHARED: crtn.o Index: lib/Driver/ToolChains/Ananas.cpp === --- lib/Driver/ToolChains/Ananas.cpp +++ lib/Driver/ToolChains/Ananas.cpp @@ -64,8 +64,19 @@ if (!D.SysRoot.empty()) CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); - // Ananas only supports static linkage for now. - CmdArgs.push_back("-Bstatic"); + 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 { + Args.AddAllArgs(CmdArgs, options::OPT_pie); + CmdArgs.push_back("-dynamic-linker"); + CmdArgs.push_back("/lib/ld-ananas.so"); +} + } if (Output.isFilename()) { CmdArgs.push_back("-o"); @@ -75,9 +86,15 @@ } if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); +if (!Args.hasArg(options::OPT_shared)) { + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); +} CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); +if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) { + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbeginS.o"))); +} else { + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); +} } Args.AddAllArgs(CmdArgs, options::OPT_L); @@ -97,7 +114,10 @@ CmdArgs.push_back("-lc"); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); +if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o"))); +else + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); } Index: test/Driver/ananas.c === --- test/Driver/ananas.c +++ test/Driver/ananas.c @@ -7,3 +7,11 @@ // CHECK-STATIC: crtbegin.o // CHECK-STATIC: crtend.o // CHECK-STATIC: crtn.o + +// RUN: %clang -no-canonical-prefixes -target x86_64-unknown-ananas -shared %s \ +// RUN: --sysroot=%S/Inputs/ananas-tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SHARED %s +// CHECK-SHARED: crti.o +// CHECK-SHARED: crtbeginS.o +// CHECK-SHARED: crtendS.o +// CHECK-SHARED: crtn.o Index: lib/Driver/ToolChains/Ananas.cpp === --- lib/Driver/ToolChains/Ananas.cpp +++ lib/Driver/ToolChains/Ananas.cpp @@ -64,8 +64,19 @@ if (!D.SysRoot.empty()) CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); - // Ananas only supports static linkage for now. - CmdArgs.push_back("-Bstatic"); + 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 { + Args.AddAllArgs(CmdArgs, options::OPT_pie); + CmdArgs.push_back("-dynamic-linker"); + CmdArgs.push_back("/lib/ld-ananas.so"); +} + } if (Output.isFilename()) { CmdArgs.push_back("-o"); @@ -75,9 +86,15 @@ } if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); +if (!Args.hasArg(options::OPT_shared)) { + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); +} CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); -CmdArgs.push_back(Args.MakeArgString(ToolChain
[PATCH] D41500: ananas: Add shared library support
ed accepted this revision. ed added a comment. This revision is now accepted and ready to land. In https://reviews.llvm.org/D41500#965157, @zhmu wrote: > @ed I tried to keep things as much in line as the other > ::linker::Construct() functions do. Do you wish to stray from that path? > > I actually prefer to keep it like this as it's quite readable already, but > YMMV of course :-) Agreed. I'll commit this patch later today as is! Repository: rC Clang https://reviews.llvm.org/D41500 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D41500: ananas: Add shared library support
zhmu added a comment. @ed I tried to keep things as much in line as the other ::linker::Construct() functions do. Do you wish to stray from that path? I actually prefer to keep it like this as it's quite readable already, but YMMV of course :-) Repository: rC Clang https://reviews.llvm.org/D41500 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D41500: ananas: Add shared library support
ed added inline comments. Comment at: lib/Driver/ToolChains/Ananas.cpp:93 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); +if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) { + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbeginS.o"))); This logic is used multiple times. Would it make sense to do something like this? bool IsShared = Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie); CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(IsShared ? "crtbeginS.o" : "crtbegin.o"))); Comment at: lib/Driver/ToolChains/Ananas.cpp:118 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); +if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o"))); CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(IsShared ? "crtendS.o" : "crtend.o"))); Repository: rC Clang https://reviews.llvm.org/D41500 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D41500: ananas: Add shared library support
zhmu created this revision. zhmu added a reviewer: ed. Herald added a subscriber: cfe-commits. The Ananas Operating System (https://github.com/zhmu/ananas) has shared library support as of commit 57739c0b6ece56dd4872aedf30264ed4b9412c77. This change adds the necessary settings to clang so that shared executables and libraries can be build correctly. Repository: rC Clang https://reviews.llvm.org/D41500 Files: lib/Driver/ToolChains/Ananas.cpp test/Driver/ananas.c Index: test/Driver/ananas.c === --- test/Driver/ananas.c +++ test/Driver/ananas.c @@ -7,3 +7,11 @@ // CHECK-STATIC: crtbegin.o // CHECK-STATIC: crtend.o // CHECK-STATIC: crtn.o + +// RUN: %clang -no-canonical-prefixes -target x86_64-unknown-ananas -shared %s \ +// RUN: --sysroot=%S/Inputs/ananas-tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SHARED %s +// CHECK-SHARED: crti.o +// CHECK-SHARED: crtbeginS.o +// CHECK-SHARED: crtendS.o +// CHECK-SHARED: crtn.o Index: lib/Driver/ToolChains/Ananas.cpp === --- lib/Driver/ToolChains/Ananas.cpp +++ lib/Driver/ToolChains/Ananas.cpp @@ -64,8 +64,19 @@ if (!D.SysRoot.empty()) CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); - // Ananas only supports static linkage for now. - CmdArgs.push_back("-Bstatic"); + 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 { + Args.AddAllArgs(CmdArgs, options::OPT_pie); + CmdArgs.push_back("-dynamic-linker"); + CmdArgs.push_back("/lib/ld-ananas.so"); +} + } if (Output.isFilename()) { CmdArgs.push_back("-o"); @@ -75,9 +86,15 @@ } if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); +if (!Args.hasArg(options::OPT_shared)) { + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); +} CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); +if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) { + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbeginS.o"))); +} else { + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); +} } Args.AddAllArgs(CmdArgs, options::OPT_L); @@ -98,7 +115,10 @@ } if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); +if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o"))); +else + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); } Index: test/Driver/ananas.c === --- test/Driver/ananas.c +++ test/Driver/ananas.c @@ -7,3 +7,11 @@ // CHECK-STATIC: crtbegin.o // CHECK-STATIC: crtend.o // CHECK-STATIC: crtn.o + +// RUN: %clang -no-canonical-prefixes -target x86_64-unknown-ananas -shared %s \ +// RUN: --sysroot=%S/Inputs/ananas-tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SHARED %s +// CHECK-SHARED: crti.o +// CHECK-SHARED: crtbeginS.o +// CHECK-SHARED: crtendS.o +// CHECK-SHARED: crtn.o Index: lib/Driver/ToolChains/Ananas.cpp === --- lib/Driver/ToolChains/Ananas.cpp +++ lib/Driver/ToolChains/Ananas.cpp @@ -64,8 +64,19 @@ if (!D.SysRoot.empty()) CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); - // Ananas only supports static linkage for now. - CmdArgs.push_back("-Bstatic"); + 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 { + Args.AddAllArgs(CmdArgs, options::OPT_pie); + CmdArgs.push_back("-dynamic-linker"); + CmdArgs.push_back("/lib/ld-ananas.so"); +} + } if (Output.isFilename()) { CmdArgs.push_back("-o"); @@ -75,9 +86,15 @@ } if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); +if (!Args.hasArg(options::OPT_shared)) { + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); +} CmdArgs.push_back(Args.MakeArgString(ToolChain