Skip to content

Commit 3082b04

Browse files
committed
[Macros] Feed the static build configuration into macro expansions
Thread the static build configuration (formed from language options) in to the macro plugin handler, which will serialize it for use in the macro implementation. test this with a simple macro that checks whether a particular custom configuration (set via `-D`) is enabled or not. This required some re-layering, sinking the logic for building a StaticBuildConfiguration from language options down into a new swiftBasicSwift library, which sits on top of the C++ swiftBasic and provides Swift functionality for it. That can be used by the C++ swiftAST to cache the StaticBuildConfiguration on the ASTContext, making it available for other parts of ASTGen.
1 parent ae8f9d8 commit 3082b04

27 files changed

+432
-180
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 10 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -194,115 +194,6 @@ BridgedDeclNameLoc_createParsed(BridgedASTContext cContext,
194194
swift::SourceLoc moduleSelectorLoc,
195195
swift::SourceLoc baseNameLoc);
196196

197-
//===----------------------------------------------------------------------===//
198-
// MARK: LangOptions
199-
//===----------------------------------------------------------------------===//
200-
201-
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedEndianness : size_t {
202-
EndianLittle,
203-
EndianBig,
204-
};
205-
206-
class BridgedLangOptions {
207-
const swift::LangOptions * _Nonnull LangOpts;
208-
209-
public:
210-
SWIFT_UNAVAILABLE("Use init(raw:) instead")
211-
BRIDGED_INLINE BridgedLangOptions(const swift::LangOptions &langOpts);
212-
213-
SWIFT_UNAVAILABLE("Use '.raw' instead")
214-
BRIDGED_INLINE const swift::LangOptions &unbridged() const;
215-
216-
SWIFT_COMPUTED_PROPERTY
217-
const void *_Nonnull getRaw() const { return LangOpts; }
218-
219-
SWIFT_COMPUTED_PROPERTY
220-
unsigned getMajorLanguageVersion() const;
221-
222-
SWIFT_COMPUTED_PROPERTY
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));
306197

307198
//===----------------------------------------------------------------------===//
308199
// MARK: ASTContext
@@ -326,6 +217,9 @@ class BridgedASTContext {
326217

327218
SWIFT_COMPUTED_PROPERTY
328219
BridgedAvailabilityMacroMap getAvailabilityMacroMap() const;
220+
221+
SWIFT_COMPUTED_PROPERTY
222+
BridgedDiagnosticEngine getDiags() const;
329223
};
330224

331225
#define IDENTIFIER_WITH_NAME(Name, _) \
@@ -360,6 +254,10 @@ BridgedASTContext_getDollarIdentifier(BridgedASTContext cContext, size_t idx);
360254
SWIFT_NAME("getter:BridgedASTContext.langOpts(self:)")
361255
BridgedLangOptions BridgedASTContext_langOpts(BridgedASTContext cContext);
362256

257+
SWIFT_NAME("BridgedLangOptions.hasAttributeNamed(self:_:)")
258+
bool BridgedLangOptions_hasAttributeNamed(BridgedLangOptions cLangOpts,
259+
BridgedStringRef cName);
260+
363261
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedCanImportVersion : size_t {
364262
CanImportUnversioned,
365263
CanImportVersion,
@@ -374,6 +272,9 @@ bool BridgedASTContext_canImport(BridgedASTContext cContext,
374272
const SwiftInt *_Nullable versionComponents,
375273
SwiftInt numVersionComponents);
376274

275+
SWIFT_NAME("getter:BridgedASTContext.staticBuildConfigurationPtr(self:)")
276+
void * _Nonnull BridgedASTContext_staticBuildConfiguration(BridgedASTContext cContext);
277+
377278
//===----------------------------------------------------------------------===//
378279
// MARK: AST nodes
379280
//===----------------------------------------------------------------------===//

include/swift/AST/ASTContextGlobalCache.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ struct ASTContext::GlobalCache {
8484
const NormalProtocolConformance *,
8585
std::vector<ConformanceIsolationError>
8686
> conformanceIsolationErrors;
87+
88+
/// The static build configuration. This points to an instance of the Swift
89+
/// StaticBuildConfiguration.
90+
void *StaticBuildConfiguration = nullptr;
8791
};
8892

8993
} // end namespace

