Skip to content

Commit 5cb2409

Browse files
committed
[sil] In SILGenBuiltin a constexpr StringLiteral to reference names of Builtins instead of using raw c strings.
Before this patch we referred to builtin names in SILGenBuiltin using raw c strings. This can lead to potential spelling mistakes yielding bugs. Rather than doing this, I stole a technique that we use in other parts of the compiler: constexpr StringLiteral generation using CPP macros. Specifically, I defined in Builtins.h a new namespace called BuiltinNames and inside of BuiltinNames I used CPP macros to define a StringLiteral for each Builtin. Thus one can get the appropriate name for a Builtin by writing: ``` BuiltinNames::Sizeof ``` instead of writing "Sizeof". I also cleaned up the code a little by adding for functions that take identifiers an additional overload that takes a StringRef and converts the StringRef to an identifier internally. This just eliminates unnecessary code from call sites by moving them into the callee.
1 parent 13937fd commit 5cb2409

File tree

4 files changed

+55
-57
lines changed

4 files changed

+55
-57
lines changed

include/swift/AST/Builtins.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,21 @@ getLLVMIntrinsicIDForBuiltinWithOverflow(BuiltinValueKind ID);
107107
///
108108
/// Returns null if the name does not identifier a known builtin value.
109109
ValueDecl *getBuiltinValueDecl(ASTContext &Context, Identifier Name);
110-
110+
111+
/// Overload that takes a StringRef instead of an Identifier. We convert it to
112+
/// an identifier internally.
113+
ValueDecl *getBuiltinValueDecl(ASTContext &Context, StringRef Name);
114+
111115
/// Returns the name of a builtin declaration given a builtin ID.
112116
StringRef getBuiltinName(BuiltinValueKind ID);
113-
117+
118+
/// Namespace containing constexpr StringLiterals of BuiltinNames so that
119+
/// builtin names can be referred to without using raw string literals.
120+
namespace BuiltinNames {
121+
#define BUILTIN(Id, Name, Attrs) constexpr StringLiteral Id = Name;
122+
#include "swift/AST/Builtins.def"
123+
} // namespace BuiltinNames
124+
114125
/// The information identifying the builtin - its kind and types.
115126
class BuiltinInfo {
116127
public:

include/swift/SIL/SILBuilder.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,12 @@ class SILBuilder {
611611
Subs, Args, getInstructionContext()));
612612
}
613613

614+
BuiltinInst *createBuiltin(SILLocation Loc, StringRef Name, SILType ResultTy,
615+
SubstitutionMap Subs, ArrayRef<SILValue> Args) {
616+
return createBuiltin(Loc, getASTContext().getIdentifier(Name), ResultTy,
617+
Subs, Args);
618+
}
619+
614620
/// Create a binary function with the signature: OpdTy, OpdTy -> ResultTy.
615621
BuiltinInst *createBuiltinBinaryFunction(SILLocation Loc, StringRef Name,
616622
SILType OpdTy, SILType ResultTy,

lib/AST/Builtins.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3813,3 +3813,7 @@ BuiltinFixedArrayType::isFixedNegativeSize() const {
38133813
}
38143814
return false;
38153815
}
3816+
3817+
ValueDecl *swift::getBuiltinValueDecl(ASTContext &Context, StringRef Name) {
3818+
return getBuiltinValueDecl(Context, Context.getIdentifier(Name));
3819+
}

lib/SILGen/SILGenBuiltin.cpp

