Skip to content

Commit ae8f9d8

Browse files
committed
Add -print-static-build-config to print a static build conformance
Introduce the ability to form a `StaticBuildConfiguration` from language options. Add a frontend option `-print-static-build-config` to then print that static build configuration as JSON in a manner that can be decoded into a `StaticBuildConfiguration`. Most of the change here is in sinking the bridged ASTContext queries of language options into a new BridgedLangOptions. The printing of the static build configuration only has a LangOptions (not an ASTContext), so this refactoring is required for printing.
1 parent bab1a9c commit ae8f9d8

20 files changed

+580
-183
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 109 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class IfConfigClauseRangeInfo;
5858
class GenericSignature;
5959
class GenericSignatureImpl;
6060
struct LabeledStmtInfo;
61+
class LangOptions;
6162
class LayoutConstraint;
6263
class LayoutConstraintInfo;
6364
struct LifetimeDescriptor;
@@ -82,6 +83,7 @@ enum class RequirementReprKind : unsigned;
8283
struct BridgedASTType;
8384
class BridgedCanType;
8485
class BridgedASTContext;
86+
class BridgedLangOptions;
8587
struct BridgedSubstitutionMap;
8688
struct BridgedGenericSignature;
8789
struct BridgedConformance;
@@ -193,38 +195,134 @@ BridgedDeclNameLoc_createParsed(BridgedASTContext cContext,
193195
swift::SourceLoc baseNameLoc);
194196

195197
//===----------------------------------------------------------------------===//
196-
// MARK: ASTContext
198+
// MARK: LangOptions
197199
//===----------------------------------------------------------------------===//
198200

199201
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedEndianness : size_t {
200202
EndianLittle,
201203
EndianBig,
202204
};
203205

