@@ -141,13 +141,20 @@ static const SupportedConditionalValue SupportedConditionalCompilationHasAtomicB
141141 " _128"
142142};
143143
144+ static const SupportedConditionalValue SupportedConditionalCompilationObjectFileFormats[] = {
145+ " MachO" ,
146+ " ELF" ,
147+ " COFF" ,
148+ " Wasm" ,
149+ };
150+
144151static const PlatformConditionKind AllPublicPlatformConditionKinds[] = {
145152#define PLATFORM_CONDITION (LABEL, IDENTIFIER ) PlatformConditionKind::LABEL,
146153#define PLATFORM_CONDITION_ (LABEL, IDENTIFIER )
147154#include " swift/AST/PlatformConditionKinds.def"
148155};
149156
150- ArrayRef<SupportedConditionalValue> getSupportedConditionalCompilationValues (const PlatformConditionKind &Kind) {
157+ static ArrayRef<SupportedConditionalValue> getSupportedConditionalCompilationValues (const PlatformConditionKind &Kind) {
151158 switch (Kind) {
152159 case PlatformConditionKind::OS:
153160 return SupportedConditionalCompilationOSs;
@@ -167,12 +174,14 @@ ArrayRef<SupportedConditionalValue> getSupportedConditionalCompilationValues(con
167174 return SupportedConditionalCompilationPtrAuthSchemes;
168175 case PlatformConditionKind::HasAtomicBitWidth:
169176 return SupportedConditionalCompilationHasAtomicBitWidths;
177+ case PlatformConditionKind::ObjectFileFormat:
178+ return SupportedConditionalCompilationObjectFileFormats;
170179 }
171180 llvm_unreachable (" Unhandled PlatformConditionKind in switch" );
172181}
173182
174- PlatformConditionKind suggestedPlatformConditionKind (PlatformConditionKind Kind, const StringRef &V,
175- std::vector<StringRef> &suggestedValues) {
183+ static PlatformConditionKind suggestedPlatformConditionKind (PlatformConditionKind Kind, const StringRef &V,
184+ std::vector<StringRef> &suggestedValues) {
176185 std::string lower = V.lower ();
177186 for (const PlatformConditionKind& candidateKind : AllPublicPlatformConditionKinds) {
178187 if (candidateKind != Kind) {
@@ -191,8 +200,8 @@ PlatformConditionKind suggestedPlatformConditionKind(PlatformConditionKind Kind,
191200 return Kind;
192201}
193202
194- bool isMatching (PlatformConditionKind Kind, const StringRef &V,
195- PlatformConditionKind &suggestedKind, std::vector<StringRef> &suggestions) {
203+ static bool isMatching (PlatformConditionKind Kind, const StringRef &V,
204+ PlatformConditionKind &suggestedKind, std::vector<StringRef> &suggestions) {
196205 // Compare against known values, ignoring case to avoid penalizing
197206 // characters with incorrect case.
198207 unsigned minDistance = std::numeric_limits<unsigned >::max ();
@@ -231,6 +240,7 @@ checkPlatformConditionSupported(PlatformConditionKind Kind, StringRef Value,
231240 case PlatformConditionKind::TargetEnvironment:
232241 case PlatformConditionKind::PtrAuth:
233242 case PlatformConditionKind::HasAtomicBitWidth:
243+ case PlatformConditionKind::ObjectFileFormat:
234244 return isMatching (Kind, Value, suggestedKind, suggestedValues);
235245 case PlatformConditionKind::CanImport:
236246 // All importable names are valid.
@@ -649,6 +659,17 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
649659 addPlatformConditionValue (PlatformConditionKind::PointerBitWidth, " _64" );
650660 }
651661
662+ // Set the "objectFormat" platform condition.
663+ if (Target.isOSBinFormatMachO ()) {
664+ addPlatformConditionValue (PlatformConditionKind::ObjectFileFormat, " MachO" );
665+ } else if (Target.isOSBinFormatELF ()) {
666+ addPlatformConditionValue (PlatformConditionKind::ObjectFileFormat, " ELF" );
667+ } else if (Target.isOSBinFormatCOFF ()) {
668+ addPlatformConditionValue (PlatformConditionKind::ObjectFileFormat, " COFF" );
669+ } else if (Target.isOSBinFormatWasm ()) {
670+ addPlatformConditionValue (PlatformConditionKind::ObjectFileFormat, " Wasm" );
671+ }
672+
652673 // Set the "runtime" platform condition.
653674 addPlatformConditionValue (PlatformConditionKind::Runtime,
654675 EnableObjCInterop ? " _ObjC" : " _Native" );
0 commit comments