Skip to content

Commit ea66110

Browse files
committed
Add #_objectFileFormat compilation conditional
1 parent 8a0d118 commit ea66110

File tree

7 files changed

+60
-6
lines changed

7 files changed

+60
-6
lines changed

include/swift/AST/ASTBridging.h

+3
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,9 @@ bool BridgedASTContext_langOptsAttachCommentsToDecls(
324324
SWIFT_NAME("getter:BridgedASTContext.langOptsTargetEndianness(self:)")
325325
BridgedEndianness BridgedASTContext_langOptsTargetEndianness(BridgedASTContext cContext);
326326

327+
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetObjectFileFormat(self:_:)")
328+
bool BridgedASTContext_langOptsIsActiveTargetObjectFileFormat(BridgedASTContext cContext, BridgedStringRef cName);
329+
327330
SWIFT_NAME("BridgedASTContext.langOptsGetLanguageVersion(self:_:)")
328331
SwiftInt BridgedASTContext_langOptsGetLanguageVersion(BridgedASTContext cContext,
329332
SwiftInt* _Nullable * _Nonnull cComponents);

include/swift/AST/PlatformConditionKinds.def

+3
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,8 @@ PLATFORM_CONDITION_(PtrAuth, "ptrauth")
4949
/// The active arch target's max atomic bit width.
5050
PLATFORM_CONDITION_(HasAtomicBitWidth, "hasAtomicBitWidth")
5151

52+
/// The active target's file format (Mach-O, ELF, COFF, WASM)
53+
PLATFORM_CONDITION_(ObjectFileFormat, "objectFileFormat")
54+
5255
#undef PLATFORM_CONDITION
5356
#undef PLATFORM_CONDITION_

lib/AST/Bridging/ASTContextBridging.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "swift/AST/ASTContext.h"
1616
#include "swift/AST/AvailabilitySpec.h"
17+
#include "llvm/Support/ErrorHandling.h"
1718

1819
using namespace swift;
1920

@@ -109,6 +110,12 @@ BridgedASTContext_langOptsTargetEndianness(BridgedASTContext cContext) {
109110
: EndianBig;
110111
}
111112

113+
bool BridgedASTContext_langOptsIsActiveTargetObjectFileFormat(
114+
BridgedASTContext cContext, BridgedStringRef cName) {
115+
return cContext.unbridged().LangOpts.checkPlatformCondition(
116+
PlatformConditionKind::ObjectFileFormat, cName.unbridged());
117+
}
118+
112119
/// Convert an array of numbers into a form we can use in Swift.
113120
namespace {
114121
template <typename Arr>

lib/ASTGen/Sources/ASTGen/CompilerBuildConfiguration.swift

+7
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,13 @@ struct CompilerBuildConfiguration: BuildConfiguration {
132132
Int(ctx.langOptsTargetPointerBitWidth)
133133
}
134134

135+
func isActiveTargetObjectFileFormat(name: String) throws -> Bool {
136+
var name = name
137+
return name.withBridgedString { nameRef in
138+
ctx.langOptsIsActiveTargetObjectFileFormat(nameRef)
139+
}
140+
}
141+
135142
var targetAtomicBitWidths: [Int] {
136143
var bitWidthsBuf: UnsafeMutablePointer<SwiftInt>? = nil
137144
let count = ctx.langOptsGetTargetAtomicBitWidths(&bitWidthsBuf)

lib/Basic/LangOptions.cpp

+26-5
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,20 @@ static const SupportedConditionalValue SupportedConditionalCompilationHasAtomicB
146146
"_128"
147147
};
148148

149+
static const SupportedConditionalValue SupportedConditionalCompilationObjectFileFormats[] = {
150+
"MachO",
151+
"ELF",
152+
"COFF",
153+
"Wasm",
154+
};
155+
149156
static const PlatformConditionKind AllPublicPlatformConditionKinds[] = {
150157
#define PLATFORM_CONDITION(LABEL, IDENTIFIER) PlatformConditionKind::LABEL,
151158
#define PLATFORM_CONDITION_(LABEL, IDENTIFIER)
152159
#include "swift/AST/PlatformConditionKinds.def"
153160
};
154161

155-
ArrayRef<SupportedConditionalValue> getSupportedConditionalCompilationValues(const PlatformConditionKind &Kind) {
162+
static ArrayRef<SupportedConditionalValue> getSupportedConditionalCompilationValues(const PlatformConditionKind &Kind) {
156163
switch (Kind) {
157164
case PlatformConditionKind::OS:
158165
return SupportedConditionalCompilationOSs;
@@ -172,12 +179,14 @@ ArrayRef<SupportedConditionalValue> getSupportedConditionalCompilationValues(con
172179
return SupportedConditionalCompilationPtrAuthSchemes;
173180
case PlatformConditionKind::HasAtomicBitWidth:
174181
return SupportedConditionalCompilationHasAtomicBitWidths;
182+
case PlatformConditionKind::ObjectFileFormat:
183+
return SupportedConditionalCompilationObjectFileFormats;
175184
}
176185
llvm_unreachable("Unhandled PlatformConditionKind in switch");
177186
}
178187

179-
PlatformConditionKind suggestedPlatformConditionKind(PlatformConditionKind Kind, const StringRef &V,
180-
std::vector<StringRef> &suggestedValues) {
188+
static PlatformConditionKind suggestedPlatformConditionKind(PlatformConditionKind Kind, const StringRef &V,
189+
std::vector<StringRef> &suggestedValues) {
181190
std::string lower = V.lower();
182191
for (const PlatformConditionKind& candidateKind : AllPublicPlatformConditionKinds) {
183192
if (candidateKind != Kind) {
@@ -196,8 +205,8 @@ PlatformConditionKind suggestedPlatformConditionKind(PlatformConditionKind Kind,
196205
return Kind;
197206
}
198207

199-
bool isMatching(PlatformConditionKind Kind, const StringRef &V,
200-
PlatformConditionKind &suggestedKind, std::vector<StringRef> &suggestions) {
208+
static bool isMatching(PlatformConditionKind Kind, const StringRef &V,
209+
PlatformConditionKind &suggestedKind, std::vector<StringRef> &suggestions) {
201210
// Compare against known values, ignoring case to avoid penalizing
202211
// characters with incorrect case.
203212
unsigned minDistance = std::numeric_limits<unsigned>::max();
@@ -236,6 +245,7 @@ checkPlatformConditionSupported(PlatformConditionKind Kind, StringRef Value,
236245
case PlatformConditionKind::TargetEnvironment:
237246
case PlatformConditionKind::PtrAuth:
238247
case PlatformConditionKind::HasAtomicBitWidth:
248+
case PlatformConditionKind::ObjectFileFormat:
239249
return isMatching(Kind, Value, suggestedKind, suggestedValues);
240250
case PlatformConditionKind::CanImport:
241251
// All importable names are valid.
@@ -641,6 +651,17 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
641651
addPlatformConditionValue(PlatformConditionKind::PointerBitWidth, "_64");
642652
}
643653

654+
// Set the "_objectFileFormat" platform condition.
655+
if (Target.isOSBinFormatMachO()) {
656+
addPlatformConditionValue(PlatformConditionKind::ObjectFileFormat, "MachO");
657+
} else if (Target.isOSBinFormatELF()) {
658+
addPlatformConditionValue(PlatformConditionKind::ObjectFileFormat, "ELF");
659+
} else if (Target.isOSBinFormatCOFF()) {
660+
addPlatformConditionValue(PlatformConditionKind::ObjectFileFormat, "COFF");
661+
} else if (Target.isOSBinFormatWasm()) {
662+
addPlatformConditionValue(PlatformConditionKind::ObjectFileFormat, "Wasm");
663+
}
664+
644665
// Set the "runtime" platform condition.
645666
addPlatformConditionValue(PlatformConditionKind::Runtime,
646667
EnableObjCInterop ? "_ObjC" : "_Native");

lib/Parse/ParseIfConfig.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ class ValidateIfConfigCondition :
385385
return E;
386386
}
387387

388-
// ( 'os' | 'arch' | '_endian' | '_pointerBitWidth' | '_runtime' | '_hasAtomicBitWidth' ) '(' identifier ')''
388+
// ( 'os' | 'arch' | '_endian' | '_pointerBitWidth' | '_runtime' | '_hasAtomicBitWidth' | '_objectFileFormat' ) '(' identifier ')''
389389
auto Kind = getPlatformConditionKind(*KindName);
390390
if (!Kind.has_value()) {
391391
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_expression);
@@ -429,6 +429,8 @@ class ValidateIfConfigCondition :
429429
DiagName = "pointer authentication scheme"; break;
430430
case PlatformConditionKind::HasAtomicBitWidth:
431431
DiagName = "has atomic bit width"; break;
432+
case PlatformConditionKind::ObjectFileFormat:
433+
DiagName = "object file format"; break;
432434
case PlatformConditionKind::Runtime:
433435
llvm_unreachable("handled above");
434436
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// RUN: %swift -typecheck %s -verify -target arm64-apple-none-macho -parse-stdlib
2+
// RUN: %swift -typecheck %s -verify -target arm64-apple-none-elf -parse-stdlib
3+
// RUN: %swift -typecheck %s -verify -target wasm32-unknown-wasi -parse-stdlib
4+
// RUN: %swift -typecheck %s -verify -target x86_64-unknown-windows-msvc -parse-stdlib
5+
// RUN: %swift-ide-test -test-input-complete -source-filename=%s -target arm64-apple-macos
6+
7+
#if _objectFileFormat(MachO) || _objectFileFormat(ELF) || _objectFileFormat(Wasm) || _objectFileFormat(COFF)
8+
class C {}
9+
var x = C()
10+
#endif
11+
var y = x

0 commit comments

Comments
 (0)