Skip to content

Commit 2324929

Browse files
committed
volta: Add armhf support
1 parent 0444823 commit 2324929

File tree

11 files changed

+61
-2
lines changed

11 files changed

+61
-2
lines changed

GNUmakefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ UNAME ?= $(HOST_UNAME)
1212
MACHINE ?= $(strip $(shell uname -m))
1313
LLVM_CONFIG ?= llvm-config
1414
LLVM_CXXFLAGS = $(shell $(LLVM_CONFIG) --cxxflags)
15-
LLVM_LDFLAGS = $(shell $(LLVM_CONFIG) --libs core analysis bitwriter bitreader linker target engine x86codegen aarch64codegen)
15+
LLVM_LDFLAGS = $(shell $(LLVM_CONFIG) --libs core analysis bitwriter bitreader linker target engine x86codegen aarch64codegen armcodegen)
1616
LLVM_LDFLAGS := $(LLVM_LDFLAGS) $(shell $(LLVM_CONFIG) --ldflags) -lstdc++
1717
ifeq ($(shell echo "$(LLVM_CONFIG) --system-libs &> /dev/null && echo OK" | bash -t), OK)
1818
LLVM_LDFLAGS := $(LLVM_LDFLAGS) $(shell $(LLVM_CONFIG) --system-libs)

battery.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ llvmHack = true
1616
#
1717
[platform.'osx || linux']
1818
libraries = ["stdc++"]
19-
commands = ["llvm-config --system-libs --ldflags --libs core bitwriter bitreader linker target engine x86codegen aarch64codegen"]
19+
commands = ["llvm-config --system-libs --ldflags --libs core bitwriter bitreader linker target engine x86codegen aarch64codegen armcodegen"]
2020
#
2121
# On Windows the user will need to provide LLVM.lib
2222
#

lib/src/volta/interfaces.d

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ enum Arch
108108
{
109109
X86,
110110
X86_64,
111+
ARMHF,
111112
AArch64,
112113
}
113114

@@ -192,6 +193,8 @@ public:
192193
"none",
193194
"Volt",
194195
// Arch
196+
"ARM",
197+
"ARMHF",
195198
"AArch64",
196199
"X86",
197200
"X86_64",
@@ -345,6 +348,11 @@ public:
345348
overwriteVersionIdentifier("LittleEndian");
346349
overwriteVersionIdentifier("V_P64");
347350
break;
351+
case ARMHF:
352+
overwriteVersionIdentifier("ARMHF");
353+
overwriteVersionIdentifier("LittleEndian");
354+
overwriteVersionIdentifier("V_P32");
355+
break;
348356
case AArch64:
349357
overwriteVersionIdentifier("AArch64");
350358
overwriteVersionIdentifier("LittleEndian");

lib/src/volta/settings.d

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ public:
106106
case Metal: platformStr = "metal"; break;
107107
}
108108
final switch (arch) with (Arch) {
109+
case ARMHF: archStr = "armhf"; break;
109110
case AArch64: archStr = "aarch64"; break;
110111
case X86: archStr = "x86"; break;
111112
case X86_64: archStr = "x86_64"; break;
@@ -174,6 +175,10 @@ public:
174175
arch = Arch.X86;
175176
} else version (X86_64) {
176177
arch = Arch.X86_64;
178+
} else version (ARM) {
179+
arch = Arch.ARMHF;
180+
} else version (ARMHF) {
181+
arch = Arch.ARMHF;
177182
} else version (AArch64) {
178183
arch = Arch.X86_64;
179184
} else {

lib/src/volta/util/string.d

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ string archToString(Arch arch)
4343
final switch (arch) with (Arch) {
4444
case X86: return "x86";
4545
case X86_64: return "x86_64";
46+
case ARMHF: return "armhf";
4647
case AArch64: return "aarch64";
4748
}
4849
}

src/lib/llvm/c/Target.d

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ void LLVMInitializeX86AsmPrinter();
5454
void LLVMInitializeX86AsmParser();
5555
void LLVMInitializeX86Disassembler();
5656

57+
/* ARM target support */
58+
void LLVMInitializeARMTargetInfo();
59+
void LLVMInitializeARMTarget();
60+
void LLVMInitializeARMTargetMC();
61+
void LLVMInitializeARMAsmPrinter();
62+
void LLVMInitializeARMAsmParser();
63+
void LLVMInitializeARMDisassembler();
64+
5765
/* AArch64 target support */
5866
void LLVMInitializeAArch64TargetInfo();
5967
void LLVMInitializeAArch64Target();

src/volt/arg.d

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,8 @@ Arch parseArch(string a)
281281
return Arch.X86;
282282
case "x86_64":
283283
return Arch.X86_64;
284+
case "armhf":
285+
return Arch.ARMHF;
284286
case "aarch64":
285287
return Arch.AArch64;
286288
default:

