diff --git a/overlay/llvm-11/clang/genode.patch b/overlay/llvm-11/clang/genode.patch index 0668a29..77daa11 100644 --- a/overlay/llvm-11/clang/genode.patch +++ b/overlay/llvm-11/clang/genode.patch @@ -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; -+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(Triple, Opts); case llvm::Triple::Minix: -@@ -544,6 +550,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, - return new FreeBSDTargetInfo(Triple, Opts); - case llvm::Triple::Fuchsia: - return new FuchsiaTargetInfo(Triple, Opts); +@@ -561,6 +567,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, + } + case llvm::Triple::Haiku: + return new HaikuTargetInfo(Triple, Opts); + case llvm::Triple::Genode: + return new GenodeTargetInfo(Triple, Opts); - case llvm::Triple::KFreeBSD: - return new KFreeBSDTargetInfo(Triple, Opts); - case llvm::Triple::Solaris: + case llvm::Triple::NaCl: + return new NaClTargetInfo(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(Triple, Opts) {} }; +// Genode Target @@ -136,18 +115,17 @@ index 2a9e4f91d478..e453358027f0 100644 + this->HasFloat128 = true; + break; + } -+ + } +}; + - // WebAssembly target + // Haiku Target template - class LLVM_LIBRARY_VISIBILITY WebAssemblyOSTargetInfo + class LLVM_LIBRARY_VISIBILITY HaikuTargetInfo : public OSTargetInfo { 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 { @@ -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(*this, Target, Args); +@@ -4919,6 +4920,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, + case llvm::Triple::FreeBSD: + TC = std::make_unique(*this, Target, Args); break; + case llvm::Triple::Genode: + TC = std::make_unique(*this, Target, Args); + break; - case llvm::Triple::AMDHSA: - TC = std::make_unique(*this, Target, Args); + case llvm::Triple::Minix: + TC = std::make_unique(*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(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(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 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: { - // 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 diff --git a/overlay/llvm-11/libc++/genode.patch b/overlay/llvm-11/libc++/genode.patch index 8876a1b..e69de29 100644 --- a/overlay/llvm-11/libc++/genode.patch +++ b/overlay/llvm-11/libc++/genode.patch @@ -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()) - # 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__) diff --git a/overlay/llvm-11/llvm-genode.patch b/overlay/llvm-11/llvm-genode.patch index 3f194f0..0c05baf 100644 --- a/overlay/llvm-11/llvm-genode.patch +++ b/overlay/llvm-11/llvm-genode.patch @@ -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::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 + // 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&); ++ bool InsertABIResumeCall(Function &Fn); ++ bool InsertUnwindResumeCalls(Function &Fn, ++ SmallVector &Resumes, ++ size_t ResumesLeft); ++ bool InsertCxaEndCleanupCalls(Function &Fn, ++ SmallVector &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 Resumes; + SmallVector 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 &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 &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().getTM(); + DT = OptLevel != CodeGenOpt::None + ? &getAnalysis().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 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