204-
class BridgedASTContext {
205-
swift::ASTContext * _Nonnull Ctx;
206+
class BridgedLangOptions {
207+
const swift::LangOptions * _Nonnull LangOpts;
206208

207209
public:
208210
SWIFT_UNAVAILABLE("Use init(raw:) instead")
209-
BRIDGED_INLINE BridgedASTContext(swift::ASTContext &ctx);
211+
BRIDGED_INLINE BridgedLangOptions(const swift::LangOptions &langOpts);
210212

211213
SWIFT_UNAVAILABLE("Use '.raw' instead")
212-
BRIDGED_INLINE swift::ASTContext &unbridged() const;
214+
BRIDGED_INLINE const swift::LangOptions &unbridged() const;
213215

214216
SWIFT_COMPUTED_PROPERTY
215-
void *_Nonnull getRaw() const { return Ctx; }
217+
const void *_Nonnull getRaw() const { return LangOpts; }
216218

217219
SWIFT_COMPUTED_PROPERTY
218220
unsigned getMajorLanguageVersion() const;
219221

220222
SWIFT_COMPUTED_PROPERTY
221-
unsigned getLangOptsTargetPointerBitWidth() const;
223+
unsigned getTargetPointerBitWidth() const;
224+
225+
SWIFT_COMPUTED_PROPERTY
226+
BridgedEndianness getTargetEndianness() const;
227+
228+
SWIFT_COMPUTED_PROPERTY
229+
bool getAttachCommentsToDecls() const;
230+
};
231+
232+
/// Key used when enumerating build configuration entries to the
233+
/// StaticBuildConfiguration initializer for an ASTContext.
234+
enum ENUM_EXTENSIBILITY_ATTR(closed) BuildConfigurationKey : size_t {
235+
BCKCustomCondition,
236+
BCKFeature,
237+
BCKAttribute,
238+
BCKTargetOSName,
239+
BCKTargetArchitecture,
240+
BCKTargetEnvironment,
241+
BCKTargetRuntime,
242+
BCKTargetPointerAuthenticationScheme,
243+
BCKTargetObjectFileFormat
244+
};
245+
246+
SWIFT_NAME("BridgedLangOptions.hasFeature(self:_:)")
247+
bool BridgedLangOptions_hasFeature(BridgedLangOptions cLangOpts,
248+
BridgedFeature feature);
249+
250+
SWIFT_NAME("BridgedLangOptions.customConditionSet(self:_:)")
251+
bool BridgedLangOptions_customConditionSet(BridgedLangOptions cLangOpts,
252+
BridgedStringRef cName);
253+
254+
SWIFT_NAME("BridgedLangOptions.hasFeatureNamed(self:_:)")
255+
bool BridgedLangOptions_hasFeatureNamed(BridgedLangOptions cLangOpts,
256+
BridgedStringRef cName);
257+
258+
SWIFT_NAME("BridgedLangOptions.hasAttributeNamed(self:_:)")
259+
bool BridgedLangOptions_hasAttributeNamed(BridgedLangOptions cLangOpts,
260+
BridgedStringRef cName);
261+
262+
SWIFT_NAME("BridgedLangOptions.isActiveTargetOS(self:_:)")
263+
bool BridgedLangOptions_isActiveTargetOS(BridgedLangOptions cLangOpts,
264+
BridgedStringRef cName);
265+
266+
SWIFT_NAME("BridgedLangOptions.isActiveTargetArchitecture(self:_:)")
267+
bool BridgedLangOptions_isActiveTargetArchitecture(BridgedLangOptions cLangOpts,
268+
BridgedStringRef cName);
269+
270+
SWIFT_NAME("BridgedLangOptions.isActiveTargetEnvironment(self:_:)")
271+
bool BridgedLangOptions_isActiveTargetEnvironment(BridgedLangOptions cLangOpts,
272+
BridgedStringRef cName);
273+
274+
SWIFT_NAME("BridgedLangOptions.isActiveTargetRuntime(self:_:)")
275+
bool BridgedLangOptions_isActiveTargetRuntime(BridgedLangOptions cLangOpts,
276+
BridgedStringRef cName);
277+
278+
SWIFT_NAME("BridgedLangOptions.isActiveTargetPtrAuth(self:_:)")
279+
bool BridgedLangOptions_isActiveTargetPtrAuth(BridgedLangOptions cLangOpts,
280+
BridgedStringRef cName);
281+
282+
SWIFT_NAME("BridgedLangOptions.getTargetAtomicBitWidths(self:_:)")
283+
SwiftInt BridgedLangOptions_getTargetAtomicBitWidths(BridgedLangOptions cLangOpts,
284+
SwiftInt* _Nullable * _Nonnull cComponents);
285+
286+
SWIFT_NAME("BridgedLangOptions.getLanguageVersion(self:_:)")
287+
SwiftInt BridgedLangOptions_getLanguageVersion(BridgedLangOptions cLangOpts,
288+
SwiftInt* _Nullable * _Nonnull cComponents);
289+
290+
SWIFT_NAME("BridgedLangOptions.getCompilerVersion(self:_:)")
291+
SwiftInt BridgedLangOptions_getCompilerVersion(BridgedLangOptions cLangOpts,
292+
SwiftInt* _Nullable * _Nonnull cComponents);
293+
294+
/* Deallocate an array of Swift int values that was allocated in C++. */
295+
void deallocateIntBuffer(SwiftInt * _Nullable cComponents);
296+
297+
/// Enumerate all of the key/value pairs for the build configuration by calling
298+
/// the given callback for each one.
299+
SWIFT_NAME("BridgedLangOptions.enumerateBuildConfigurationEntries(self:callbackContext:callback:)")
300+
void BridgedLangOptions_enumerateBuildConfigurationEntries(
301+
BridgedLangOptions cLangOpts,
302+
void * _Nonnull callbackContext,
303+
void (* _Nonnull callback)(
304+
BridgedLangOptions cLangOpts, void * _Nonnull callbackContext,
305+
BuildConfigurationKey key, BridgedStringRef value));
306+
307+
//===----------------------------------------------------------------------===//
308+
// MARK: ASTContext
309+
//===----------------------------------------------------------------------===//
310+
311+
class BridgedASTContext {
312+
swift::ASTContext * _Nonnull Ctx;
313+
314+
public:
315+
SWIFT_UNAVAILABLE("Use init(raw:) instead")
316+
BRIDGED_INLINE BridgedASTContext(swift::ASTContext &ctx);
317+
318+
SWIFT_UNAVAILABLE("Use '.raw' instead")
319+
BRIDGED_INLINE swift::ASTContext &unbridged() const;
222320

223321
SWIFT_COMPUTED_PROPERTY
224-
bool getLangOptsAttachCommentsToDecls() const;
322+
void *_Nonnull getRaw() const { return Ctx; }
225323

226324
SWIFT_COMPUTED_PROPERTY
227-
BridgedEndianness getLangOptsTargetEndianness() const;
325+
unsigned getMajorLanguageVersion() const;
228326

229327
SWIFT_COMPUTED_PROPERTY
230328
BridgedAvailabilityMacroMap getAvailabilityMacroMap() const;
@@ -259,56 +357,8 @@ SWIFT_NAME("BridgedASTContext.getDollarIdentifier(self:_:)")
259357
swift::Identifier
260358
BridgedASTContext_getDollarIdentifier(BridgedASTContext cContext, size_t idx);
261359

262-
SWIFT_NAME("BridgedASTContext.langOptsHasFeature(self:_:)")
263-
bool BridgedASTContext_langOptsHasFeature(BridgedASTContext cContext,
264-
BridgedFeature feature);
265-
266-
SWIFT_NAME("BridgedASTContext.langOptsCustomConditionSet(self:_:)")
267-
bool BridgedASTContext_langOptsCustomConditionSet(BridgedASTContext cContext,
268-
BridgedStringRef cName);
269-
270-
SWIFT_NAME("BridgedASTContext.langOptsHasFeatureNamed(self:_:)")
271-
bool BridgedASTContext_langOptsHasFeatureNamed(BridgedASTContext cContext,
272-
BridgedStringRef cName);
273-
274-
SWIFT_NAME("BridgedASTContext.langOptsHasAttributeNamed(self:_:)")
275-
bool BridgedASTContext_langOptsHasAttributeNamed(BridgedASTContext cContext,
276-
BridgedStringRef cName);
277-
278-
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetOS(self:_:)")
279-
bool BridgedASTContext_langOptsIsActiveTargetOS(BridgedASTContext cContext,
280-
BridgedStringRef cName);
281-
282-
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetArchitecture(self:_:)")
283-
bool BridgedASTContext_langOptsIsActiveTargetArchitecture(BridgedASTContext cContext,
284-
BridgedStringRef cName);
285-
286-
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetEnvironment(self:_:)")
287-
bool BridgedASTContext_langOptsIsActiveTargetEnvironment(BridgedASTContext cContext,
288-
BridgedStringRef cName);
289-
290-
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetRuntime(self:_:)")
291-
bool BridgedASTContext_langOptsIsActiveTargetRuntime(BridgedASTContext cContext,
292-
BridgedStringRef cName);
293-
294-
SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetPtrAuth(self:_:)")
295-
bool BridgedASTContext_langOptsIsActiveTargetPtrAuth(BridgedASTContext cContext,
296-
BridgedStringRef cName);
297-
298-
SWIFT_NAME("BridgedASTContext.langOptsGetTargetAtomicBitWidths(self:_:)")
299-
SwiftInt BridgedASTContext_langOptsGetTargetAtomicBitWidths(BridgedASTContext cContext,
300-
SwiftInt* _Nullable * _Nonnull cComponents);
301-
302-
SWIFT_NAME("BridgedASTContext.langOptsGetLanguageVersion(self:_:)")
303-
SwiftInt BridgedASTContext_langOptsGetLanguageVersion(BridgedASTContext cContext,
304-
SwiftInt* _Nullable * _Nonnull cComponents);
305-
306-
SWIFT_NAME("BridgedASTContext.langOptsGetCompilerVersion(self:_:)")
307-
SwiftInt BridgedASTContext_langOptsGetCompilerVersion(BridgedASTContext cContext,
308-
SwiftInt* _Nullable * _Nonnull cComponents);
309-
310-
/* Deallocate an array of Swift int values that was allocated in C++. */
311-
void deallocateIntBuffer(SwiftInt * _Nullable cComponents);
360+
SWIFT_NAME("getter:BridgedASTContext.langOpts(self:)")
361+
BridgedLangOptions BridgedASTContext_langOpts(BridgedASTContext cContext);
312362

313363
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedCanImportVersion : size_t {
314364
CanImportUnversioned,

include/swift/AST/ASTBridgingImpl.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,17 @@ swift::DeclNameLoc BridgedDeclNameLoc::unbridged() const {
6666
return swift::DeclNameLoc(LocationInfo, NumArgumentLabels);
6767
}
6868

69+
//===----------------------------------------------------------------------===//
70+
// MARK: BridgedLangOptions
71+
//===----------------------------------------------------------------------===//
72+
73+
BridgedLangOptions::BridgedLangOptions(const swift::LangOptions &langOpts)
74+
: LangOpts(&langOpts) { }
75+
76+
const swift::LangOptions &BridgedLangOptions::unbridged() const {
77+
return *LangOpts;
78+
}
79+
6980
//===----------------------------------------------------------------------===//
7081
// MARK: BridgedASTContext
7182
//===----------------------------------------------------------------------===//

include/swift/Frontend/FrontendOptions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,10 @@ class FrontendOptions {
326326
/// exit.
327327
bool PrintTargetInfo = false;
328328

329+
/// Indicates that the frontend should print the static build configuration
330+
/// information as JSON.
331+
bool PrintBuildConfig = false;
332+
329333
/// Indicates that the frontend should print the supported features and then
330334
/// exit.
331335
bool PrintSupportedFeatures = false;

include/swift/Option/Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,6 +1542,9 @@ def target_legacy_spelling : Joined<["--"], "target=">,
15421542
def print_target_info : Flag<["-"], "print-target-info">,
15431543
Flags<[FrontendOption]>,
15441544
HelpText<"Print target information for the given target <triple>, such as x86_64-apple-macos10.9">, MetaVarName<"<triple>">;
1545+
def print_static_build_config : Flag<["-"], "print-static-build-config">,
1546+
Flags<[FrontendOption]>,
1547+
HelpText<"Print static build configuration that can be used to evaluate #ifs in Swift source code">;
15451548

15461549
def print_supported_features : Flag<["-"], "print-supported-features">,
15471550
Flags<[FrontendOption]>,

lib/AST/Bridging/ASTContextBridging.cpp

Lines changed: 2 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -36,116 +36,14 @@ Identifier BridgedASTContext_getDollarIdentifier(BridgedASTContext cContext,
3636
return cContext.unbridged().getDollarIdentifier(idx);
3737
}
3838

39-
bool BridgedASTContext_langOptsHasFeature(BridgedASTContext cContext,
40-
BridgedFeature feature) {
41-
return cContext.unbridged().LangOpts.hasFeature((Feature)feature);
39+
BridgedLangOptions BridgedASTContext_langOpts(BridgedASTContext cContext) {
40+
return cContext.unbridged().LangOpts;
4241
}
4342

4443
unsigned BridgedASTContext::getMajorLanguageVersion() const {
4544
return unbridged().LangOpts.EffectiveLanguageVersion[0];
4645
}
4746

48-
bool BridgedASTContext_langOptsCustomConditionSet(BridgedASTContext cContext,
49-
BridgedStringRef cName) {
50-
ASTContext &ctx = cContext.unbridged();
51-
auto name = cName.unbridged();
52-
if (name.starts_with("$") && ctx.LangOpts.hasFeature(name.drop_front()))
53-
return true;
54-
55-
return ctx.LangOpts.isCustomConditionalCompilationFlagSet(name);
56-
}
57-
58-
bool BridgedASTContext_langOptsHasFeatureNamed(BridgedASTContext cContext,
59-
BridgedStringRef cName) {
60-
return cContext.unbridged().LangOpts.hasFeature(cName.unbridged());
61-
}
62-
63-
bool BridgedASTContext_langOptsHasAttributeNamed(BridgedASTContext cContext,
64-
BridgedStringRef cName) {
65-
return hasAttribute(cContext.unbridged().LangOpts, cName.unbridged());
66-
}
67-
68-
bool BridgedASTContext_langOptsIsActiveTargetOS(BridgedASTContext cContext,
69-
BridgedStringRef cName) {
70-
return cContext.unbridged().LangOpts.checkPlatformCondition(
71-
PlatformConditionKind::OS, cName.unbridged());
72-
}
73-
74-
bool BridgedASTContext_langOptsIsActiveTargetArchitecture(
75-
BridgedASTContext cContext, BridgedStringRef cName) {
76-
return cContext.unbridged().LangOpts.checkPlatformCondition(
77-
PlatformConditionKind::Arch, cName.unbridged());
78-
}
79-
80-
bool BridgedASTContext_langOptsIsActiveTargetEnvironment(
81-
BridgedASTContext cContext, BridgedStringRef cName) {
82-
return cContext.unbridged().LangOpts.checkPlatformCondition(
83-
PlatformConditionKind::TargetEnvironment, cName.unbridged());
84-
}
85-
86-
bool BridgedASTContext_langOptsIsActiveTargetRuntime(BridgedASTContext cContext,
87-
BridgedStringRef cName) {
88-
return cContext.unbridged().LangOpts.checkPlatformCondition(
89-
PlatformConditionKind::Runtime, cName.unbridged());
90-
}
91-
92-
bool BridgedASTContext_langOptsIsActiveTargetPtrAuth(BridgedASTContext cContext,
93-
BridgedStringRef cName) {
94-
return cContext.unbridged().LangOpts.checkPlatformCondition(
95-
PlatformConditionKind::PtrAuth, cName.unbridged());
96-
}
97-
98-
unsigned BridgedASTContext::getLangOptsTargetPointerBitWidth() const {
99-
return unbridged().LangOpts.Target.isArch64Bit() ? 64
100-
: unbridged().LangOpts.Target.isArch32Bit() ? 32
101-
: unbridged().LangOpts.Target.isArch16Bit() ? 16
102-
: 0;
103-
}
104-
105-
bool BridgedASTContext::getLangOptsAttachCommentsToDecls() const {
106-
return unbridged().LangOpts.AttachCommentsToDecls;
107-
}
108-
109-
BridgedEndianness BridgedASTContext::getLangOptsTargetEndianness() const {
110-
return unbridged().LangOpts.Target.isLittleEndian() ? EndianLittle
111-
: EndianBig;
112-
}
113-
114-
/// Convert an array of numbers into a form we can use in Swift.
115-
namespace {
116-
template <typename Arr>
117-
SwiftInt convertArray(const Arr &array, SwiftInt **cElements) {
118-
SwiftInt numElements = array.size();
119-
*cElements = (SwiftInt *)malloc(sizeof(SwiftInt) * numElements);
120-
for (SwiftInt i = 0; i != numElements; ++i)
121-
(*cElements)[i] = array[i];
122-
return numElements;
123-
}
124-
} // namespace
125-
126-
void deallocateIntBuffer(SwiftInt *_Nullable cComponents) { free(cComponents); }
127-
128-
SwiftInt
129-
BridgedASTContext_langOptsGetLanguageVersion(BridgedASTContext cContext,
130-
SwiftInt **cComponents) {
131-
auto theVersion = cContext.unbridged().LangOpts.EffectiveLanguageVersion;
132-
return convertArray(theVersion, cComponents);
133-
}
134-
135-
SWIFT_NAME("BridgedASTContext.langOptsGetCompilerVersion(self:_:)")
136-
SwiftInt
137-
BridgedASTContext_langOptsGetCompilerVersion(BridgedASTContext cContext,
138-
SwiftInt **cComponents) {
139-
auto theVersion = version::Version::getCurrentLanguageVersion();
140-
return convertArray(theVersion, cComponents);
141-
}
142-
143-
SwiftInt BridgedASTContext_langOptsGetTargetAtomicBitWidths(
144-
BridgedASTContext cContext, SwiftInt *_Nullable *_Nonnull cElements) {
145-
return convertArray(cContext.unbridged().LangOpts.getAtomicBitWidthValues(),
146-
cElements);
147-
}
148-
14947
bool BridgedASTContext_canImport(BridgedASTContext cContext,
15048
BridgedStringRef importPath,
15149
SourceLoc canImportLoc,

lib/AST/Bridging/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ target_sources(swiftAST PRIVATE
77
DiagnosticsBridging.cpp
88
ExprBridging.cpp
99
GenericsBridging.cpp
10+
LangOptionsBridging.cpp
1011
MiscBridging.cpp
1112
PatternBridging.cpp
1213
PluginBridging.cpp

0 commit comments

Comments
 (0)