Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit e571205

Browse files
committed
Add support 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 to let the Linux ELF loader distinguish them from regular Unix/Linux binaries and load them using the HermitCore "proxy" tool.
1 parent 0fac2fc commit e571205

File tree

6 files changed

+14
-1
lines changed

6 files changed

+14
-1
lines changed

include/llvm/ADT/Triple.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ class Triple {
182182
Mesa3D,
183183
Contiki,
184184
AMDPAL, // AMD PAL Runtime
185-
LastOSType = AMDPAL
185+
HermitCore, // HermitCore Unikernel/Multikernel
186+
LastOSType = HermitCore
186187
};
187188
enum EnvironmentType {
188189
UnknownEnvironment,

include/llvm/BinaryFormat/ELF.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ enum {
357357
ELFOSABI_AMDGPU_HSA = 64, // AMD HSA runtime
358358
ELFOSABI_AMDGPU_PAL = 65, // AMD PAL runtime
359359
ELFOSABI_AMDGPU_MESA3D = 66, // AMD GCN GPUs (GFX6+) for MESA runtime
360+
ELFOSABI_HERMITCORE = 66, // HermitCore Unikernel/Multikernel
360361
ELFOSABI_ARM = 97, // ARM
361362
ELFOSABI_C6000_ELFABI = 64, // Bare-metal TMS320C6000
362363
ELFOSABI_C6000_LINUX = 65, // Linux TMS320C6000

include/llvm/MC/MCELFObjectWriter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class MCELFObjectTargetWriter : public MCObjectTargetWriter {
7373
switch (OSType) {
7474
case Triple::CloudABI:
7575
return ELF::ELFOSABI_CLOUDABI;
76+
case Triple::HermitCore:
77+
return ELF::ELFOSABI_HERMITCORE;
7678
case Triple::PS4:
7779
case Triple::FreeBSD:
7880
return ELF::ELFOSABI_FREEBSD;

lib/Support/Triple.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ StringRef Triple::getOSTypeName(OSType Kind) {
209209
case Mesa3D: return "mesa3d";
210210
case Contiki: return "contiki";
211211
case AMDPAL: return "amdpal";
212+
case HermitCore: return "hermit";
212213
}
213214

214215
llvm_unreachable("Invalid OSType");
@@ -502,6 +503,7 @@ static Triple::OSType parseOS(StringRef OSName) {
502503
.StartsWith("mesa3d", Triple::Mesa3D)
503504
.StartsWith("contiki", Triple::Contiki)
504505
.StartsWith("amdpal", Triple::AMDPAL)
506+
.StartsWith("hermit", Triple::HermitCore)
505507
.Default(Triple::UnknownOS);
506508
}
507509

tools/llvm-readobj/ELFDumper.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,7 @@ static const EnumEntry<unsigned> ElfOSABI[] = {
868868
{"AROS", "AROS", ELF::ELFOSABI_AROS},
869869
{"FenixOS", "FenixOS", ELF::ELFOSABI_FENIXOS},
870870
{"CloudABI", "CloudABI", ELF::ELFOSABI_CLOUDABI},
871+
{"HermitCore", "HermitCore", ELF::ELFOSABI_HERMITCORE},
871872
{"Standalone", "Standalone App", ELF::ELFOSABI_STANDALONE}
872873
};
873874

unittests/ADT/TripleTest.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,12 @@ TEST(TripleTest, ParsedIDs) {
235235
EXPECT_EQ(Triple::Fuchsia, T.getOS());
236236
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
237237

238+
T = Triple("x86_64-unknown-hermit");
239+
EXPECT_EQ(Triple::x86_64, T.getArch());
240+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
241+
EXPECT_EQ(Triple::HermitCore, T.getOS());
242+
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
243+
238244
T = Triple("wasm32-unknown-unknown");
239245
EXPECT_EQ(Triple::wasm32, T.getArch());
240246
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());

0 commit comments

Comments
 (0)