[PATCH] D48964: Add support for writing HermitCore (https://hermitcore.org) ELF binaries.
Colin Finck via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 5 04:41:16 PDT 2018
ColinFinck created this revision.
ColinFinck added a reviewer: echristo.
Herald added subscribers: llvm-commits, dexonsmith.
This patch adds support to LLVM for writing HermitCore (https://hermitcore.org) ELF binaries.
HermitCore is a POSIX-compatible kernel for running a single application in an isolated environment to get maximum performance and predictable runtime behavior. It can either be used bare-metal on hardware or a VM (Unikernel) or side by side to an existing Linux system (Multikernel).
Due to the latter feature, HermitCore binaries are marked with a different OS ABI (0x42 = 66) to let the Linux ELF loader distinguish them from regular Unix/Linux binaries and load them using the HermitCore "proxy" tool.
Similar changes have already been done to binutils (https://github.com/hermitcore/binutils/commit/c80f41d4b7ab58892112864110456d37eda6a2e3) and are due to be submitted to binutils upstream soon.
Adding @echristo as reviewer, because he already reviewed similar changes for LLVM CloudABI support in the past.
Repository:
rL LLVM
https://reviews.llvm.org/D48964
Files:
include/llvm/ADT/Triple.h
include/llvm/BinaryFormat/ELF.h
include/llvm/MC/MCELFObjectWriter.h
lib/Support/Triple.cpp
tools/llvm-readobj/ELFDumper.cpp
unittests/ADT/TripleTest.cpp
Index: unittests/ADT/TripleTest.cpp
===================================================================
--- unittests/ADT/TripleTest.cpp
+++ unittests/ADT/TripleTest.cpp
@@ -235,6 +235,12 @@
EXPECT_EQ(Triple::Fuchsia, 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());
+ EXPECT_EQ(Triple::HermitCore, T.getOS());
+ EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
+
T = Triple("wasm32-unknown-unknown");
EXPECT_EQ(Triple::wasm32, T.getArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
Index: tools/llvm-readobj/ELFDumper.cpp
===================================================================
--- tools/llvm-readobj/ELFDumper.cpp
+++ tools/llvm-readobj/ELFDumper.cpp
@@ -868,6 +868,7 @@
{"AROS", "AROS", ELF::ELFOSABI_AROS},
{"FenixOS", "FenixOS", ELF::ELFOSABI_FENIXOS},
{"CloudABI", "CloudABI", ELF::ELFOSABI_CLOUDABI},
+ {"HermitCore", "HermitCore", ELF::ELFOSABI_HERMITCORE},
{"Standalone", "Standalone App", ELF::ELFOSABI_STANDALONE}
};
Index: lib/Support/Triple.cpp
===================================================================
--- lib/Support/Triple.cpp
+++ lib/Support/Triple.cpp
@@ -208,6 +208,7 @@
case Mesa3D: return "mesa3d";
case Contiki: return "contiki";
case AMDPAL: return "amdpal";
+ case HermitCore: return "hermit";
}
llvm_unreachable("Invalid OSType");
@@ -500,6 +501,7 @@
.StartsWith("mesa3d", Triple::Mesa3D)
.StartsWith("contiki", Triple::Contiki)
.StartsWith("amdpal", Triple::AMDPAL)
+ .StartsWith("hermit", Triple::HermitCore)
.Default(Triple::UnknownOS);
}
Index: include/llvm/MC/MCELFObjectWriter.h
===================================================================
--- include/llvm/MC/MCELFObjectWriter.h
+++ include/llvm/MC/MCELFObjectWriter.h
@@ -73,6 +73,8 @@
switch (OSType) {
case Triple::CloudABI:
return ELF::ELFOSABI_CLOUDABI;
+ case Triple::HermitCore:
+ return ELF::ELFOSABI_HERMITCORE;
case Triple::PS4:
case Triple::FreeBSD:
return ELF::ELFOSABI_FREEBSD;
Index: include/llvm/BinaryFormat/ELF.h
===================================================================
--- include/llvm/BinaryFormat/ELF.h
+++ include/llvm/BinaryFormat/ELF.h
@@ -357,6 +357,7 @@
ELFOSABI_AMDGPU_HSA = 64, // AMD HSA runtime
ELFOSABI_AMDGPU_PAL = 65, // AMD PAL runtime
ELFOSABI_AMDGPU_MESA3D = 66, // AMD GCN GPUs (GFX6+) for MESA runtime
+ ELFOSABI_HERMITCORE = 66, // HermitCore Unikernel/Multikernel
ELFOSABI_ARM = 97, // ARM
ELFOSABI_C6000_ELFABI = 64, // Bare-metal TMS320C6000
ELFOSABI_C6000_LINUX = 65, // Linux TMS320C6000
Index: include/llvm/ADT/Triple.h
===================================================================
--- include/llvm/ADT/Triple.h
+++ include/llvm/ADT/Triple.h
@@ -181,7 +181,8 @@
Mesa3D,
Contiki,
AMDPAL, // AMD PAL Runtime
- LastOSType = AMDPAL
+ HermitCore, // HermitCore Unikernel/Multikernel
+ LastOSType = HermitCore
};
enum EnvironmentType {
UnknownEnvironment,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D48964.154195.patch
Type: text/x-patch
Size: 3290 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180705/062de734/attachment.bin>
More information about the llvm-commits
mailing list