2
0
Fork 0

WiP! replace LLVM patches with tworaz patches

This commit is contained in:
Ehmry - 2020-12-27 01:01:17 +01:00
parent 308e0bd8b6
commit aa1dbe981f
3 changed files with 426 additions and 298 deletions

View File

@ -1,17 +1,5 @@
diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
index 966cb907b7e2..5bcd5093be7d 100644
--- a/include/clang/Driver/Options.td
+++ b/include/clang/Driver/Options.td
@@ -2709,6 +2709,7 @@ def nolibc : Flag<["-"], "nolibc">;
def nomultidefs : Flag<["-"], "nomultidefs">;
def nopie : Flag<["-"], "nopie">;
def no_pie : Flag<["-"], "no-pie">, Alias<nopie>;
+def noposix : Flag<["-"], "noposix">;
def noprebind : Flag<["-"], "noprebind">;
def noprofilelib : Flag<["-"], "noprofilelib">;
def noseglinkedit : Flag<["-"], "noseglinkedit">;
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
index 965f273892bd..7a22f90d3652 100644
index 965f273892bd..3cda71642b8c 100644
--- a/lib/Basic/Targets.cpp
+++ b/lib/Basic/Targets.cpp
@@ -142,6 +142,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
@ -41,15 +29,15 @@ index 965f273892bd..7a22f90d3652 100644
case llvm::Triple::KFreeBSD:
return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
case llvm::Triple::Minix:
@@ -544,6 +550,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
case llvm::Triple::Fuchsia:
return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
@@ -561,6 +567,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
}
case llvm::Triple::Haiku:
return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
+ case llvm::Triple::Genode:
+ return new GenodeTargetInfo<X86_64TargetInfo>(Triple, Opts);
case llvm::Triple::KFreeBSD:
return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
case llvm::Triple::Solaris:
case llvm::Triple::NaCl:
return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
case llvm::Triple::PS4:
diff --git a/lib/Basic/Targets/AArch64.cpp b/lib/Basic/Targets/AArch64.cpp
index 25c02cb888c1..8b9a622865cd 100644
--- a/lib/Basic/Targets/AArch64.cpp
@ -90,20 +78,11 @@ index 21cfe0107bbb..b02ef0aa0f2f 100644
: UnsignedInt;
diff --git a/lib/Basic/Targets/OSTargets.h b/lib/Basic/Targets/OSTargets.h
index 2a9e4f91d478..e453358027f0 100644
index 2a9e4f91d478..651a5222b2fe 100644
--- a/lib/Basic/Targets/OSTargets.h
+++ b/lib/Basic/Targets/OSTargets.h
@@ -296,7 +296,7 @@ protected:
Builder.defineMacro("__HAIKU__");
Builder.defineMacro("__ELF__");
DefineStd(Builder, "unix", Opts);
- if (this->HasFloat128)
+ if (this->HasFloat128)
Builder.defineMacro("__FLOAT128__");
}
@@ -820,6 +820,40 @@ public:
}
@@ -286,6 +286,39 @@ public:
: OSTargetInfo<Target>(Triple, Opts) {}
};
+// Genode Target
@ -136,18 +115,17 @@ index 2a9e4f91d478..e453358027f0 100644
+ this->HasFloat128 = true;
+ break;
+ }
+
+ }
+};
+
// WebAssembly target
// Haiku Target
template <typename Target>
class LLVM_LIBRARY_VISIBILITY WebAssemblyOSTargetInfo
class LLVM_LIBRARY_VISIBILITY HaikuTargetInfo : public OSTargetInfo<Target> {
diff --git a/lib/Basic/Targets/X86.h b/lib/Basic/Targets/X86.h
index 72a01d2514c2..ae7b01b0d9a7 100644
index 72a01d2514c2..6c5c0065c76e 100644
--- a/lib/Basic/Targets/X86.h
+++ b/lib/Basic/Targets/X86.h
@@ -447,6 +447,18 @@ public:
@@ -447,6 +447,17 @@ public:
}
};
@ -161,7 +139,6 @@ index 72a01d2514c2..ae7b01b0d9a7 100644
+ PtrDiffType = SignedLong;
+ }
+};
+
+
class LLVM_LIBRARY_VISIBILITY DarwinI386TargetInfo
: public DarwinTargetInfo<X86_32TargetInfo> {
@ -179,7 +156,7 @@ index 9463ca5c109d..5ae757f99e2f 100644
ToolChains/Haiku.cpp
ToolChains/HIP.cpp
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index ece8222dcf24..4ca793af6c81 100644
index ece8222dcf24..650de46eb9cf 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -22,6 +22,7 @@
@ -190,15 +167,15 @@ index ece8222dcf24..4ca793af6c81 100644
#include "ToolChains/Gnu.h"
#include "ToolChains/HIP.h"
#include "ToolChains/Haiku.h"
@@ -4951,6 +4952,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
case llvm::Triple::Solaris:
TC = std::make_unique<toolchains::Solaris>(*this, Target, Args);
@@ -4919,6 +4920,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
case llvm::Triple::FreeBSD:
TC = std::make_unique<toolchains::FreeBSD>(*this, Target, Args);
break;
+ case llvm::Triple::Genode:
+ TC = std::make_unique<toolchains::Genode>(*this, Target, Args);
+ break;
case llvm::Triple::AMDHSA:
TC = std::make_unique<toolchains::ROCMToolChain>(*this, Target, Args);
case llvm::Triple::Minix:
TC = std::make_unique<toolchains::Minix>(*this, Target, Args);
break;
diff --git a/lib/Driver/ToolChains/Arch/AArch64.cpp b/lib/Driver/ToolChains/Arch/AArch64.cpp
index dd4545d6c48f..22ec56518046 100644
@ -241,10 +218,10 @@ index af4bcf951e6c..c96b192c7e09 100644
diff --git a/lib/Driver/ToolChains/Genode.cpp b/lib/Driver/ToolChains/Genode.cpp
new file mode 100644
index 000000000000..37151999b7bf
index 000000000000..f61b99fdef8f
--- /dev/null
+++ b/lib/Driver/ToolChains/Genode.cpp
@@ -0,0 +1,191 @@
@@ -0,0 +1,151 @@
+//===--- Genode.h - Genode ToolChain Implementations ------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
@ -267,6 +244,17 @@ index 000000000000..37151999b7bf
+using namespace clang;
+using namespace llvm::opt;
+
+void genode::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
+ const InputInfoList &Inputs,
+ const ArgList &Args,
+ const char *LinkingOutput) const {
+ Args.ClaimAllArgs(options::OPT_mcmodel_EQ);
+ Args.ClaimAllArgs(options::OPT_mtune_EQ);
+
+ gnutools::Assembler::ConstructJob(C, JA, Output, Inputs, Args, LinkingOutput);
+}
+
+void genode::Linker::ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
+ const InputInfoList &Inputs,
@ -275,78 +263,23 @@ index 000000000000..37151999b7bf
+ ArgStringList CmdArgs;
+
+ const auto &TC = static_cast<const toolchains::Genode &>(getToolChain());
+ const auto &D = TC.getDriver();
+
+ if (!D.SysRoot.empty())
+ CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
+
+ // Explicitly set the linker emulation for platforms that might not
+ // be the default emulation for the linker.
+ switch (TC.getArch()) {
+ case llvm::Triple::x86:
+ CmdArgs.push_back("-melf_i386");
+ break;
+ case llvm::Triple::x86_64:
+ CmdArgs.push_back("-melf_x86_64");
+ break;
+ case llvm::Triple::riscv32:
+ CmdArgs.push_back("-melf32lriscv");
+ break;
+ case llvm::Triple::riscv64:
+ CmdArgs.push_back("-melf64lriscv");
+ break;
+ default:
+ break;
+ }
+
+ CmdArgs.push_back("--eh-frame-hdr");
+ CmdArgs.push_back("--gc-sections");
+ CmdArgs.push_back("-zmax-page-size=0x1000");
+
+ CmdArgs.push_back("-Ttext=0x01000000");
+
+ Args.AddAllArgs(CmdArgs, options::OPT_L);
+ TC.AddFilePathLibArgs(Args, CmdArgs);
+ Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
+ Args.AddAllArgs(CmdArgs, options::OPT_e);
+ Args.AddAllArgs(CmdArgs, options::OPT_s);
+ Args.AddAllArgs(CmdArgs, options::OPT_t);
+ Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
+
+ if (Args.hasArg(options::OPT_static)) {
+ CmdArgs.push_back("-Bstatic");
+ } else {
+ if (Args.hasArg(options::OPT_shared)) {
+ CmdArgs.push_back(Args.MakeArgString("-shared"));
+ CmdArgs.push_back(Args.MakeArgString("-T" + D.SysRoot + "/ld/genode_rel.ld"));
+ } else {
+ CmdArgs.push_back(Args.MakeArgString("-T" + D.SysRoot + "/ld/genode_dyn.ld"));
+ CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + D.SysRoot + "/ld/genode_dyn.dl"));
+ CmdArgs.push_back("--dynamic-linker=ld.lib.so");
+ }
+ if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
+ CmdArgs.push_back("-l:ld.lib.so");
+ }
+ }
+
+ if (Output.isFilename()) {
+ CmdArgs.push_back("-o");
+ CmdArgs.push_back(Output.getFilename());
+ } else {
+ assert(Output.isNothing() && "Invalid output.");
+ }
+
+ AddLinkerInputs(TC, Inputs, Args, CmdArgs, JA);
+
+ if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs, options::OPT_noposix)) {
+ AddRunTimeLibs(TC, D, CmdArgs, Args);
+ Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
+ options::OPT_e, options::OPT_s, options::OPT_t,
+ options::OPT_Z_Flag, options::OPT_r});
+
+ CmdArgs.push_back("-lc");
+ if (!Args.hasArg(options::OPT_shared)) {
+ CmdArgs.push_back("-lposix");
+ }
+ CmdArgs.push_back("--eh-frame-hdr");
+ if (Args.hasArg(options::OPT_static)) {
+ CmdArgs.push_back("-Bstatic");
+ } else if (Args.hasArg(options::OPT_shared)) {
+ CmdArgs.push_back("-shared");
+ }
+
+ CmdArgs.push_back("-o");
+ CmdArgs.push_back(Output.getFilename());
+
+ C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
+ Args.MakeArgString(TC.GetLinkerPath()),
+ CmdArgs, Inputs));
@ -433,15 +366,19 @@ index 000000000000..37151999b7bf
+ CmdArgs.push_back(Opt.c_str());
+}
+
+Tool *Genode::buildAssembler() const {
+ return new tools::genode::Assembler(*this);
+}
+
+Tool *Genode::buildLinker() const {
+ return new tools::genode::Linker(*this);
+}
diff --git a/lib/Driver/ToolChains/Genode.h b/lib/Driver/ToolChains/Genode.h
new file mode 100644
index 000000000000..27e51ca45d9e
index 000000000000..006904b4a8fb
--- /dev/null
+++ b/lib/Driver/ToolChains/Genode.h
@@ -0,0 +1,69 @@
@@ -0,0 +1,83 @@
+//===--- Genode.h - Genode ToolChain Implementations ------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
@ -461,6 +398,15 @@ index 000000000000..27e51ca45d9e
+namespace driver {
+namespace tools {
+namespace genode {
+class LLVM_LIBRARY_VISIBILITY Assembler : public gnutools::Assembler {
+public:
+ Assembler(const ToolChain &TC) : gnutools::Assembler(TC) {}
+
+ void ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::opt::ArgList &TCArgs,
+ const char *LinkingOutput) const override;
+};
+class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
+public:
+ Linker(const ToolChain &TC) : Tool("genode::Linker", "linker", TC) {}
@ -484,11 +430,11 @@ index 000000000000..27e51ca45d9e
+ const llvm::opt::ArgList &Args);
+
+ bool IsMathErrnoDefault() const override { return false; }
+ bool HasNativeLLVMSupport() const override { return true; }
+ bool HasNativeLLVMSupport() const override { return false; }
+ bool isPICDefault() const override { return false; }
+ bool isPIEDefault() const override { return false; }
+ bool isPICDefaultForced() const override { return false; }
+ bool IsIntegratedAssemblerDefault() const override { return true; }
+ bool IsIntegratedAssemblerDefault() const override { return false; }
+
+ void
+ addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
@ -500,9 +446,14 @@ index 000000000000..27e51ca45d9e
+
+ void addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const override;
+
+ const char *getDefaultLinker() const override {
+ return "ld";
+ }
+
+ std::vector<std::string> ExtraOpts;
+
+protected:
+ Tool *buildAssembler() const override;
+ Tool *buildLinker() const override;
+};
+
@ -511,29 +462,3 @@ index 000000000000..27e51ca45d9e
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_GENODE_H
diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp
index bc31445d6d08..364942eff068 100644
--- a/lib/Frontend/InitHeaderSearch.cpp
+++ b/lib/Frontend/InitHeaderSearch.cpp
@@ -229,6 +229,7 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
case llvm::Triple::PS4:
case llvm::Triple::ELFIAMCU:
case llvm::Triple::Fuchsia:
+ case llvm::Triple::Genode:
break;
case llvm::Triple::Win32:
if (triple.getEnvironment() != llvm::Triple::Cygnus)
@@ -338,6 +339,7 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
case llvm::Triple::NaCl:
case llvm::Triple::ELFIAMCU:
case llvm::Triple::Fuchsia:
+ case llvm::Triple::Genode:
break;
case llvm::Triple::PS4: {
// <isysroot> gets prepended later in AddPath().
diff --git a/test/Driver/genode.c b/test/Driver/genode.c
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/test/Driver/genode.cpp b/test/Driver/genode.cpp
new file mode 100644
index 000000000000..e69de29bb2d1

View File

@ -1,34 +0,0 @@
diff --git a/include/__config b/include/__config
index 575147cead42..8f0bb7248113 100644
--- a/include/__config
+++ b/include/__config
@@ -921,7 +921,7 @@ typedef unsigned int char32_t;
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
// Most unix variants have catopen. These are the specific ones that don't.
-# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION)
+# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION) && !defined(__GENODE__)
# define _LIBCPP_HAS_CATOPEN 1
# endif
#endif
@@ -1130,6 +1130,7 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container(
defined(__APPLE__) || \
defined(__CloudABI__) || \
defined(__sun__) || \
+ defined(__GENODE__) || \
(defined(__MINGW32__) && __has_include(<pthread.h>))
# define _LIBCPP_HAS_THREAD_API_PTHREAD
# elif defined(__Fuchsia__)
diff --git a/utils/google-benchmark/src/internal_macros.h b/utils/google-benchmark/src/internal_macros.h
index 5dbf4fd27521..4699c5ed9139 100644
--- a/utils/google-benchmark/src/internal_macros.h
+++ b/utils/google-benchmark/src/internal_macros.h
@@ -70,6 +70,8 @@
#define BENCHMARK_OS_FUCHSIA 1
#elif defined (__SVR4) && defined (__sun)
#define BENCHMARK_OS_SOLARIS 1
+#elif defined(__GENODE__)
+ #define BENCHMARK_OS_GENODE 1
#endif
#if defined(__ANDROID__) && defined(__GLIBCXX__)

View File

@ -1,30 +1,5 @@
diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake
index 5ef22eb493ba..f40625c7eed2 100644
--- a/cmake/modules/HandleLLVMOptions.cmake
+++ b/cmake/modules/HandleLLVMOptions.cmake
@@ -132,7 +132,7 @@ if(WIN32)
set(LLVM_ON_UNIX 0)
endif(CYGWIN)
else(WIN32)
- if(FUCHSIA OR UNIX)
+ if(FUCHSIA OR GENODE OR UNIX)
set(LLVM_ON_WIN32 0)
set(LLVM_ON_UNIX 1)
if(APPLE OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
@@ -140,9 +140,9 @@ else(WIN32)
else()
set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
endif()
- else(FUCHSIA OR UNIX)
+ else(FUCHSIA OR GENODE OR UNIX)
MESSAGE(SEND_ERROR "Unable to determine platform")
- endif(FUCHSIA OR UNIX)
+ endif(FUCHSIA OR GENODE OR UNIX)
endif(WIN32)
set(EXEEXT ${CMAKE_EXECUTABLE_SUFFIX})
diff --git a/include/llvm/ADT/Triple.h b/include/llvm/ADT/Triple.h
index 6bad18f19244..95459ca997c5 100644
index 6bad18f19244..71f7fd95621d 100644
--- a/include/llvm/ADT/Triple.h
+++ b/include/llvm/ADT/Triple.h
@@ -166,6 +166,7 @@ public:
@ -35,52 +10,221 @@ index 6bad18f19244..95459ca997c5 100644
IOS,
KFreeBSD,
Linux,
@@ -502,6 +503,8 @@ public:
bool isOSDragonFly() const { return getOS() == Triple::DragonFly; }
+ bool isOSGenode() const { return getOS() == Triple::Genode; }
+
bool isOSSolaris() const {
return getOS() == Triple::Solaris;
@@ -586,6 +587,11 @@ public:
return getOS() == Triple::KFreeBSD;
}
diff --git a/include/llvm/BinaryFormat/ELF.h b/include/llvm/BinaryFormat/ELF.h
index bdcf10fd1640..46ed8e56cc31 100644
--- a/include/llvm/BinaryFormat/ELF.h
+++ b/include/llvm/BinaryFormat/ELF.h
@@ -348,6 +348,7 @@ enum {
ELFOSABI_AROS = 15, // AROS
ELFOSABI_FENIXOS = 16, // FenixOS
ELFOSABI_CLOUDABI = 17, // Nuxi CloudABI
+ ELFOSABI_GENODE = 18, // Genode
ELFOSABI_FIRST_ARCH = 64, // First architecture-specific OS ABI
ELFOSABI_AMDGPU_HSA = 64, // AMD HSA runtime
ELFOSABI_AMDGPU_PAL = 65, // AMD PAL runtime
diff --git a/include/llvm/MC/MCELFObjectWriter.h b/include/llvm/MC/MCELFObjectWriter.h
index 8f78b99d3794..7a1d1981f60d 100644
--- a/include/llvm/MC/MCELFObjectWriter.h
+++ b/include/llvm/MC/MCELFObjectWriter.h
@@ -74,6 +74,8 @@ public:
switch (OSType) {
case Triple::CloudABI:
return ELF::ELFOSABI_CLOUDABI;
+ case Triple::Genode:
+ return ELF::ELFOSABI_GENODE;
case Triple::HermitCore:
return ELF::ELFOSABI_STANDALONE;
case Triple::PS4:
diff --git a/lib/ObjectYAML/ELFYAML.cpp b/lib/ObjectYAML/ELFYAML.cpp
index 2353b34f188b..e93f53c40888 100644
--- a/lib/ObjectYAML/ELFYAML.cpp
+++ b/lib/ObjectYAML/ELFYAML.cpp
@@ -268,6 +268,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration(
ECase(ELFOSABI_AROS);
ECase(ELFOSABI_FENIXOS);
ECase(ELFOSABI_CLOUDABI);
+ ECase(ELFOSABI_GENODE);
ECase(ELFOSABI_AMDGPU_HSA);
ECase(ELFOSABI_AMDGPU_PAL);
ECase(ELFOSABI_AMDGPU_MESA3D);
+ /// Tests whether the OS is Genode.
+ bool isOSGenode() const {
+ return getOS() == Triple::Genode;
+ }
+
/// Tests whether the OS is Hurd.
bool isOSHurd() const {
return getOS() == Triple::Hurd;
diff --git a/include/llvm/CodeGen/Passes.h b/include/llvm/CodeGen/Passes.h
index 9e5b4446c195..a48b9f93422a 100644
--- a/include/llvm/CodeGen/Passes.h
+++ b/include/llvm/CodeGen/Passes.h
@@ -341,7 +341,7 @@ namespace llvm {
/// createDwarfEHPass - This pass mulches exception handling code into a form
/// adapted to code generation. Required if using dwarf exception handling.
- FunctionPass *createDwarfEHPass(CodeGenOpt::Level OptLevel);
+ FunctionPass *createDwarfEHPass(CodeGenOpt::Level OptLevel, bool UseCxaEndCleanup);
/// createWinEHPass - Prepares personality functions used by MSVC on Windows,
/// in addition to the Itanium LSDA based personalities.
diff --git a/include/llvm/IR/RuntimeLibcalls.def b/include/llvm/IR/RuntimeLibcalls.def
index 903db6c70498..31f18803e8ab 100644
--- a/include/llvm/IR/RuntimeLibcalls.def
+++ b/include/llvm/IR/RuntimeLibcalls.def
@@ -417,6 +417,7 @@ HANDLE_LIBCALL(MEMSET_ELEMENT_UNORDERED_ATOMIC_16, "__llvm_memset_element_unorde
// Exception handling
HANDLE_LIBCALL(UNWIND_RESUME, "_Unwind_Resume")
+HANDLE_LIBCALL(CXA_END_CLEANUP, "__cxa_end_cleanup")
// Note: there are two sets of atomics libcalls; see
// <https://llvm.org/docs/Atomics.html> for more info on the
diff --git a/lib/CodeGen/DwarfEHPrepare.cpp b/lib/CodeGen/DwarfEHPrepare.cpp
index c75c957bff8a..992ff65fc8b4 100644
--- a/lib/CodeGen/DwarfEHPrepare.cpp
+++ b/lib/CodeGen/DwarfEHPrepare.cpp
@@ -49,10 +49,18 @@ namespace {
FunctionCallee RewindFunction = nullptr;
CodeGenOpt::Level OptLevel;
+ const bool IsArmEHABI;
DominatorTree *DT = nullptr;
const TargetLowering *TLI = nullptr;
- bool InsertUnwindResumeCalls(Function &Fn);
+ bool GetResumesVector(SmallVector<ResumeInst*, 16>&);
+ bool InsertABIResumeCall(Function &Fn);
+ bool InsertUnwindResumeCalls(Function &Fn,
+ SmallVector<ResumeInst*, 16> &Resumes,
+ size_t ResumesLeft);
+ bool InsertCxaEndCleanupCalls(Function &Fn,
+ SmallVector<ResumeInst*, 16> &Resumes,
+ size_t ResumesLeft);
Value *GetExceptionObject(ResumeInst *RI);
size_t
pruneUnreachableResumes(Function &Fn,
@@ -62,8 +70,10 @@ namespace {
public:
static char ID; // Pass identification, replacement for typeid.
- DwarfEHPrepare(CodeGenOpt::Level OptLevel = CodeGenOpt::Default)
- : FunctionPass(ID), OptLevel(OptLevel) {}
+ DwarfEHPrepare(CodeGenOpt::Level OptLevel = CodeGenOpt::Default,
+ bool IsArmEHABI = false)
+ : FunctionPass(ID), OptLevel(OptLevel),
+ IsArmEHABI(IsArmEHABI) {}
bool runOnFunction(Function &Fn) override;
@@ -91,8 +101,9 @@ INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
INITIALIZE_PASS_END(DwarfEHPrepare, DEBUG_TYPE,
"Prepare DWARF exceptions", false, false)
-FunctionPass *llvm::createDwarfEHPass(CodeGenOpt::Level OptLevel) {
- return new DwarfEHPrepare(OptLevel);
+FunctionPass *llvm::createDwarfEHPass(CodeGenOpt::Level OptLevel,
+ bool IsArmEHABI) {
+ return new DwarfEHPrepare(OptLevel, IsArmEHABI);
}
void DwarfEHPrepare::getAnalysisUsage(AnalysisUsage &AU) const {
@@ -184,9 +195,9 @@ size_t DwarfEHPrepare::pruneUnreachableResumes(
return ResumesLeft;
}
-/// InsertUnwindResumeCalls - Convert the ResumeInsts that are still present
-/// into calls to the appropriate _Unwind_Resume function.
-bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) {
+/// InsertABIResumeCall - Convert the ResumeInsts that are still present
+/// into calls to the appropriate exception resume function.
+bool DwarfEHPrepare::InsertABIResumeCall(Function &Fn) {
SmallVector<ResumeInst*, 16> Resumes;
SmallVector<LandingPadInst*, 16> CleanupLPads;
for (BasicBlock &BB : Fn) {
@@ -205,8 +216,6 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) {
if (isScopedEHPersonality(Pers))
return false;
- LLVMContext &Ctx = Fn.getContext();
-
size_t ResumesLeft = Resumes.size();
if (OptLevel != CodeGenOpt::None)
ResumesLeft = pruneUnreachableResumes(Fn, Resumes, CleanupLPads);
@@ -214,6 +223,19 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) {
if (ResumesLeft == 0)
return true; // We pruned them all.
+ const bool useCxaEndCleanup =
+ (Pers == EHPersonality::GNU_CXX) & IsArmEHABI;
+ if (useCxaEndCleanup)
+ return InsertCxaEndCleanupCalls(Fn, Resumes, ResumesLeft);
+ return InsertUnwindResumeCalls(Fn, Resumes, ResumesLeft);
+}
+
+/// InsertUnwindResumeCalls - Convert the ResumeInsts that are still present
+/// into calls to the appropriate _Unwind_Resume function.
+bool DwarfEHPrepare::InsertUnwindResumeCalls(
+ Function &Fn, SmallVector<ResumeInst*, 16> &Resumes, size_t ResumesLeft) {
+ LLVMContext &Ctx = Fn.getContext();
+
// Find the rewind function if we didn't already.
if (!RewindFunction) {
FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx),
@@ -264,13 +286,61 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) {
return true;
}
+bool DwarfEHPrepare::InsertCxaEndCleanupCalls(
+ Function &Fn, SmallVector<ResumeInst*, 16> &Resumes,
+ size_t ResumesLeft) {
+ LLVMContext &Ctx = Fn.getContext();
+
+ if (!RewindFunction) {
+ FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx), false);
+ const char *RewindName = TLI->getLibcallName(RTLIB::CXA_END_CLEANUP);
+ RewindFunction = Fn.getParent()->getOrInsertFunction(RewindName, FTy);
+ }
+
+ // Create the basic block where the __cxa_end_cleanup call will live.
+ if (ResumesLeft == 1) {
+ // Instead of creating a new BB just append the call to
+ // __cxa_end_cleanup to the end of the single resume block.
+ ResumeInst *RI = Resumes.front();
+ BasicBlock *UnwindBB = RI->getParent();
+
+ RI->eraseFromParent();
+
+ // Call the __cxa_end_cleanup function.
+ CallInst *CI = CallInst::Create(RewindFunction, "", UnwindBB);
+ CI->setCallingConv(TLI->getLibcallCallingConv(RTLIB::CXA_END_CLEANUP));
+
+ // We never expect _Unwind_Resume to return.
+ new UnreachableInst(Ctx, UnwindBB);
+ return true;
+ }
+
+ BasicBlock *UnwindBB = BasicBlock::Create(Ctx, "unwind_resume", &Fn);
+
+ for (ResumeInst *RI : Resumes) {
+ BasicBlock *Parent = RI->getParent();
+ BranchInst::Create(UnwindBB, Parent);
+
+ RI->eraseFromParent();
+
+ ++NumResumesLowered;
+ }
+
+ CallInst *CI = CallInst::Create(RewindFunction, "", UnwindBB);
+ CI->setCallingConv(TLI->getLibcallCallingConv(RTLIB::CXA_END_CLEANUP));
+
+ // We never expect __cxa_end_cleanup to return.
+ new UnreachableInst(Ctx, UnwindBB);
+ return true;
+}
+
bool DwarfEHPrepare::runOnFunction(Function &Fn) {
const TargetMachine &TM =
getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
DT = OptLevel != CodeGenOpt::None
? &getAnalysis<DominatorTreeWrapperPass>().getDomTree() : nullptr;
TLI = TM.getSubtargetImpl(Fn)->getTargetLowering();
- bool Changed = InsertUnwindResumeCalls(Fn);
+ bool Changed = InsertABIResumeCall(Fn);
DT = nullptr;
TLI = nullptr;
return Changed;
diff --git a/lib/CodeGen/TargetPassConfig.cpp b/lib/CodeGen/TargetPassConfig.cpp
index e0fdb0cefcb8..4da3325b8a1f 100644
--- a/lib/CodeGen/TargetPassConfig.cpp
+++ b/lib/CodeGen/TargetPassConfig.cpp
@@ -729,15 +729,17 @@ void TargetPassConfig::addPassesToHandleExceptions() {
addPass(createSjLjEHPreparePass(TM));
LLVM_FALLTHROUGH;
case ExceptionHandling::DwarfCFI:
+ addPass(createDwarfEHPass(getOptLevel(), false));
+ break;
case ExceptionHandling::ARM:
- addPass(createDwarfEHPass(getOptLevel()));
+ addPass(createDwarfEHPass(getOptLevel(), true));
break;
case ExceptionHandling::WinEH:
// We support using both GCC-style and MSVC-style exceptions on Windows, so
// add both preparation passes. Each pass will only actually run if it
// recognizes the personality function.
addPass(createWinEHPass());
- addPass(createDwarfEHPass(getOptLevel()));
+ addPass(createDwarfEHPass(getOptLevel(), false));
break;
case ExceptionHandling::Wasm:
// Wasm EH uses Windows EH instructions, but it does not need to demote PHIs
diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp
index fec1985ccaca..1f3e4f07fb8e 100644
--- a/lib/Support/Triple.cpp
@ -101,57 +245,150 @@ index fec1985ccaca..1f3e4f07fb8e 100644
.StartsWith("ios", Triple::IOS)
.StartsWith("kfreebsd", Triple::KFreeBSD)
.StartsWith("linux", Triple::Linux)
diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp
index 15076f1f8933..b0636e7eb196 100644
--- a/tools/llvm-readobj/ELFDumper.cpp
+++ b/tools/llvm-readobj/ELFDumper.cpp
@@ -1334,6 +1334,7 @@ static const EnumEntry<unsigned> ElfOSABI[] = {
{"AROS", "AROS", ELF::ELFOSABI_AROS},
{"FenixOS", "FenixOS", ELF::ELFOSABI_FENIXOS},
{"CloudABI", "CloudABI", ELF::ELFOSABI_CLOUDABI},
+ {"Genode", "Genode", ELF::ELFOSABI_GENODE},
{"Standalone", "Standalone App", ELF::ELFOSABI_STANDALONE}
};
diff --git a/test/CodeGen/ARM/debug-frame.ll b/test/CodeGen/ARM/debug-frame.ll
index b561be465d25..cfd439ef96ac 100644
--- a/test/CodeGen/ARM/debug-frame.ll
+++ b/test/CodeGen/ARM/debug-frame.ll
@@ -197,29 +197,28 @@ declare void @_ZSt9terminatev()
diff --git a/unittests/ADT/TripleTest.cpp b/unittests/ADT/TripleTest.cpp
index dc7a28c72f20..eb62772c1dda 100644
--- a/unittests/ADT/TripleTest.cpp
+++ b/unittests/ADT/TripleTest.cpp
@@ -248,6 +248,12 @@ TEST(TripleTest, ParsedIDs) {
EXPECT_EQ(Triple::Fuchsia, T.getOS());
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
; CHECK-V7-FP-LABEL: _Z4testiiiiiddddd:
; CHECK-V7-FP: .cfi_startproc
-; CHECK-V7-FP: push {r4, r10, r11, lr}
-; CHECK-V7-FP: .cfi_def_cfa_offset 16
+; CHECK-V7-FP: push {r11, lr}
+; CHECK-V7-FP: .cfi_def_cfa_offset 8
; CHECK-V7-FP: .cfi_offset lr, -4
; CHECK-V7-FP: .cfi_offset r11, -8
-; CHECK-V7-FP: .cfi_offset r10, -12
-; CHECK-V7-FP: .cfi_offset r4, -16
-; CHECK-V7-FP: add r11, sp, #8
-; CHECK-V7-FP: .cfi_def_cfa r11, 8
+; CHECK-V7-FP: .setfp r11, sp
+; CHECK-V7-FP: mov r11, sp
+; CHECK-V7-FP: .cfi_def_cfa_register r11
; CHECK-V7-FP: vpush {d8, d9, d10, d11, d12}
-; CHECK-V7-FP: .cfi_offset d12, -24
-; CHECK-V7-FP: .cfi_offset d11, -32
-; CHECK-V7-FP: .cfi_offset d10, -40
-; CHECK-V7-FP: .cfi_offset d9, -48
-; CHECK-V7-FP: .cfi_offset d8, -56
+; CHECK-V7-FP: .cfi_offset d12, -16
+; CHECK-V7-FP: .cfi_offset d11, -24
+; CHECK-V7-FP: .cfi_offset d10, -32
+; CHECK-V7-FP: .cfi_offset d9, -40
+; CHECK-V7-FP: .cfi_offset d8, -48
; CHECK-V7-FP: sub sp, sp, #24
; CHECK-V7-FP: .cfi_endproc
+ T = Triple("x86_64-unknown-genode");
+ EXPECT_EQ(Triple::x86_64, T.getArch());
+ EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+ EXPECT_EQ(Triple::Genode, T.getOS());
+ EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
+
T = Triple("x86_64-unknown-hermit");
EXPECT_EQ(Triple::x86_64, T.getArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
diff --git a/utils/benchmark/src/internal_macros.h b/utils/benchmark/src/internal_macros.h
index f2d54bfcbd9d..e20f891d435b 100644
--- a/utils/benchmark/src/internal_macros.h
+++ b/utils/benchmark/src/internal_macros.h
@@ -65,6 +65,8 @@
#define BENCHMARK_OS_FUCHSIA 1
#elif defined (__SVR4) && defined (__sun)
#define BENCHMARK_OS_SOLARIS 1
+#elif defined(__GENODE__)
+ #define BENCHMARK_OS_GENODE 1
#endif
; CHECK-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd:
; CHECK-V7-FP-ELIM: .cfi_startproc
-; CHECK-V7-FP-ELIM: push {r4, lr}
+; CHECK-V7-FP-ELIM: push {r11, lr}
; CHECK-V7-FP-ELIM: .cfi_def_cfa_offset 8
; CHECK-V7-FP-ELIM: .cfi_offset lr, -4
-; CHECK-V7-FP-ELIM: .cfi_offset r4, -8
+; CHECK-V7-FP-ELIM: .cfi_offset r11, -8
; CHECK-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12}
; CHECK-V7-FP-ELIM: .cfi_def_cfa_offset 48
; CHECK-V7-FP-ELIM: .cfi_offset d12, -16
@@ -260,29 +259,27 @@ declare void @_ZSt9terminatev()
#if !__has_feature(cxx_exceptions) && !defined(__cpp_exceptions) \
diff --git a/utils/gn/secondary/clang/lib/Driver/BUILD.gn b/utils/gn/secondary/clang/lib/Driver/BUILD.gn
index 04d483a12eed..e487a9a9a016 100644
--- a/utils/gn/secondary/clang/lib/Driver/BUILD.gn
+++ b/utils/gn/secondary/clang/lib/Driver/BUILD.gn
@@ -66,6 +66,7 @@ static_library("Driver") {
"ToolChains/Flang.cpp",
"ToolChains/FreeBSD.cpp",
"ToolChains/Fuchsia.cpp",
+ "ToolChains/Genode.cpp",
"ToolChains/Gnu.cpp",
"ToolChains/HIP.cpp",
"ToolChains/Haiku.cpp",
; CHECK-THUMB-V7-FP-LABEL: _Z4testiiiiiddddd:
; CHECK-THUMB-V7-FP: .cfi_startproc
-; CHECK-THUMB-V7-FP: push {r4, r6, r7, lr}
-; CHECK-THUMB-V7-FP: .cfi_def_cfa_offset 16
+; CHECK-THUMB-V7-FP: push {r7, lr}
+; CHECK-THUMB-V7-FP: .cfi_def_cfa_offset 8
; CHECK-THUMB-V7-FP: .cfi_offset lr, -4
; CHECK-THUMB-V7-FP: .cfi_offset r7, -8
-; CHECK-THUMB-V7-FP: .cfi_offset r6, -12
-; CHECK-THUMB-V7-FP: .cfi_offset r4, -16
-; CHECK-THUMB-V7-FP: add r7, sp, #8
-; CHECK-THUMB-V7-FP: .cfi_def_cfa r7, 8
+; CHECK-THUMB-V7-FP: mov r7, sp
+; CHECK-THUMB-V7-FP: .cfi_def_cfa_register r7
; CHECK-THUMB-V7-FP: vpush {d8, d9, d10, d11, d12}
-; CHECK-THUMB-V7-FP: .cfi_offset d12, -24
-; CHECK-THUMB-V7-FP: .cfi_offset d11, -32
-; CHECK-THUMB-V7-FP: .cfi_offset d10, -40
-; CHECK-THUMB-V7-FP: .cfi_offset d9, -48
-; CHECK-THUMB-V7-FP: .cfi_offset d8, -56
+; CHECK-THUMB-V7-FP: .cfi_offset d12, -16
+; CHECK-THUMB-V7-FP: .cfi_offset d11, -24
+; CHECK-THUMB-V7-FP: .cfi_offset d10, -32
+; CHECK-THUMB-V7-FP: .cfi_offset d9, -40
+; CHECK-THUMB-V7-FP: .cfi_offset d8, -48
; CHECK-THUMB-V7-FP: sub sp, #24
; CHECK-THUMB-V7-FP: .cfi_endproc
; CHECK-THUMB-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd:
; CHECK-THUMB-V7-FP-ELIM: .cfi_startproc
-; CHECK-THUMB-V7-FP-ELIM: push {r4, lr}
+; CHECK-THUMB-V7-FP-ELIM: push {r7, lr}
; CHECK-THUMB-V7-FP-ELIM: .cfi_def_cfa_offset 8
; CHECK-THUMB-V7-FP-ELIM: .cfi_offset lr, -4
-; CHECK-THUMB-V7-FP-ELIM: .cfi_offset r4, -8
+; CHECK-THUMB-V7-FP-ELIM: .cfi_offset r7, -8
; CHECK-THUMB-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12}
; CHECK-THUMB-V7-FP-ELIM: .cfi_def_cfa_offset 48
; CHECK-THUMB-V7-FP-ELIM: .cfi_offset d12, -16
@@ -296,20 +293,18 @@ declare void @_ZSt9terminatev()
; CHECK-THUMB-V7-FP-NOIAS-LABEL: _Z4testiiiiiddddd:
; CHECK-THUMB-V7-FP-NOIAS: .cfi_startproc
-; CHECK-THUMB-V7-FP-NOIAS: push {r4, r6, r7, lr}
-; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa_offset 16
+; CHECK-THUMB-V7-FP-NOIAS: push {r7, lr}
+; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa_offset 8
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 14, -4
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 7, -8
-; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 6, -12
-; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 4, -16
-; CHECK-THUMB-V7-FP-NOIAS: add r7, sp, #8
-; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa 7, 8
+; CHECK-THUMB-V7-FP-NOIAS: mov r7, sp
+; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa_register 7
; CHECK-THUMB-V7-FP-NOIAS: vpush {d8, d9, d10, d11, d12}
-; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 268, -24
-; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 267, -32
-; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 266, -40
-; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 265, -48
-; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 264, -56
+; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 268, -16
+; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 267, -24
+; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 266, -32
+; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 265, -40
+; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 264, -48
; CHECK-THUMB-V7-FP-NOIAS: sub sp, #24
; CHECK-THUMB-V7-FP-NOIAS: .cfi_endproc
diff --git a/test/CodeGen/ARM/ehabi.ll b/test/CodeGen/ARM/ehabi.ll
index 5c4a2b620a1f..7bc719a34fdc 100644
--- a/test/CodeGen/ARM/ehabi.ll
+++ b/test/CodeGen/ARM/ehabi.ll
@@ -181,10 +181,10 @@ declare void @_ZSt9terminatev()
; CHECK-V7-FP-LABEL: _Z4testiiiiiddddd:
; CHECK-V7-FP: .fnstart
-; CHECK-V7-FP: .save {r4, r10, r11, lr}
-; CHECK-V7-FP: push {r4, r10, r11, lr}
-; CHECK-V7-FP: .setfp r11, sp, #8
-; CHECK-V7-FP: add r11, sp, #8
+; CHECK-V7-FP: .save {r11, lr}
+; CHECK-V7-FP: push {r11, lr}
+; CHECK-V7-FP: .setfp r11, sp
+; CHECK-V7-FP: mov r11, sp
; CHECK-V7-FP: .vsave {d8, d9, d10, d11, d12}
; CHECK-V7-FP: vpush {d8, d9, d10, d11, d12}
; CHECK-V7-FP: .pad #24
@@ -195,8 +195,8 @@ declare void @_ZSt9terminatev()
; CHECK-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd:
; CHECK-V7-FP-ELIM: .fnstart
-; CHECK-V7-FP-ELIM: .save {r4, lr}
-; CHECK-V7-FP-ELIM: push {r4, lr}
+; CHECK-V7-FP-ELIM: .save {r11, lr}
+; CHECK-V7-FP-ELIM: push {r11, lr}
; CHECK-V7-FP-ELIM: .vsave {d8, d9, d10, d11, d12}
; CHECK-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12}
; CHECK-V7-FP-ELIM: .pad #24