Skip to content

Commit 2d67fc8

Browse files
petrhosekgithub-actions[bot]
authored andcommitted
Automerge: [Clang][LLVM] Support for Fuchsia on ARM (#163848)
This introduces the support for 32-bit ARM Fuchsia target which uses the aapcs-linux ABI defaulting to thumbv8a as the target.
2 parents ebe5c3a + 7b190b7 commit 2d67fc8

File tree

10 files changed

+32
-7
lines changed

10 files changed

+32
-7
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
222222
return std::make_unique<OHOSTargetInfo<ARMleTargetInfo>>(Triple, Opts);
223223
case llvm::Triple::FreeBSD:
224224
return std::make_unique<FreeBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
225+
case llvm::Triple::Fuchsia:
226+
return std::make_unique<FuchsiaTargetInfo<ARMleTargetInfo>>(Triple, Opts);
225227
case llvm::Triple::NetBSD:
226228
return std::make_unique<NetBSDTargetInfo<ARMleTargetInfo>>(Triple, Opts);
227229
case llvm::Triple::OpenBSD:
@@ -254,6 +256,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
254256
return std::make_unique<AppleMachOARMTargetInfo>(Triple, Opts);
255257

256258
switch (os) {
259+
case llvm::Triple::Fuchsia:
260+
return std::make_unique<FuchsiaTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
257261
case llvm::Triple::Linux:
258262
return std::make_unique<LinuxTargetInfo<ARMbeTargetInfo>>(Triple, Opts);
259263
case llvm::Triple::NetBSD:

clang/lib/Basic/Targets/ARM.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ ARMTargetInfo::ARMTargetInfo(const llvm::Triple &Triple,
260260
: TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
261261
HW_FP(0) {
262262
bool IsFreeBSD = Triple.isOSFreeBSD();
263+
bool IsFuchsia = Triple.isOSFuchsia();
263264
bool IsOpenBSD = Triple.isOSOpenBSD();
264265
bool IsNetBSD = Triple.isOSNetBSD();
265266
bool IsHaiku = Triple.isOSHaiku();
@@ -332,7 +333,7 @@ ARMTargetInfo::ARMTargetInfo(const llvm::Triple &Triple,
332333
default:
333334
if (IsNetBSD)
334335
setABI("apcs-gnu");
335-
else if (IsFreeBSD || IsOpenBSD || IsHaiku || IsOHOS)
336+
else if (IsFreeBSD || IsFuchsia || IsOpenBSD || IsHaiku || IsOHOS)
336337
setABI("aapcs-linux");
337338
else
338339
setABI("aapcs");

clang/lib/Driver/ToolChains/Arch/ARM.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,8 @@ void arm::setArchNameInTriple(const Driver &D, const ArgList &Args,
290290
// Thumb2 is the default for V7 on Darwin.
291291
(llvm::ARM::parseArchVersion(Suffix) == 7 &&
292292
Triple.isOSBinFormatMachO()) ||
293+
// Thumb2 is the default for Fuchsia.
294+
Triple.isOSFuchsia() ||
293295
// FIXME: this is invalid for WindowsCE
294296
Triple.isOSWindows();
295297

@@ -452,6 +454,9 @@ arm::FloatABI arm::getDefaultFloatABI(const llvm::Triple &Triple) {
452454
case llvm::Triple::OpenBSD:
453455
return FloatABI::SoftFP;
454456

457+
case llvm::Triple::Fuchsia:
458+
return FloatABI::Hard;
459+
455460
default:
456461
if (Triple.isOHOSFamily())
457462
return FloatABI::Soft;

clang/test/Driver/arm-abi.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
// FreeBSD / OpenBSD default to aapcs-linux
3232
// RUN: %clang -target arm--freebsd- %s -### -o %t.o 2>&1 \
3333
// RUN: | FileCheck -check-prefix=CHECK-AAPCS-LINUX %s
34+
// RUN: %clang -target arm--fuchsia- %s -### -o %t.o 2>&1 \
35+
// RUN: | FileCheck -check-prefix=CHECK-AAPCS-LINUX %s
3436
// RUN: %clang -target arm--openbsd- %s -### -o %t.o 2>&1 \
3537
// RUN: | FileCheck -check-prefix=CHECK-AAPCS-LINUX %s
3638
// RUN: %clang -target arm--haiku- %s -### -o %t.o 2>&1 \

clang/test/Driver/fuchsia.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
33
// RUN: --sysroot=%S/platform -fuse-ld=ld 2>&1 \
44
// RUN: | FileCheck -check-prefixes=CHECK,CHECK-X86_64 %s
5+
// RUN: %clang -### %s --target=arm-unknown-fuchsia \
6+
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
7+
// RUN: --sysroot=%S/platform -fuse-ld=ld 2>&1 \
8+
// RUN: | FileCheck -check-prefixes=CHECK,CHECK-ARMV8A %s
59
// RUN: %clang -### %s --target=aarch64-unknown-fuchsia \
610
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
711
// RUN: --sysroot=%S/platform -fuse-ld=ld 2>&1 \
@@ -14,6 +18,10 @@
1418
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
1519
// RUN: --sysroot=%S/platform -fuse-ld=ld 2>&1 \
1620
// RUN: | FileCheck -check-prefixes=CHECK,CHECK-X86_64 %s
21+
// RUN: %clang -### %s --target=arm-fuchsia \
22+
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
23+
// RUN: --sysroot=%S/platform -fuse-ld=ld 2>&1 \
24+
// RUN: | FileCheck -check-prefixes=CHECK,CHECK-ARMV8A %s
1725
// RUN: %clang -### %s --target=aarch64-fuchsia \
1826
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
1927
// RUN: --sysroot=%S/platform -fuse-ld=ld 2>&1 \
@@ -24,6 +32,7 @@
2432
// RUN: | FileCheck -check-prefixes=CHECK,CHECK-RISCV64 %s
2533
// CHECK: "-cc1"
2634
// CHECK-X86_64: "-triple" "x86_64-unknown-fuchsia"
35+
// CHECK-ARMV8A: "-triple" "thumbv8a-unknown-fuchsia"
2736
// CHECK-AARCH64: "-triple" "aarch64-unknown-fuchsia"
2837
// CHECK-RISCV64: "-triple" "riscv64-unknown-fuchsia"
2938
// CHECK: "-funwind-tables=2"

llvm/include/llvm/IR/RuntimeLibcalls.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ struct RuntimeLibcallsInfo {
236236

237237
static bool hasAEABILibcalls(const Triple &TT) {
238238
return TT.isTargetAEABI() || TT.isTargetGNUAEABI() ||
239-
TT.isTargetMuslAEABI() || TT.isAndroid();
239+
TT.isTargetMuslAEABI() || TT.isOSFuchsia() || TT.isAndroid();
240240
}
241241

242242
LLVM_READONLY

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,8 @@ class Triple {
935935
getEnvironment() == Triple::GNUEABIHF ||
936936
getEnvironment() == Triple::GNUEABIHFT64 ||
937937
getEnvironment() == Triple::OpenHOS ||
938-
getEnvironment() == Triple::MuslEABIHF || isAndroid()) &&
938+
getEnvironment() == Triple::MuslEABIHF || isOSFuchsia() ||
939+
isAndroid()) &&
939940
isOSBinFormatELF() && !isOSNetBSD();
940941
}
941942

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,7 +1089,7 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
10891089

10901090
// Register based DivRem for AEABI (RTABI 4.2)
10911091
if (TT.isTargetAEABI() || TT.isAndroid() || TT.isTargetGNUAEABI() ||
1092-
TT.isTargetMuslAEABI() || TT.isOSWindows()) {
1092+
TT.isTargetMuslAEABI() || TT.isOSFuchsia() || TT.isOSWindows()) {
10931093
setOperationAction(ISD::SREM, MVT::i64, Custom);
10941094
setOperationAction(ISD::UREM, MVT::i64, Custom);
10951095
HasStandaloneRem = false;
@@ -20575,7 +20575,7 @@ static TargetLowering::ArgListTy getDivRemArgList(
2057520575
SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
2057620576
assert((Subtarget->isTargetAEABI() || Subtarget->isTargetAndroid() ||
2057720577
Subtarget->isTargetGNUAEABI() || Subtarget->isTargetMuslAEABI() ||
20578-
Subtarget->isTargetWindows()) &&
20578+
Subtarget->isTargetFuchsia() || Subtarget->isTargetWindows()) &&
2057920579
"Register-based DivRem lowering only");
2058020580
unsigned Opcode = Op->getOpcode();
2058120581
assert((Opcode == ISD::SDIVREM || Opcode == ISD::UDIVREM) &&

llvm/lib/Target/ARM/ARMSubtarget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ class ARMSubtarget : public ARMGenSubtargetInfo {
343343
bool isTargetWatchOS() const { return TargetTriple.isWatchOS(); }
344344
bool isTargetWatchABI() const { return TargetTriple.isWatchABI(); }
345345
bool isTargetDriverKit() const { return TargetTriple.isDriverKit(); }
346+
bool isTargetFuchsia() const { return TargetTriple.isOSFuchsia(); }
346347
bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
347348
bool isTargetNetBSD() const { return TargetTriple.isOSNetBSD(); }
348349
bool isTargetWindows() const { return TargetTriple.isOSWindows(); }

llvm/lib/TargetParser/ARMTargetParser.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -567,8 +567,8 @@ StringRef ARM::computeDefaultTargetABI(const Triple &TT) {
567567
default:
568568
if (TT.isOSNetBSD())
569569
return "apcs-gnu";
570-
if (TT.isOSFreeBSD() || TT.isOSOpenBSD() || TT.isOSHaiku() ||
571-
TT.isOHOSFamily())
570+
if (TT.isOSFreeBSD() || TT.isOSFuchsia() || TT.isOSOpenBSD() ||
571+
TT.isOSHaiku() || TT.isOHOSFamily())
572572
return "aapcs-linux";
573573
return "aapcs";
574574
}
@@ -648,6 +648,8 @@ StringRef ARM::getARMCPUForArch(const llvm::Triple &Triple, StringRef MArch) {
648648
}
649649
case llvm::Triple::OpenBSD:
650650
return "cortex-a8";
651+
case llvm::Triple::Fuchsia:
652+
return "cortex-a53";
651653
default:
652654
switch (Triple.getEnvironment()) {
653655
case llvm::Triple::EABIHF:

0 commit comments

Comments
 (0)