Skip to content

Commit 8a1174f

Browse files
[Darwin][Driver][clang] arm64-apple-none-macho is missing the Apple macros from arm-apple-none-macho (llvm#122427)
arm-apple-none-macho uses DarwinTargetInfo which provides several Apple specific macros. arm64-apple-none-macho however just uses the generic AArch64leTargetInfo and doesn't get any of those macros. It's not clear if everything from DarwinTargetInfo is desirable for arm64-apple-none-macho, so make an AppleMachOTargetInfo to hold the generic Apple macros and a few other basic things.
1 parent 37f42cf commit 8a1174f

File tree

11 files changed

+227
-22
lines changed

11 files changed

+227
-22
lines changed

clang/lib/Basic/Targets.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,15 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
135135
case llvm::Triple::aarch64_32:
136136
if (Triple.isOSDarwin())
137137
return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
138+
else if (Triple.isAppleMachO())
139+
return std::make_unique<AppleMachOAArch64TargetInfo>(Triple, Opts);
138140

139141
return nullptr;
140142
case llvm::Triple::aarch64:
141143
if (Triple.isOSDarwin())
142144
return std::make_unique<DarwinAArch64TargetInfo>(Triple, Opts);
145+
else if (Triple.isAppleMachO())
146+
return std::make_unique<AppleMachOAArch64TargetInfo>(Triple, Opts);
143147

144148
switch (os) {
145149
case llvm::Triple::FreeBSD:
@@ -243,6 +247,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
243247
case llvm::Triple::thumbeb:
244248
if (Triple.isOSDarwin())
245249
return std::make_unique<DarwinARMTargetInfo>(Triple, Opts);
250+
else if (Triple.isAppleMachO())
251+
return std::make_unique<AppleMachOARMTargetInfo>(Triple, Opts);
246252

247253
switch (os) {
248254
case llvm::Triple::Linux:
@@ -531,6 +537,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
531537
case llvm::Triple::x86:
532538
if (Triple.isOSDarwin())
533539
return std::make_unique<DarwinI386TargetInfo>(Triple, Opts);
540+
else if (Triple.isAppleMachO())
541+
return std::make_unique<AppleMachOI386TargetInfo>(Triple, Opts);
534542

535543
switch (os) {
536544
case llvm::Triple::Linux: {

clang/lib/Basic/Targets/AArch64.cpp

+20-3
Original file line numberDiff line numberDiff line change
@@ -1671,6 +1671,10 @@ MinGWARM64TargetInfo::MinGWARM64TargetInfo(const llvm::Triple &Triple,
16711671
TheCXXABI.set(TargetCXXABI::GenericAArch64);
16721672
}
16731673

1674+
AppleMachOAArch64TargetInfo::AppleMachOAArch64TargetInfo(
1675+
const llvm::Triple &Triple, const TargetOptions &Opts)
1676+
: AppleMachOTargetInfo<AArch64leTargetInfo>(Triple, Opts) {}
1677+
16741678
DarwinAArch64TargetInfo::DarwinAArch64TargetInfo(const llvm::Triple &Triple,
16751679
const TargetOptions &Opts)
16761680
: DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
@@ -1695,9 +1699,9 @@ DarwinAArch64TargetInfo::DarwinAArch64TargetInfo(const llvm::Triple &Triple,
16951699
TheCXXABI.set(TargetCXXABI::AppleARM64);
16961700
}
16971701

1698-
void DarwinAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
1699-
const llvm::Triple &Triple,
1700-
MacroBuilder &Builder) const {
1702+
void clang::targets::getAppleMachOAArch64Defines(MacroBuilder &Builder,
1703+
const LangOptions &Opts,
1704+
const llvm::Triple &Triple) {
17011705
Builder.defineMacro("__AARCH64_SIMD__");
17021706
if (Triple.isArch32Bit())
17031707
Builder.defineMacro("__ARM64_ARCH_8_32__");
@@ -1710,7 +1714,20 @@ void DarwinAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
17101714

17111715
if (Triple.isArm64e())
17121716
Builder.defineMacro("__arm64e__", "1");
1717+
}
17131718

1719+
void AppleMachOAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
1720+
const llvm::Triple &Triple,
1721+
MacroBuilder &Builder) const {
1722+
getAppleMachOAArch64Defines(Builder, Opts, Triple);
1723+
AppleMachOTargetInfo<AArch64leTargetInfo>::getOSDefines(Opts, Triple,
1724+
Builder);
1725+
}
1726+
1727+
void DarwinAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
1728+
const llvm::Triple &Triple,
1729+
MacroBuilder &Builder) const {
1730+
getAppleMachOAArch64Defines(Builder, Opts, Triple);
17141731
DarwinTargetInfo<AArch64leTargetInfo>::getOSDefines(Opts, Triple, Builder);
17151732
}
17161733

clang/lib/Basic/Targets/AArch64.h

+14
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,20 @@ class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo {
306306
void setDataLayout() override;
307307
};
308308

309+
void getAppleMachOAArch64Defines(MacroBuilder &Builder, const LangOptions &Opts,
310+
const llvm::Triple &Triple);
311+
312+
class LLVM_LIBRARY_VISIBILITY AppleMachOAArch64TargetInfo
313+
: public AppleMachOTargetInfo<AArch64leTargetInfo> {
314+
public:
315+
AppleMachOAArch64TargetInfo(const llvm::Triple &Triple,
316+
const TargetOptions &Opts);
317+
318+
protected:
319+
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
320+
MacroBuilder &Builder) const override;
321+
};
322+
309323
class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo
310324
: public DarwinTargetInfo<AArch64leTargetInfo> {
311325
public:

clang/lib/Basic/Targets/ARM.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,16 @@ void CygwinARMTargetInfo::getTargetDefines(const LangOptions &Opts,
14791479
Builder.defineMacro("_GNU_SOURCE");
14801480
}
14811481

1482+
AppleMachOARMTargetInfo::AppleMachOARMTargetInfo(const llvm::Triple &Triple,
1483+
const TargetOptions &Opts)
1484+
: AppleMachOTargetInfo<ARMleTargetInfo>(Triple, Opts) {}
1485+
1486+
void AppleMachOARMTargetInfo::getOSDefines(const LangOptions &Opts,
1487+
const llvm::Triple &Triple,
1488+
MacroBuilder &Builder) const {
1489+
getAppleMachODefines(Builder, Opts, Triple);
1490+
}
1491+
14821492
DarwinARMTargetInfo::DarwinARMTargetInfo(const llvm::Triple &Triple,
14831493
const TargetOptions &Opts)
14841494
: DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {

clang/lib/Basic/Targets/ARM.h

+11
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,17 @@ class LLVM_LIBRARY_VISIBILITY CygwinARMTargetInfo : public ARMleTargetInfo {
300300
MacroBuilder &Builder) const override;
301301
};
302302

303+
class LLVM_LIBRARY_VISIBILITY AppleMachOARMTargetInfo
304+
: public AppleMachOTargetInfo<ARMleTargetInfo> {
305+
protected:
306+
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
307+
MacroBuilder &Builder) const override;
308+
309+
public:
310+
AppleMachOARMTargetInfo(const llvm::Triple &Triple,
311+
const TargetOptions &Opts);
312+
};
313+
303314
class LLVM_LIBRARY_VISIBILITY DarwinARMTargetInfo
304315
: public DarwinTargetInfo<ARMleTargetInfo> {
305316
protected:

clang/lib/Basic/Targets/OSTargets.cpp

+20-6
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,17 @@ using namespace clang::targets;
1919
namespace clang {
2020
namespace targets {
2121

22-
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
23-
const llvm::Triple &Triple, StringRef &PlatformName,
24-
VersionTuple &PlatformMinVersion) {
22+
void getAppleMachODefines(MacroBuilder &Builder, const LangOptions &Opts,
23+
const llvm::Triple &Triple) {
2524
Builder.defineMacro("__APPLE_CC__", "6000");
2625
Builder.defineMacro("__APPLE__");
27-
Builder.defineMacro("__STDC_NO_THREADS__");
2826

2927
// AddressSanitizer doesn't play well with source fortification, which is on
30-
// by default on Darwin.
28+
// by default on Apple platforms.
3129
if (Opts.Sanitize.has(SanitizerKind::Address))
3230
Builder.defineMacro("_FORTIFY_SOURCE", "0");
3331

34-
// Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
32+
// Apple defines __weak, __strong, and __unsafe_unretained even in C mode.
3533
if (!Opts.ObjC) {
3634
// __weak is always defined, for use in blocks and with objc pointers.
3735
Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
@@ -47,6 +45,22 @@ void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
4745
if (Opts.POSIXThreads)
4846
Builder.defineMacro("_REENTRANT");
4947

48+
// __MACH__ originally meant "will run in a Mach kernel based OS", but it has
49+
// come to also mean "uses Apple Mach-O linking/symbol visibility semantics".
50+
// Notably libc++'s __configuration/platform.h and Swift's shims/Visibility.h
51+
// take __MACH__ for the more general meaning.
52+
if (Triple.isAppleMachO() || Triple.isOSDarwin())
53+
Builder.defineMacro("__MACH__");
54+
}
55+
56+
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
57+
const llvm::Triple &Triple, StringRef &PlatformName,
58+
VersionTuple &PlatformMinVersion) {
59+
getAppleMachODefines(Builder, Opts, Triple);
60+
61+
// Darwin's libc doesn't have threads.h
62+
Builder.defineMacro("__STDC_NO_THREADS__");
63+
5064
// Get the platform type and version number from the triple.
5165
VersionTuple OsVersion;
5266
if (Triple.isMacOSX()) {

clang/lib/Basic/Targets/OSTargets.h

+30-8
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,39 @@ class LLVM_LIBRARY_VISIBILITY OSTargetInfo : public TgtInfo {
3434
}
3535
};
3636

37+
void getAppleMachODefines(MacroBuilder &Builder, const LangOptions &Opts,
38+
const llvm::Triple &Triple);
39+
3740
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
3841
const llvm::Triple &Triple, StringRef &PlatformName,
3942
VersionTuple &PlatformMinVersion);
4043

4144
template <typename Target>
42-
class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo : public OSTargetInfo<Target> {
45+
class LLVM_LIBRARY_VISIBILITY AppleMachOTargetInfo
46+
: public OSTargetInfo<Target> {
47+
protected:
48+
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
49+
MacroBuilder &Builder) const override {
50+
getAppleMachODefines(Builder, Opts, Triple);
51+
}
52+
53+
public:
54+
AppleMachOTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
55+
: OSTargetInfo<Target>(Triple, Opts) {}
56+
57+
const char *getStaticInitSectionSpecifier() const override {
58+
return "__TEXT,__StaticInit,regular,pure_instructions";
59+
}
60+
61+
/// Apple Mach-O does not support protected visibility. Its "default" is very
62+
/// similar to ELF's "protected"; Apple Mach-O requires a "weak" attribute on
63+
/// declarations that can be dynamically replaced.
64+
bool hasProtectedVisibility() const override { return false; }
65+
};
66+
67+
template <typename Target>
68+
class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo
69+
: public AppleMachOTargetInfo<Target> {
4370
protected:
4471
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4572
MacroBuilder &Builder) const override {
@@ -49,7 +76,7 @@ class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo : public OSTargetInfo<Target> {
4976

5077
public:
5178
DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
52-
: OSTargetInfo<Target>(Triple, Opts) {
79+
: AppleMachOTargetInfo<Target>(Triple, Opts) {
5380
// By default, no TLS, and we list permitted architecture/OS
5481
// combinations.
5582
this->TLSSupported = false;
@@ -82,14 +109,9 @@ class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo : public OSTargetInfo<Target> {
82109

83110
const char *getStaticInitSectionSpecifier() const override {
84111
// FIXME: We should return 0 when building kexts.
85-
return "__TEXT,__StaticInit,regular,pure_instructions";
112+
return AppleMachOTargetInfo<Target>::getStaticInitSectionSpecifier();
86113
}
87114

88-
/// Darwin does not support protected visibility. Darwin's "default"
89-
/// is very similar to ELF's "protected"; Darwin requires a "weak"
90-
/// attribute on declarations that can be dynamically replaced.
91-
bool hasProtectedVisibility() const override { return false; }
92-
93115
unsigned getExnObjectAlignment() const override {
94116
// Older versions of libc++abi guarantee an alignment of only 8-bytes for
95117
// exception objects because of a bug in __cxa_exception that was

clang/lib/Basic/Targets/X86.h

+8
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,14 @@ class LLVM_LIBRARY_VISIBILITY OpenBSDI386TargetInfo
534534
}
535535
};
536536

537+
class LLVM_LIBRARY_VISIBILITY AppleMachOI386TargetInfo
538+
: public AppleMachOTargetInfo<X86_32TargetInfo> {
539+
public:
540+
AppleMachOI386TargetInfo(const llvm::Triple &Triple,
541+
const TargetOptions &Opts)
542+
: AppleMachOTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
543+
};
544+
537545
class LLVM_LIBRARY_VISIBILITY DarwinI386TargetInfo
538546
: public DarwinTargetInfo<X86_32TargetInfo> {
539547
public:

clang/lib/Frontend/InitPreprocessor.cpp

-5
Original file line numberDiff line numberDiff line change
@@ -1507,11 +1507,6 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
15071507
// ELF targets define __ELF__
15081508
if (TI.getTriple().isOSBinFormatELF())
15091509
Builder.defineMacro("__ELF__");
1510-
else if (TI.getTriple().isAppleMachO())
1511-
// Apple MachO targets define __MACH__ even when not using DarwinTargetInfo.
1512-
// Hurd will also define this in some circumstances, but that's done in
1513-
// HurdTargetInfo. Windows targets don't define this.
1514-
Builder.defineMacro("__MACH__");
15151510

15161511
// Target OS macro definitions.
15171512
if (PPOpts.DefineTargetOSMacros) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// RUN: %clang_cc1 -E -dM -triple arm64-apple-macosx15.0.0 -target-cpu apple-m1 %s | FileCheck %s -check-prefix CHECK-MACOSX
2+
3+
// CHECK-MACOSX: #define __APPLE_CC__
4+
// CHECK-MACOSX: #define __APPLE__
5+
// CHECK-MACOSX: #define __ARM_64BIT_STATE 1
6+
// CHECK-MACOSX-NOT: #define __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__
7+
// CHECK-MACOSX-NOT: #define __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
8+
// CHECK-MACOSX: #define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ 150000
9+
// CHECK-MACOSX: #define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ 150000
10+
// CHECK-MACOSX-NOT: #define __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
11+
// CHECK-MACOSX-NOT: #define __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
12+
// CHECK-MACOSX: #define __MACH__
13+
// CHECK-MACOSX: #define __STDC_NO_THREADS__
14+
15+
// RUN: %clang_cc1 -E -dM -triple arm64-apple-ios18.0.0 -target-cpu apple-a7 %s | FileCheck %s -check-prefix CHECK-IOS
16+
17+
// CHECK-IOS: #define __APPLE_CC__
18+
// CHECK-IOS: #define __APPLE__
19+
// CHECK-IOS: #define __ARM_64BIT_STATE 1
20+
// CHECK-IOS-NOT: #define __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__
21+
// CHECK-IOS: #define __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ 180000
22+
// CHECK-IOS-NOT: #define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
23+
// CHECK-IOS: #define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ 180000
24+
// CHECK-IOS-NOT: #define __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
25+
// CHECK-IOS-NOT: #define __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
26+
// CHECK-IOS: #define __MACH__
27+
// CHECK-IOS: #define __STDC_NO_THREADS__
28+
29+
// RUN: %clang_cc1 -E -dM -triple arm64-apple-watchos11.0.0 -target-cpu apple-s4 %s | FileCheck %s -check-prefix CHECK-WATCHOS
30+
31+
// CHECK-WATCHOS: #define __APPLE_CC__
32+
// CHECK-WATCHOS: #define __APPLE__
33+
// CHECK-WATCHOS: #define __ARM_64BIT_STATE 1
34+
// CHECK-WATCHOS-NOT: #define __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__
35+
// CHECK-WATCHOS-NOT: #define __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
36+
// CHECK-WATCHOS-NOT: #define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
37+
// CHECK-WATCHOS: #define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ 110000
38+
// CHECK-WATCHOS-NOT: #define __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
39+
// CHECK-WATCHOS: #define __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ 110000
40+
// CHECK-WATCHOS: #define __MACH__
41+
// CHECK-WATCHOS: #define __STDC_NO_THREADS__
42+
43+
// RUN: %clang_cc1 -E -dM -triple arm64-apple-tvos18.0.0 -target-cpu apple-a7 %s | FileCheck %s -check-prefix CHECK-TVOS
44+
45+
// CHECK-TVOS: #define __APPLE_CC__
46+
// CHECK-TVOS: #define __APPLE__
47+
// CHECK-TVOS: #define __ARM_64BIT_STATE 1
48+
// CHECK-TVOS-NOT: #define __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__
49+
// CHECK-TVOS-NOT: #define __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
50+
// CHECK-TVOS-NOT: #define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
51+
// CHECK-TVOS: #define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ 180000
52+
// CHECK-TVOS: #define __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ 180000
53+
// CHECK-TVOS-NOT: #define __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
54+
// CHECK-TVOS: #define __MACH__
55+
// CHECK-TVOS: #define __STDC_NO_THREADS__
56+
57+
// RUN: %clang_cc1 -E -dM -triple arm64-apple-driverkit24.0.0 -target-cpu apple-a7 %s | FileCheck %s -check-prefix CHECK-DRIVERKIT
58+
59+
// CHECK-DRIVERKIT: #define __APPLE_CC__
60+
// CHECK-DRIVERKIT: #define __APPLE__
61+
// CHECK-DRIVERKIT: #define __ARM_64BIT_STATE 1
62+
// CHECK-DRIVERKIT: #define __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__ 240000
63+
// CHECK-DRIVERKIT-NOT: #define __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
64+
// CHECK-DRIVERKIT-NOT: #define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
65+
// CHECK-DRIVERKIT: #define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ 240000
66+
// CHECK-DRIVERKIT-NOT: #define __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
67+
// CHECK-DRIVERKIT-NOT: #define __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
68+
// CHECK-DRIVERKIT: #define __MACH__
69+
// CHECK-DRIVERKIT: #define __STDC_NO_THREADS__
70+
71+
// RUN: %clang_cc1 -E -dM -triple arm64-apple-xros2.0.0 -target-cpu apple-a12 %s | FileCheck %s -check-prefix CHECK-XROS
72+
73+
// CHECK-XROS: #define __APPLE_CC__
74+
// CHECK-XROS: #define __APPLE__
75+
// CHECK-XROS: #define __ARM_64BIT_STATE 1
76+
// CHECK-XROS-NOT: #define __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__
77+
// CHECK-XROS-NOT: #define __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
78+
// CHECK-XROS-NOT: #define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
79+
// CHECK-XROS: #define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ 20000
80+
// CHECK-XROS-NOT: #define __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
81+
// CHECK-XROS-NOT: #define __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
82+
// CHECK-XROS: #define __MACH__
83+
// CHECK-XROS: #define __STDC_NO_THREADS__

0 commit comments

Comments
 (0)