include/swift/Basic/BasicBridging.h

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class VersionTuple;
6161
} // end namespace llvm
6262

6363
namespace swift {
64+
class LangOptions;
6465
class SourceLoc;
6566
class SourceRange;
6667
class CharSourceRange;
@@ -451,6 +452,112 @@ struct BridgedSwiftClosure {
451452
BRIDGED_INLINE void operator()(const void *_Nullable);
452453
};
453454

455+
//===----------------------------------------------------------------------===//
456+
// MARK: LangOptions
457+
//===----------------------------------------------------------------------===//
458+
459+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedEndianness : size_t {
460+
EndianLittle,
461+
EndianBig,
462+
};
463+
464+
class BridgedLangOptions {
465+
const swift::LangOptions * _Nonnull LangOpts;
466+
467+
public:
468+
SWIFT_UNAVAILABLE("Use init(raw:) instead")
469+
BRIDGED_INLINE BridgedLangOptions(const swift::LangOptions &langOpts);
470+
471+
SWIFT_UNAVAILABLE("Use '.raw' instead")
472+
BRIDGED_INLINE const swift::LangOptions &unbridged() const;
473+
474+
SWIFT_COMPUTED_PROPERTY
475+
const void *_Nonnull getRaw() const { return LangOpts; }
476+
477+
SWIFT_COMPUTED_PROPERTY
478+
unsigned getMajorLanguageVersion() const;
479+
480+
SWIFT_COMPUTED_PROPERTY
481+
unsigned getTargetPointerBitWidth() const;
482+
483+
SWIFT_COMPUTED_PROPERTY
484+
BridgedEndianness getTargetEndianness() const;
485+
486+
SWIFT_COMPUTED_PROPERTY
487+
bool getAttachCommentsToDecls() const;
488+
};
489+
490+
/// Key used when enumerating build configuration entries to the
491+
/// StaticBuildConfiguration initializer for an ASTContext.
492+
enum ENUM_EXTENSIBILITY_ATTR(closed) BuildConfigurationKey : size_t {
493+
BCKCustomCondition,
494+
BCKFeature,
495+
BCKAttribute,
496+
BCKTargetOSName,
497+
BCKTargetArchitecture,
498+
BCKTargetEnvironment,
499+
BCKTargetRuntime,
500+
BCKTargetPointerAuthenticationScheme,
501+
BCKTargetObjectFileFormat
502+
};
503+
504+
SWIFT_NAME("BridgedLangOptions.hasFeature(self:_:)")
505+
bool BridgedLangOptions_hasFeature(BridgedLangOptions cLangOpts,
506+
BridgedFeature feature);
507+
508+
SWIFT_NAME("BridgedLangOptions.customConditionSet(self:_:)")
509+
bool BridgedLangOptions_customConditionSet(BridgedLangOptions cLangOpts,
510+
BridgedStringRef cName);
511+
512+
SWIFT_NAME("BridgedLangOptions.hasFeatureNamed(self:_:)")
513+
bool BridgedLangOptions_hasFeatureNamed(BridgedLangOptions cLangOpts,
514+
BridgedStringRef cName);
515+
516+
SWIFT_NAME("BridgedLangOptions.isActiveTargetOS(self:_:)")
517+
bool BridgedLangOptions_isActiveTargetOS(BridgedLangOptions cLangOpts,
518+
BridgedStringRef cName);
519+
520+
SWIFT_NAME("BridgedLangOptions.isActiveTargetArchitecture(self:_:)")
521+
bool BridgedLangOptions_isActiveTargetArchitecture(BridgedLangOptions cLangOpts,
522+
BridgedStringRef cName);
523+
524+
SWIFT_NAME("BridgedLangOptions.isActiveTargetEnvironment(self:_:)")
525+
bool BridgedLangOptions_isActiveTargetEnvironment(BridgedLangOptions cLangOpts,
526+
BridgedStringRef cName);
527+
528+
SWIFT_NAME("BridgedLangOptions.isActiveTargetRuntime(self:_:)")
529+
bool BridgedLangOptions_isActiveTargetRuntime(BridgedLangOptions cLangOpts,
530+
BridgedStringRef cName);
531+
532+
SWIFT_NAME("BridgedLangOptions.isActiveTargetPtrAuth(self:_:)")
533+
bool BridgedLangOptions_isActiveTargetPtrAuth(BridgedLangOptions cLangOpts,
534+
BridgedStringRef cName);
535+
536+
SWIFT_NAME("BridgedLangOptions.getTargetAtomicBitWidths(self:_:)")
537+
SwiftInt BridgedLangOptions_getTargetAtomicBitWidths(BridgedLangOptions cLangOpts,
538+
SwiftInt* _Nullable * _Nonnull cComponents);
539+
540+
SWIFT_NAME("BridgedLangOptions.getLanguageVersion(self:_:)")
541+
SwiftInt BridgedLangOptions_getLanguageVersion(BridgedLangOptions cLangOpts,
542+
SwiftInt* _Nullable * _Nonnull cComponents);
543+
544+
SWIFT_NAME("BridgedLangOptions.getCompilerVersion(self:_:)")
545+
SwiftInt BridgedLangOptions_getCompilerVersion(BridgedLangOptions cLangOpts,
546+
SwiftInt* _Nullable * _Nonnull cComponents);
547+
548+
/* Deallocate an array of Swift int values that was allocated in C++. */
549+
void deallocateIntBuffer(SwiftInt * _Nullable cComponents);
550+
551+
/// Enumerate all of the key/value pairs for the build configuration by calling
552+
/// the given callback for each one.
553+
SWIFT_NAME("BridgedLangOptions.enumerateBuildConfigurationEntries(self:callbackContext:callback:)")
554+
void BridgedLangOptions_enumerateBuildConfigurationEntries(
555+
BridgedLangOptions cLangOpts,
556+
void * _Nonnull callbackContext,
557+
void (* _Nonnull callback)(
558+
BridgedLangOptions cLangOpts, void * _Nonnull callbackContext,
559+
BuildConfigurationKey key, BridgedStringRef value));
560+
454561
SWIFT_END_NULLABILITY_ANNOTATIONS
455562

456563
#ifndef PURE_BRIDGING_MODE
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//===--- BasicSwift.h -------------------------------------------*- C++ -*-===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2023 - 2025 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef SWIFT_BRIDGING_BASICSWIFT_H
14+
#define SWIFT_BRIDGING_BASICSWIFT_H
15+
16+
#include "swift/Basic/BasicBridging.h"
17+
18+
#ifdef __cplusplus
19+
extern "C" {
20+
#endif
21+
22+
/// Create a new static build configuration for the given language options.
23+
void * _Nonnull swift_Basic_createStaticBuildConfiguration(BridgedLangOptions cLangOpts);
24+
25+
/// Free the given static build configuration.
26+
void swift_Basic_freeStaticBuildConfiguration(void * _Nonnull staticBuildConfiguration);
27+
28+
#ifdef __cplusplus
29+
}
30+
#endif
31+
32+
#endif // SWIFT_BRIDGING_BASICSWIFT_H

include/swift/Bridging/MacroEvaluation.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#define SWIFT_BRIDGING_MACROS_H
1515

1616
#include "swift/Basic/BasicBridging.h"
17+
#include "swift/AST/ASTBridging.h"
1718

1819
#ifdef __cplusplus
1920
extern "C" {
@@ -40,13 +41,13 @@ void swift_Macros_freeExpansionReplacements(
4041
ptrdiff_t *_Nullable replacementsPtr, ptrdiff_t numReplacements);
4142

4243
ptrdiff_t swift_Macros_expandFreestandingMacro(
43-
void *_Nonnull diagEngine, const void *_Nonnull macro,
44+
BridgedASTContext cContext, const void *_Nonnull macro,
4445
const char *_Nonnull discriminator, uint8_t rawMacroRole,
4546
void *_Nonnull sourceFile, const void *_Nullable sourceLocation,
4647
BridgedStringRef *_Nonnull evaluatedSourceOut);
4748

4849
ptrdiff_t swift_Macros_expandAttachedMacro(
49-
void *_Nonnull diagEngine, const void *_Nonnull macro,
50+
BridgedASTContext cContext, const void *_Nonnull macro,
5051
const char *_Nonnull discriminator, const char *_Nonnull qualifiedType,
5152
const char *_Nonnull conformances, uint8_t rawMacroRole,
5253
void *_Nonnull customAttrSourceFile,

lib/AST/Bridging/ASTContextBridging.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
#include "swift/AST/ASTBridging.h"
1414

1515
#include "swift/AST/ASTContext.h"
16+
#include "swift/AST/ASTContextGlobalCache.h"
1617
#include "swift/AST/AvailabilitySpec.h"
18+
#include "swift/Bridging/BasicSwift.h"
1719

1820
using namespace swift;
1921

@@ -44,6 +46,10 @@ unsigned BridgedASTContext::getMajorLanguageVersion() const {
4446
return unbridged().LangOpts.EffectiveLanguageVersion[0];
4547
}
4648

49+
BridgedDiagnosticEngine BridgedASTContext::getDiags() const {
50+
return &unbridged().Diags;
51+
}
52+
4753
bool BridgedASTContext_canImport(BridgedASTContext cContext,
4854
BridgedStringRef importPath,
4955
SourceLoc canImportLoc,
@@ -82,3 +88,22 @@ bool BridgedASTContext_canImport(BridgedASTContext cContext,
8288
BridgedAvailabilityMacroMap BridgedASTContext::getAvailabilityMacroMap() const {
8389
return &unbridged().getAvailabilityMacroMap();
8490
}
91+
92+
bool BridgedLangOptions_hasAttributeNamed(BridgedLangOptions cLangOpts,
93+
BridgedStringRef cName) {
94+
return hasAttribute(cLangOpts.unbridged(), cName.unbridged());
95+
}
96+
97+
void *BridgedASTContext_staticBuildConfiguration(BridgedASTContext cContext) {
98+
ASTContext &ctx = cContext.unbridged();
99+
void *staticBuildConfiguration = ctx.getGlobalCache().StaticBuildConfiguration;
100+
if (!staticBuildConfiguration) {
101+
staticBuildConfiguration =
102+
swift_Basic_createStaticBuildConfiguration(ctx.LangOpts);
103+
ctx.addCleanup([staticBuildConfiguration] {
104+
swift_Basic_freeStaticBuildConfiguration(staticBuildConfiguration);
105+
});
106+
}
107+
108+
return staticBuildConfiguration;
109+
}

lib/AST/Bridging/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ target_sources(swiftAST PRIVATE
77
DiagnosticsBridging.cpp
88
ExprBridging.cpp
99
GenericsBridging.cpp
10-
LangOptionsBridging.cpp
1110
MiscBridging.cpp
1211
PatternBridging.cpp
1312
PluginBridging.cpp

lib/AST/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ target_link_libraries(swiftAST
180180

181181
if (SWIFT_BUILD_SWIFT_SYNTAX)
182182
target_link_libraries(swiftAST
183-
PRIVATE swiftASTGen)
183+
PRIVATE swiftASTGen swiftBasicSwift)
184184
endif()
185185

186186
set_swift_llvm_is_available(swiftAST)

0 commit comments

Comments
 (0)