aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
authorstevewan <wan.yu@ibm.com>2019-10-24 14:47:32 -0400
committerDavid Tenty <daltenty@ibm.com>2019-10-24 14:47:57 -0400
commitbb6a27fc257faac1339e79c20ae807db70a31ebd (patch)
treed23cc1c4375515976c6737688a3435cceaa3dc52 /clang/lib
parent7b3de1e811972b874d91554642ccb2ef5b32eed6 (diff)
downloadllvm-bb6a27fc257faac1339e79c20ae807db70a31ebd.zip
llvm-bb6a27fc257faac1339e79c20ae807db70a31ebd.tar.gz
llvm-bb6a27fc257faac1339e79c20ae807db70a31ebd.tar.bz2
Add AIX toolchain and basic linker functionality
Summary: This patch adds AIX toolchain infrastructure into driver, and enables AIX system linker invocation with some basic functionality support Reviewers: daltenty, hubert.reinterpretcast, jasonliu, Xiangling_L Reviewed By: jasonliu Subscribers: Xiangling_L, jasonliu, ormris, wuzish, nemanjai, mgorny, kbarton, jfb, jsji, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D68340
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Driver/CMakeLists.txt1
-rw-r--r--clang/lib/Driver/Driver.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/AIX.cpp101
-rw-r--r--clang/lib/Driver/ToolChains/AIX.h63
4 files changed, 169 insertions, 0 deletions
diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt
index 64b5d70..84fd58c 100644
--- a/clang/lib/Driver/CMakeLists.txt
+++ b/clang/lib/Driver/CMakeLists.txt
@@ -30,6 +30,7 @@ add_clang_library(clangDriver
ToolChains/Arch/Sparc.cpp
ToolChains/Arch/SystemZ.cpp
ToolChains/Arch/X86.cpp
+ ToolChains/AIX.cpp
ToolChains/Ananas.cpp
ToolChains/AMDGPU.cpp
ToolChains/AVR.cpp
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index f6016b4..4c59bf0 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -8,6 +8,7 @@
#include "clang/Driver/Driver.h"
#include "InputInfo.h"
+#include "ToolChains/AIX.h"
#include "ToolChains/AMDGPU.h"
#include "ToolChains/AVR.h"
#include "ToolChains/Ananas.h"
@@ -4699,6 +4700,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
auto &TC = ToolChains[Target.str()];
if (!TC) {
switch (Target.getOS()) {
+ case llvm::Triple::AIX:
+ TC = std::make_unique<toolchains::AIX>(*this, Target, Args);
+ break;
case llvm::Triple::Haiku:
TC = std::make_unique<toolchains::Haiku>(*this, Target, Args);
break;
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
new file mode 100644
index 0000000..369a5fc
--- /dev/null
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -0,0 +1,101 @@
+//===--- AIX.cpp - AIX ToolChain Implementations ----------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "AIX.h"
+#include "Arch/PPC.h"
+#include "CommonArgs.h"
+#include "clang/Driver/Compilation.h"
+#include "clang/Driver/Options.h"
+#include "clang/Driver/SanitizerArgs.h"
+#include "llvm/Option/ArgList.h"
+
+namespace aix = clang::driver::tools::aix;
+using AIX = clang::driver::toolchains::AIX;
+
+using namespace llvm::opt;
+
+void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
+ const InputInfoList &Inputs, const ArgList &Args,
+ const char *LinkingOutput) const {
+ const AIX &ToolChain = static_cast<const AIX &>(getToolChain());
+ ArgStringList CmdArgs;
+
+ const bool IsArch32Bit = ToolChain.getTriple().isArch32Bit();
+ const bool IsArch64Bit = ToolChain.getTriple().isArch64Bit();
+ // Only support 32 and 64 bit.
+ if (!(IsArch32Bit || IsArch64Bit))
+ llvm_unreachable("Unsupported bit width value.");
+
+ // Force static linking when "-static" is present.
+ if (Args.hasArg(options::OPT_static))
+ CmdArgs.push_back("-bnso");
+
+ // Specify linker output file.
+ assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
+ if (Output.isFilename()) {
+ CmdArgs.push_back("-o");
+ CmdArgs.push_back(Output.getFilename());
+ }
+
+ // Set linking mode (i.e., 32/64-bit) and the address of
+ // text and data sections based on arch bit width.
+ if (IsArch32Bit) {
+ CmdArgs.push_back("-b32");
+ CmdArgs.push_back("-bpT:0x10000000");
+ CmdArgs.push_back("-bpD:0x20000000");
+ } else {
+ // Must be 64-bit, otherwise asserted already.
+ CmdArgs.push_back("-b64");
+ CmdArgs.push_back("-bpT:0x100000000");
+ CmdArgs.push_back("-bpD:0x110000000");
+ }
+
+ auto getCrt0Basename = [&Args, IsArch32Bit] {
+ // Enable gprofiling when "-pg" is specified.
+ if (Args.hasArg(options::OPT_pg))
+ return IsArch32Bit ? "gcrt0.o" : "gcrt0_64.o";
+ // Enable profiling when "-p" is specified.
+ else if (Args.hasArg(options::OPT_p))
+ return IsArch32Bit ? "mcrt0.o" : "mcrt0_64.o";
+ else
+ return IsArch32Bit ? "crt0.o" : "crt0_64.o";
+ };
+
+ if (!Args.hasArg(options::OPT_nostdlib)) {
+ CmdArgs.push_back(
+ Args.MakeArgString(ToolChain.GetFilePath(getCrt0Basename())));
+ }
+
+ // Specify linker input file(s).
+ AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
+
+ // Add directory to library search path.
+ Args.AddAllArgs(CmdArgs, options::OPT_L);
+ ToolChain.AddFilePathLibArgs(Args, CmdArgs);
+
+ if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
+ // Support POSIX threads if "-pthreads" or "-pthread" is present.
+ if (Args.hasArg(options::OPT_pthreads, options::OPT_pthread))
+ CmdArgs.push_back("-lpthreads");
+
+ CmdArgs.push_back("-lc");
+ }
+
+ const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
+ C.addCommand(std::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
+}
+
+/// AIX - AIX tool chain which can call ld(1) directly.
+// TODO: Enable direct call to as(1).
+AIX::AIX(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
+ : ToolChain(D, Triple, Args) {
+ getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
+}
+
+auto AIX::buildLinker() const -> Tool * { return new aix::Linker(*this); }
diff --git a/clang/lib/Driver/ToolChains/AIX.h b/clang/lib/Driver/ToolChains/AIX.h
new file mode 100644
index 0000000..58c06c3
--- /dev/null
+++ b/clang/lib/Driver/ToolChains/AIX.h
@@ -0,0 +1,63 @@
+//===--- AIX.h - AIX ToolChain Implementations ------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AIX_H
+#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AIX_H
+
+#include "clang/Driver/Tool.h"
+#include "clang/Driver/ToolChain.h"
+
+namespace clang {
+namespace driver {
+namespace tools {
+
+/// aix -- Directly call system default linker.
+// TODO: Enable direct call to system default assembler.
+namespace aix {
+
+class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
+public:
+ Linker(const ToolChain &TC) : Tool("aix::Linker", "linker", TC) {}
+
+ bool hasIntegratedCPP() const override { return false; }
+ bool isLinkJob() const override { return true; }
+
+ void ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::opt::ArgList &TCArgs,
+ const char *LinkingOutput) const override;
+};
+
+} // end namespace aix
+
+} // end namespace tools
+} // end namespace driver
+} // end namespace clang
+
+namespace clang {
+namespace driver {
+namespace toolchains {
+
+class LLVM_LIBRARY_VISIBILITY AIX : public ToolChain {
+public:
+ AIX(const Driver &D, const llvm::Triple &Triple,
+ const llvm::opt::ArgList &Args);
+
+ bool isPICDefault() const override { return true; }
+ bool isPIEDefault() const override { return false; }
+ bool isPICDefaultForced() const override { return true; }
+
+protected:
+ Tool *buildLinker() const override;
+};
+
+} // end namespace toolchains
+} // end namespace driver
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AIX_H