Lines changed: 32 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -507,11 +507,9 @@ static ManagedValue emitBuiltinAddressOfBorrowBuiltins(SILGenFunction &SGF,
507507
auto borrow = SGF.emitRValue(argument, SGFContext::AllowGuaranteedPlusZero)
508508
.getAsSingleValue(SGF, argument);
509509
if (!SGF.F.getConventions().useLoweredAddresses()) {
510-
auto &context = SGF.getASTContext();
511-
auto identifier =
512-
stackProtected
513-
? context.getIdentifier("addressOfBorrowOpaque")
514-
: context.getIdentifier("unprotectedAddressOfBorrowOpaque");
510+
auto identifier = stackProtected
511+
? BuiltinNames::AddressOfBorrowOpaque
512+
: BuiltinNames::UnprotectedAddressOfBorrowOpaque;
515513
auto builtin = SGF.B.createBuiltin(loc, identifier, rawPointerType,
516514
substitutions, {borrow.getValue()});
517515
return ManagedValue::forObjectRValueWithoutOwnership(builtin);
@@ -1173,8 +1171,7 @@ static ManagedValue emitBuiltinTypeTrait(SILGenFunction &SGF,
11731171
case TypeTraitResult::CanBe: {
11741172
auto &C = SGF.getASTContext();
11751173
auto int8Ty = BuiltinIntegerType::get(8, C)->getCanonicalType();
1176-
auto apply = SGF.B.createBuiltin(loc,
1177-
C.getIdentifier(getBuiltinName(Kind)),
1174+
auto apply = SGF.B.createBuiltin(loc, getBuiltinName(Kind),
11781175
SILType::getPrimitiveObjectType(int8Ty),
11791176
substitutions, args[0].getValue());
11801177

@@ -1357,8 +1354,7 @@ emitBuiltinGlobalStringTablePointer(SILGenFunction &SGF, SILLocation loc,
13571354

13581355
SILValue argValue = args[0].getValue();
13591356
auto &astContext = SGF.getASTContext();
1360-
Identifier builtinId = astContext.getIdentifier(
1361-
getBuiltinName(BuiltinValueKind::GlobalStringTablePointer));
1357+
auto builtinId = BuiltinNames::GlobalStringTablePointer;
13621358

13631359
auto resultVal = SGF.B.createBuiltin(loc, builtinId,
13641360
SILType::getRawPointerType(astContext),
@@ -1479,10 +1475,9 @@ static ManagedValue emitBuiltinGetCurrentAsyncTask(
14791475
SILGenFunction &SGF, SILLocation loc, SubstitutionMap subs,
14801476
PreparedArguments &&preparedArgs, SGFContext C) {
14811477
ASTContext &ctx = SGF.getASTContext();
1482-
auto apply = SGF.B.createBuiltin(
1483-
loc,
1484-
ctx.getIdentifier(getBuiltinName(BuiltinValueKind::GetCurrentAsyncTask)),
1485-
SGF.getLoweredType(ctx.TheNativeObjectType), SubstitutionMap(), { });
1478+
auto apply = SGF.B.createBuiltin(loc, BuiltinNames::GetCurrentAsyncTask,
1479+
SGF.getLoweredType(ctx.TheNativeObjectType),
1480+
SubstitutionMap(), {});
14861481
return SGF.emitManagedRValueWithEndLifetimeCleanup(apply);
14871482
}
14881483

@@ -1517,24 +1512,21 @@ static ManagedValue emitBuiltinSizeof(
15171512
PreparedArguments &&preparedArgs, SGFContext C) {
15181513
auto &ctx = SGF.getASTContext();
15191514
return ManagedValue::forObjectRValueWithoutOwnership(SGF.B.createBuiltin(
1520-
loc, ctx.getIdentifier(getBuiltinName(BuiltinValueKind::Sizeof)),
1521-
SILType::getBuiltinWordType(ctx), subs, {}));
1515+
loc, BuiltinNames::Sizeof, SILType::getBuiltinWordType(ctx), subs, {}));
15221516
}
15231517
static ManagedValue emitBuiltinStrideof(
15241518
SILGenFunction &SGF, SILLocation loc, SubstitutionMap subs,
15251519
PreparedArguments &&preparedArgs, SGFContext C) {
15261520
auto &ctx = SGF.getASTContext();
15271521
return ManagedValue::forObjectRValueWithoutOwnership(SGF.B.createBuiltin(
1528-
loc, ctx.getIdentifier(getBuiltinName(BuiltinValueKind::Strideof)),
1529-
SILType::getBuiltinWordType(ctx), subs, {}));
1522+
loc, BuiltinNames::Strideof, SILType::getBuiltinWordType(ctx), subs, {}));
15301523
}
15311524
static ManagedValue emitBuiltinAlignof(
15321525
SILGenFunction &SGF, SILLocation loc, SubstitutionMap subs,
15331526
PreparedArguments &&preparedArgs, SGFContext C) {
15341527
auto &ctx = SGF.getASTContext();
15351528
return ManagedValue::forObjectRValueWithoutOwnership(SGF.B.createBuiltin(
1536-
loc, ctx.getIdentifier(getBuiltinName(BuiltinValueKind::Alignof)),
1537-
SILType::getBuiltinWordType(ctx), subs, {}));
1529+
loc, BuiltinNames::Alignof, SILType::getBuiltinWordType(ctx), subs, {}));
15381530
}
15391531

15401532
enum class CreateTaskOptions {
@@ -1697,8 +1689,7 @@ static ManagedValue emitCreateAsyncTask(SILGenFunction &SGF, SILLocation loc,
16971689
functionValue.forward(SGF)
16981690
};
16991691

1700-
auto builtinID =
1701-
ctx.getIdentifier(getBuiltinName(BuiltinValueKind::CreateAsyncTask));
1692+
auto builtinID = BuiltinNames::CreateAsyncTask;
17021693
auto resultTy = SGF.getLoweredType(getAsyncTaskAndContextType(ctx));
17031694

17041695
auto apply = SGF.B.createBuiltin(loc, builtinID, resultTy, subs, builtinArgs);
@@ -1780,9 +1771,8 @@ static ManagedValue emitBuiltinCreateTaskGroup(SILGenFunction &SGF,
17801771
SGFContext C) {
17811772
auto &ctx = SGF.getASTContext();
17821773
auto resultType = SILType::getRawPointerType(ctx);
1783-
auto value = SGF.B.createBuiltin(
1784-
loc, ctx.getIdentifier(getBuiltinName(BuiltinValueKind::CreateTaskGroup)),
1785-
resultType, subs, {});
1774+
auto value = SGF.B.createBuiltin(loc, BuiltinNames::CreateTaskGroup,
1775+
resultType, subs, {});
17861776
return ManagedValue::forObjectRValueWithoutOwnership(value);
17871777
}
17881778

@@ -1794,11 +1784,8 @@ static ManagedValue emitBuiltinCreateTaskGroupWithFlags(
17941784
ArrayRef<ManagedValue> args, SGFContext C) {
17951785
auto &ctx = SGF.getASTContext();
17961786
auto resultType = SILType::getRawPointerType(ctx);
1797-
auto value = SGF.B.createBuiltin(
1798-
loc,
1799-
ctx.getIdentifier(
1800-
getBuiltinName(BuiltinValueKind::CreateTaskGroupWithFlags)),
1801-
resultType, subs, {args[0].getValue()});
1787+
auto value = SGF.B.createBuiltin(loc, BuiltinNames::CreateTaskGroupWithFlags,
1788+
resultType, subs, {args[0].getValue()});
18021789
return ManagedValue::forObjectRValueWithoutOwnership(value);
18031790
}
18041791

@@ -1926,9 +1913,7 @@ static ManagedValue emitBuiltinAutoDiffCreateLinearMapContextWithType(
19261913
ArrayRef<ManagedValue> args, SGFContext C) {
19271914
ASTContext &ctx = SGF.getASTContext();
19281915
auto *builtinApply = SGF.B.createBuiltin(
1929-
loc,
1930-
ctx.getIdentifier(getBuiltinName(
1931-
BuiltinValueKind::AutoDiffCreateLinearMapContextWithType)),
1916+
loc, BuiltinNames::AutoDiffCreateLinearMapContextWithType,
19321917
SILType::getNativeObjectType(ctx), subs,
19331918
/*args*/ {args[0].getValue()});
19341919
return SGF.emitManagedRValueWithCleanup(builtinApply);
@@ -1938,13 +1923,10 @@ static ManagedValue emitBuiltinAutoDiffProjectTopLevelSubcontext(
19381923
SILGenFunction &SGF, SILLocation loc, SubstitutionMap subs,
19391924
ArrayRef<ManagedValue> args, SGFContext C) {
19401925
ASTContext &ctx = SGF.getASTContext();
1941-
auto *builtinApply = SGF.B.createBuiltin(
1942-
loc,
1943-
ctx.getIdentifier(
1944-
getBuiltinName(BuiltinValueKind::AutoDiffProjectTopLevelSubcontext)),
1945-
SILType::getRawPointerType(ctx),
1946-
subs,
1947-
/*args*/ {args[0].borrow(SGF, loc).getValue()});
1926+
auto *builtinApply =
1927+
SGF.B.createBuiltin(loc, BuiltinNames::AutoDiffProjectTopLevelSubcontext,
1928+
SILType::getRawPointerType(ctx), subs,
1929+
/*args*/ {args[0].borrow(SGF, loc).getValue()});
19481930
return ManagedValue::forObjectRValueWithoutOwnership(builtinApply);
19491931
}
19501932

@@ -1953,9 +1935,7 @@ static ManagedValue emitBuiltinAutoDiffAllocateSubcontextWithType(
19531935
ArrayRef<ManagedValue> args, SGFContext C) {
19541936
ASTContext &ctx = SGF.getASTContext();
19551937
auto *builtinApply = SGF.B.createBuiltin(
1956-
loc,
1957-
ctx.getIdentifier(
1958-
getBuiltinName(BuiltinValueKind::AutoDiffAllocateSubcontextWithType)),
1938+
loc, BuiltinNames::AutoDiffAllocateSubcontextWithType,
19591939
SILType::getRawPointerType(ctx), subs,
19601940
/*args*/ {args[0].borrow(SGF, loc).getValue(), args[1].getValue()});
19611941
return ManagedValue::forObjectRValueWithoutOwnership(builtinApply);
@@ -2034,10 +2014,9 @@ static ManagedValue emitBuiltinGetEnumTag(SILGenFunction &SGF, SILLocation loc,
20342014
SGFContext C) {
20352015
auto &ctx = SGF.getASTContext();
20362016

2037-
auto bi = SGF.B.createBuiltin(
2038-
loc, ctx.getIdentifier(getBuiltinName(BuiltinValueKind::GetEnumTag)),
2039-
SILType::getBuiltinIntegerType(32, ctx), subs,
2040-
{ args[0].getValue() });
2017+
auto bi = SGF.B.createBuiltin(loc, BuiltinNames::GetEnumTag,
2018+
SILType::getBuiltinIntegerType(32, ctx), subs,
2019+
{args[0].getValue()});
20412020

20422021
return ManagedValue::forObjectRValueWithoutOwnership(bi);
20432022
}
@@ -2048,10 +2027,9 @@ static ManagedValue emitBuiltinInjectEnumTag(SILGenFunction &SGF, SILLocation lo
20482027
SGFContext C) {
20492028
auto &ctx = SGF.getASTContext();
20502029

2051-
auto bi = SGF.B.createBuiltin(
2052-
loc, ctx.getIdentifier(getBuiltinName(BuiltinValueKind::InjectEnumTag)),
2053-
SILType::getEmptyTupleType(ctx), subs,
2054-
{ args[0].getValue(), args[1].getValue() });
2030+
auto bi = SGF.B.createBuiltin(loc, BuiltinNames::InjectEnumTag,
2031+
SILType::getEmptyTupleType(ctx), subs,
2032+
{args[0].getValue(), args[1].getValue()});
20552033

20562034
return ManagedValue::forObjectRValueWithoutOwnership(bi);
20572035
}
@@ -2081,10 +2059,9 @@ static ManagedValue emitBuiltinAddressOfRawLayout(SILGenFunction &SGF,
20812059
SGFContext C) {
20822060
auto &ctx = SGF.getASTContext();
20832061

2084-
auto bi = SGF.B.createBuiltin(
2085-
loc, ctx.getIdentifier(getBuiltinName(BuiltinValueKind::AddressOfRawLayout)),
2086-
SILType::getRawPointerType(ctx), subs,
2087-
{ args[0].getValue() });
2062+
auto bi = SGF.B.createBuiltin(loc, BuiltinNames::AddressOfRawLayout,
2063+
SILType::getRawPointerType(ctx), subs,
2064+
{args[0].getValue()});
20882065

20892066
return ManagedValue::forObjectRValueWithoutOwnership(bi);
20902067
}
@@ -2141,7 +2118,7 @@ static ManagedValue emitBuiltinEmplace(SILGenFunction &SGF,
21412118

21422119
// Mark the buffer as initializedto communicate to DI that the memory
21432120
// is considered initialized from this point.
2144-
auto markInit = getBuiltinValueDecl(Ctx, Ctx.getIdentifier("prepareInitialization"));
2121+
auto markInit = getBuiltinValueDecl(Ctx, BuiltinNames::PrepareInitialization);
21452122
SGF.B.createBuiltin(loc, markInit->getBaseIdentifier(),
21462123
SILType::getEmptyTupleType(Ctx),
21472124
SubstitutionMap(),

0 commit comments

Comments
 (0)