Skip to content

Commit 21508f3

Browse files
committed
Implement a SwiftIfConfig.BuildConfiguration that queries the ASTContext
This concrete implementation of the BuildConfiguration allows the use of the SwiftIfConfig library's APIs where the build configuration comes from the compiler itself.
1 parent 5ad2291 commit 21508f3

File tree

6 files changed

+355
-0
lines changed

6 files changed

+355
-0
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,74 @@ bool BridgedASTContext_langOptsHasFeature(BridgedASTContext cContext,
190190
SWIFT_NAME("getter:BridgedASTContext.majorLanguageVersion(self:)")
191191
unsigned BridgedASTContext_majorLanguageVersion(BridgedASTContext cContext);
192192

193+
SWIFT_NAME("BridgedASTContext.langOptsCustomConditionSet(self:_:)")
194+
bool BridgedASTContext_langOptsCustomConditionSet(BridgedASTContext cContext,
195+
BridgedStringRef cName);
196+
197+
SWIFT_NAME("BridgedASTContext.langOptsHasFeatureNamed(self:_:)")
198+
bool BridgedASTContext_langOptsHasFeatureNamed(BridgedASTContext cContext,
199+
BridgedStringRef cName);
200+
201+
SWIFT_NAME("BridgedASTContext.langOptsHasAttributeNamed(self:_:)")
202+
bool BridgedASTContext_langOptsHasAttributeNamed(BridgedASTContext cContext,
203+
BridgedStringRef cName);
204+
205+
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetOS(self:_:)")
206+
bool BridgedASTContext_langOptsIsActiveTargetOS(BridgedASTContext cContext,
207+
BridgedStringRef cName);
208+
209+
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetArchitecture(self:_:)")
210+
bool BridgedASTContext_langOptsIsActiveTargetArchitecture(BridgedASTContext cContext,
211+
BridgedStringRef cName);
212+
213+
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetEnvironment(self:_:)")
214+
bool BridgedASTContext_langOptsIsActiveTargetEnvironment(BridgedASTContext cContext,
215+
BridgedStringRef cName);
216+
217+
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetRuntime(self:_:)")
218+
bool BridgedASTContext_langOptsIsActiveTargetRuntime(BridgedASTContext cContext,
219+
BridgedStringRef cName);
220+
221+
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetPtrAuth(self:_:)")
222+
bool BridgedASTContext_langOptsIsActiveTargetPtrAuth(BridgedASTContext cContext,
223+
BridgedStringRef cName);
224+
225+
SWIFT_NAME("getter:BridgedASTContext.langOptsTargetPointerBitWidth(self:)")
226+
unsigned BridgedASTContext_langOptsTargetPointerBitWidth(BridgedASTContext cContext);
227+
228+
SWIFT_NAME("BridgedASTContext.langOptsGetTargetAtomicBitWidths(self:_:)")
229+
SwiftInt BridgedASTContext_langOptsGetTargetAtomicBitWidths(BridgedASTContext cContext,
230+
SwiftInt* _Nullable * _Nonnull cComponents);
231+
232+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedEndianness : size_t {
233+
EndianLittle,
234+
EndianBig,
235+
};
236+
237+
SWIFT_NAME("getter:BridgedASTContext.langOptsTargetEndianness(self:)")
238+
BridgedEndianness BridgedASTContext_langOptsTargetEndianness(BridgedASTContext cContext);
239+
240+
SWIFT_NAME("BridgedASTContext.langOptsGetLanguageVersion(self:_:)")
241+
SwiftInt BridgedASTContext_langOptsGetLanguageVersion(BridgedASTContext cContext,
242+
SwiftInt* _Nullable * _Nonnull cComponents);
243+
244+
SWIFT_NAME("BridgedASTContext.langOptsGetCompilerVersion(self:_:)")
245+
SwiftInt BridgedASTContext_langOptsGetCompilerVersion(BridgedASTContext cContext,
246+
SwiftInt* _Nullable * _Nonnull cComponents);
247+
248+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedCanImportVersion : size_t {
249+
CanImportUnversioned,
250+
CanImportVersion,
251+
CanImportUnderlyingVersion,
252+
};
253+
254+
SWIFT_NAME("BridgedASTContext.canImport(self:importPath:versionKind:versionComponents:numVersionComponents:)")
255+
bool BridgedASTContext_canImport(BridgedASTContext cContext,
256+
BridgedStringRef importPath,
257+
BridgedCanImportVersion versionKind,
258+
const SwiftInt * _Nullable versionComponents,
259+
SwiftInt numVersionComponents);
260+
193261
//===----------------------------------------------------------------------===//
194262
// MARK: AST nodes
195263
//===----------------------------------------------------------------------===//

include/swift/Basic/LangOptions.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,18 +721,23 @@ namespace swift {
721721
switch (maxWidth) {
722722
case 128:
723723
AtomicBitWidths.emplace_back("_128");
724+
AtomicBitWidthValues.push_back(128);
724725
LLVM_FALLTHROUGH;
725726
case 64:
726727
AtomicBitWidths.emplace_back("_64");
728+
AtomicBitWidthValues.push_back(64);
727729
LLVM_FALLTHROUGH;
728730
case 32:
729731
AtomicBitWidths.emplace_back("_32");
732+
AtomicBitWidthValues.push_back(32);
730733
LLVM_FALLTHROUGH;
731734
case 16:
732735
AtomicBitWidths.emplace_back("_16");
736+
AtomicBitWidthValues.push_back(16);
733737
LLVM_FALLTHROUGH;
734738
case 8:
735739
AtomicBitWidths.emplace_back("_8");
740+
AtomicBitWidthValues.push_back(8);
736741
break;
737742
default:
738743
return;
@@ -742,6 +747,11 @@ namespace swift {
742747
/// Removes all atomic bit widths.
743748
void clearAtomicBitWidths() {
744749
AtomicBitWidths.clear();
750+
AtomicBitWidthValues.clear();
751+
}
752+
753+
llvm::ArrayRef<unsigned> getAtomicBitWidthValues() const {
754+
return AtomicBitWidthValues;
745755
}
746756

747757
/// Returns true if the given platform condition argument represents
@@ -782,6 +792,7 @@ namespace swift {
782792

783793
private:
784794
llvm::SmallVector<std::string, 2> AtomicBitWidths;
795+
llvm::SmallVector<unsigned, 2> AtomicBitWidthValues;
785796
llvm::SmallVector<std::pair<PlatformConditionKind, std::string>, 10>
786797
PlatformConditionValues;
787798
llvm::SmallVector<std::string, 2> CustomConditionalCompilationFlags;

lib/AST/ASTBridging.cpp

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,133 @@ unsigned BridgedASTContext_majorLanguageVersion(BridgedASTContext cContext) {
121121
return cContext.unbridged().LangOpts.EffectiveLanguageVersion[0];
122122
}
123123

124+
bool BridgedASTContext_langOptsCustomConditionSet(BridgedASTContext cContext,
125+
BridgedStringRef cName) {
126+
return cContext.unbridged().LangOpts
127+
.isCustomConditionalCompilationFlagSet(cName.unbridged());
128+
}
129+
130+
bool BridgedASTContext_langOptsHasFeatureNamed(BridgedASTContext cContext,
131+
BridgedStringRef cName) {
132+
return cContext.unbridged().LangOpts.hasFeature(cName.unbridged());
133+
}
134+
135+
bool BridgedASTContext_langOptsHasAttributeNamed(BridgedASTContext cContext,
136+
BridgedStringRef cName) {
137+
return hasAttribute(cContext.unbridged().LangOpts, cName.unbridged());
138+
}
139+
140+
bool BridgedASTContext_langOptsIsActiveTargetOS(BridgedASTContext cContext,
141+
BridgedStringRef cName) {
142+
return cContext.unbridged().LangOpts.checkPlatformCondition(
143+
PlatformConditionKind::OS, cName.unbridged());
144+
}
145+
146+
bool BridgedASTContext_langOptsIsActiveTargetArchitecture(BridgedASTContext cContext,
147+
BridgedStringRef cName) {
148+
return cContext.unbridged().LangOpts.checkPlatformCondition(
149+
PlatformConditionKind::Arch, cName.unbridged());
150+
}
151+
152+
bool BridgedASTContext_langOptsIsActiveTargetEnvironment(BridgedASTContext cContext,
153+
BridgedStringRef cName) {
154+
return cContext.unbridged().LangOpts.checkPlatformCondition(
155+
PlatformConditionKind::TargetEnvironment, cName.unbridged());
156+
}
157+
158+
bool BridgedASTContext_langOptsIsActiveTargetRuntime(BridgedASTContext cContext,
159+
BridgedStringRef cName) {
160+
return cContext.unbridged().LangOpts.checkPlatformCondition(
161+
PlatformConditionKind::Runtime, cName.unbridged());
162+
}
163+
164+
bool BridgedASTContext_langOptsIsActiveTargetPtrAuth(BridgedASTContext cContext,
165+
BridgedStringRef cName) {
166+
return cContext.unbridged().LangOpts.checkPlatformCondition(
167+
PlatformConditionKind::PtrAuth, cName.unbridged());
168+
}
169+
170+
unsigned BridgedASTContext_langOptsTargetPointerBitWidth(BridgedASTContext cContext) {
171+
return cContext.unbridged().LangOpts.Target.isArch64Bit() ? 64
172+
: cContext.unbridged().LangOpts.Target.isArch32Bit() ? 32
173+
: cContext.unbridged().LangOpts.Target.isArch16Bit() ? 16
174+
: 0;
175+
}
176+
177+
BridgedEndianness BridgedASTContext_langOptsTargetEndianness(BridgedASTContext cContext) {
178+
return cContext.unbridged().LangOpts.Target.isLittleEndian() ? EndianLittle
179+
: EndianBig;
180+
}
181+
182+
/// Convert an array of numbers into a form we can use in Swift.
183+
namespace {
184+
template<typename Arr>
185+
SwiftInt convertArray(const Arr &array, SwiftInt **cElements) {
186+
SwiftInt numElements = array.size();
187+
*cElements = (SwiftInt *)malloc(sizeof(SwiftInt) * numElements);
188+
for (SwiftInt i = 0; i != numElements; ++i)
189+
(*cElements)[i] = array[i];
190+
return numElements;
191+
}
192+
}
193+
194+
SwiftInt BridgedASTContext_langOptsGetLanguageVersion(BridgedASTContext cContext,
195+
SwiftInt** cComponents) {
196+
auto theVersion = cContext.unbridged().LangOpts.EffectiveLanguageVersion;
197+
return convertArray(theVersion, cComponents);
198+
}
199+
200+
SWIFT_NAME("BridgedASTContext.langOptsGetCompilerVersion(self:_:)")
201+
SwiftInt BridgedASTContext_langOptsGetCompilerVersion(BridgedASTContext cContext,
202+
SwiftInt** cComponents) {
203+
auto theVersion = version::Version::getCurrentLanguageVersion();
204+
return convertArray(theVersion, cComponents);
205+
}
206+
207+
SwiftInt BridgedASTContext_langOptsGetTargetAtomicBitWidths(BridgedASTContext cContext,
208+
SwiftInt* _Nullable * _Nonnull cElements) {
209+
return convertArray(cContext.unbridged().LangOpts.getAtomicBitWidthValues(),
210+
cElements);
211+
}
212+
213+
bool BridgedASTContext_canImport(BridgedASTContext cContext,
214+
BridgedStringRef importPath,
215+
BridgedCanImportVersion versionKind,
216+
const SwiftInt * _Nullable versionComponents,
217+
SwiftInt numVersionComponents) {
218+
// Map the version.
219+
llvm::VersionTuple version;
220+
switch (numVersionComponents) {
221+
case 0:
222+
break;
223+
case 1:
224+
version = llvm::VersionTuple(versionComponents[0]);
225+
break;
226+
case 2:
227+
version = llvm::VersionTuple(versionComponents[0], versionComponents[1]);
228+
break;
229+
case 3:
230+
version = llvm::VersionTuple(versionComponents[0], versionComponents[1],
231+
versionComponents[2]);
232+
break;
233+
default:
234+
version = llvm::VersionTuple(versionComponents[0], versionComponents[1],
235+
versionComponents[2], versionComponents[3]);
236+
break;
237+
}
238+
239+
// FIXME: The source location here is empty because build configurations
240+
// are supposed to be completely separated from source code. We could re-plumb
241+
// things to have any errors reported up thruough the "canImportModule"
242+
// API.
243+
ImportPath::Module::Builder builder(
244+
cContext.unbridged(), importPath.unbridged(), /*separator=*/'.',
245+
SourceLoc());
246+
return cContext.unbridged().canImportModule(
247+
builder.get(), SourceLoc(), version,
248+
versionKind == CanImportUnderlyingVersion);
249+
}
250+
124251
//===----------------------------------------------------------------------===//
125252
// MARK: AST nodes
126253
//===----------------------------------------------------------------------===//

lib/ASTGen/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ endif()
2121
add_pure_swift_host_library(swiftASTGen STATIC
2222
Sources/ASTGen/ASTGen.swift
2323
Sources/ASTGen/Bridge.swift
24+
Sources/ASTGen/CompilerBuildConfiguration.swift
2425
Sources/ASTGen/DeclAttrs.swift
2526
Sources/ASTGen/Decls.swift
2627
Sources/ASTGen/Diagnostics.swift
@@ -44,6 +45,7 @@ add_pure_swift_host_library(swiftASTGen STATIC
4445
swiftAST
4546
SWIFT_DEPENDENCIES
4647
_CompilerSwiftSyntax
48+
_CompilerSwiftIfConfig
4749
_CompilerSwiftOperators
4850
_CompilerSwiftSyntaxBuilder
4951
_CompilerSwiftParser

lib/ASTGen/Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ let package = Package(
5959
dependencies: [
6060
.product(name: "_SwiftCompilerPluginMessageHandling", package: "swift-syntax"),
6161
.product(name: "SwiftDiagnostics", package: "swift-syntax"),
62+
.product(name: "SwiftIfConfig", package: "swift-syntax"),
6263
.product(name: "SwiftOperators", package: "swift-syntax"),
6364
.product(name: "SwiftParser", package: "swift-syntax"),
6465
.product(name: "SwiftParserDiagnostics", package: "swift-syntax"),

0 commit comments

Comments
 (0)