src/volt/driver.d

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -921,6 +921,19 @@ TargetInfo setTargetInfo(TargetInfo target, Arch arch, Platform platform, CRunti
921921
target.alignment.ptr = 8;
922922
target.alignment.aggregate = 8; // abi X, prefered 8
923923
break;
924+
case ARMHF:
925+
target.isP64 = false;
926+
target.ptrSize = 4;
927+
target.alignment.int1 = 1;
928+
target.alignment.int8 = 1;
929+
target.alignment.int16 = 2;
930+
target.alignment.int32 = 4;
931+
target.alignment.int64 = 8;
932+
target.alignment.float32 = 4;
933+
target.alignment.float64 = 4;
934+
target.alignment.ptr = 4;
935+
target.alignment.aggregate = 8;
936+
break;
924937
case AArch64:
925938
target.isP64 = true;
926939
target.ptrSize = 8;

src/volt/llvm/backend.d

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ public:
8181
LLVMInitializeX86TargetMC();
8282
LLVMInitializeX86AsmPrinter();
8383
break;
84+
case ARMHF:
85+
LLVMInitializeARMTargetInfo();
86+
LLVMInitializeARMTarget();
87+
LLVMInitializeARMTargetMC();
88+
LLVMInitializeARMAsmPrinter();
89+
break;
8490
case AArch64:
8591
LLVMInitializeAArch64TargetInfo();
8692
LLVMInitializeAArch64Target();
@@ -471,6 +477,7 @@ string getArchTarget(TargetInfo target)
471477
final switch (target.arch) with (Arch) {
472478
case X86: return "x86";
473479
case X86_64: return "x86-64";
480+
case ARMHF: return "arm";
474481
case AArch64: return "aarch64";
475482
}
476483
}
@@ -489,30 +496,35 @@ string getTriple(TargetInfo target)
489496
final switch (target.arch) with (Arch) {
490497
case X86: return "i686-w64-windows-gnu";
491498
case X86_64: return "x86_64-w64-windows-gnu";
499+
case ARMHF: assert(false);
492500
case AArch64: assert(false);
493501
}
494502
case Metal:
495503
final switch (target.arch) with (Arch) {
496504
case X86: return "i686-pc-none-elf";
497505
case X86_64: return "x86_64-pc-none-elf";
506+
case ARMHF: assert(false);
498507
case AArch64: assert(false);
499508
}
500509
case MSVC:
501510
final switch (target.arch) with (Arch) {
502511
case X86: assert(false);
503512
case X86_64: return "x86_64-pc-windows-msvc";
513+
case ARMHF: assert(false);
504514
case AArch64: assert(false);
505515
}
506516
case Linux:
507517
final switch (target.arch) with (Arch) {
508518
case X86: return "i386-pc-linux-gnu";
509519
case X86_64: return "x86_64-pc-linux-gnu";
520+
case ARMHF: return "armv7l-unknown-linux-gnueabihf";
510521
case AArch64: return "aarch64-unknown-linux-gnu";
511522
}
512523
case OSX:
513524
final switch (target.arch) with (Arch) {
514525
case X86: return "i386-apple-macosx10.9.0";
515526
case X86_64: return "x86_64-apple-macosx10.9.0";
527+
case ARMHF: assert(false);
516528
case AArch64: assert(false);
517529
}
518530
}
@@ -532,30 +544,35 @@ string getLayout(TargetInfo target)
532544
final switch (target.arch) with (Arch) {
533545
case X86: return layoutWinLinux32;
534546
case X86_64: return layoutWinLinux64;
547+
case ARMHF: assert(false);
535548
case AArch64: assert(false);
536549
}
537550
case Metal:
538551
final switch (target.arch) with (Arch) {
539552
case X86: return layoutMetal32;
540553
case X86_64: return layoutMetal64;
554+
case ARMHF: assert(false);
541555
case AArch64: assert(false);
542556
}
543557
case MSVC:
544558
final switch (target.arch) with (Arch) {
545559
case X86: assert(false);
546560
case X86_64: return layoutWinLinux64;
561+
case ARMHF: assert(false);
547562
case AArch64: assert(false);
548563
}
549564
case Linux:
550565
final switch (target.arch) with (Arch) {
551566
case X86: return layoutWinLinux32;
552567
case X86_64: return layoutWinLinux64;
568+
case ARMHF: return layoutARMHFLinux32;
553569
case AArch64: return layoutAArch64Linux64;
554570
}
555571
case OSX:
556572
final switch (target.arch) with (Arch) {
557573
case X86: return layoutOSX32;
558574
case X86_64: return layoutOSX64;
575+
case ARMHF: assert(false);
559576
case AArch64: assert(false);
560577
}
561578
}
@@ -572,6 +589,7 @@ enum string layoutWinLinux64 = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
572589
enum string layoutOSX32 = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
573590
enum string layoutOSX64 = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
574591
enum string layoutAArch64Linux64 = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128";
592+
enum string layoutARMHFLinux32 = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
575593
//! @}
576594

577595
/*!

src/volt/llvm/common.d

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ bool shouldCUseStructRet(TargetInfo target, ir.Struct irStruct)
3232
return true;
3333
case X86_64:
3434
return structSize > 16;
35+
case ARMHF:
3536
case AArch64:
3637
// !?!?!
3738
return structSize > 16;
@@ -42,6 +43,7 @@ bool shouldCUseStructRet(TargetInfo target, ir.Struct irStruct)
4243
return structSize != 4 && structSize != 8;
4344
case X86_64:
4445
return structSize > 16;
46+
case ARMHF: assert(false);
4547
case AArch64: assert(false);
4648
}
4749
case MSVC:
@@ -50,6 +52,7 @@ bool shouldCUseStructRet(TargetInfo target, ir.Struct irStruct)
5052
case X86:
5153
case X86_64:
5254
return structSize != 4 && structSize != 8;
55+
case ARMHF: assert(false);
5356
case AArch64: assert(false);
5457
}
5558
}

src/volt/llvm/driver.d

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ protected:
311311
final switch (target.arch) with (Arch) {
312312
case X86: args ~= "-m32"; break;
313313
case X86_64: args ~= "-m64"; break;
314+
case ARMHF: break;
314315
case AArch64: break;
315316
}
316317

0 commit comments

Comments
 (0)