summaryrefslogtreecommitdiffstats
path: root/source/slang/lower.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-08-14 14:48:37 -0700
committerTim Foley <tfoley@nvidia.com>2017-08-14 14:48:37 -0700
commit9885c972a6bfa6f856e505cdd90d9b71fdbdadaf (patch)
tree7314b26e21ded966b6a4fe2430f0421c0c0970bd /source/slang/lower.cpp
parent7f57ea4ad86c2a3eb5a14fef458e711845c1f87e (diff)
Add an explicit `Name` type
Fixes #23 Up to this point, the compiler has used the ordinary `String` type to represent declaration names, which means a bunch of lookup structures throughout the compiler were string-to-whatever maps, which can reduce efficiency. It also means that things like the `Token` type end up carying a `String` by value and paying for things like reference-counting. This change adds a `Name` type that is used to represent names of variables, types, macros, etc. Names are cached and unique'd globally for a session, and the string-to-name mapping gets done during lexing. From that point on, most mapping is from pointers, which should make all the various table lookups faster. More importantly (possibly), this brings us one step closer to being able to pool-allocate the AST nodes.
Diffstat (limited to 'source/slang/lower.cpp')
-rw-r--r--source/slang/lower.cpp171
1 files changed, 101 insertions, 70 deletions
diff --git a/source/slang/lower.cpp b/source/slang/lower.cpp
index 68f61f8a5..2c62a69a8 100644
--- a/source/slang/lower.cpp
+++ b/source/slang/lower.cpp
@@ -317,8 +317,8 @@ private:
class PseudoVarDecl : public RefObject
{
public:
- Token name;
- SourceLoc Position;
+ NameLoc nameAndLoc;
+ SourceLoc loc;
TypeExp type;
};
@@ -339,7 +339,7 @@ public:
class PseudoExpr : public RefObject
{
public:
- SourceLoc Position;
+ SourceLoc loc;
QualType type;
};
@@ -388,9 +388,9 @@ static SourceLoc getPosition(LoweredExpr const& expr)
{
switch (expr.getFlavor())
{
- case LoweredExpr::Flavor::Expr: return expr.getExpr() ->Position;
- case LoweredExpr::Flavor::Tuple: return expr.getTupleExpr() ->Position;
- case LoweredExpr::Flavor::VaryingTuple: return expr.getVaryingTupleExpr()->Position;
+ case LoweredExpr::Flavor::Expr: return expr.getExpr() ->loc;
+ case LoweredExpr::Flavor::Tuple: return expr.getTupleExpr() ->loc;
+ case LoweredExpr::Flavor::VaryingTuple: return expr.getVaryingTupleExpr()->loc;
default:
SLANG_UNREACHABLE("all cases handled");
return SourceLoc();
@@ -415,7 +415,7 @@ struct SharedLoweringContext
CodeGenTarget target;
// A set of words reserved by the target
- Dictionary<String, String> reservedWords;
+ HashSet<Name*> reservedWords;
RefPtr<ModuleDecl> loweredProgram;
@@ -477,15 +477,16 @@ struct LoweringVisitor
CodeGenTarget getTarget() { return shared->target; }
- bool isReservedWord(String const& name)
+ bool isReservedWord(Name* name)
{
- return shared->reservedWords.TryGetValue(name) != nullptr;
+ return shared->reservedWords.Contains(name);
}
void registerReservedWord(
- String const& name)
+ String const& text)
{
- shared->reservedWords.Add(name, name);
+ Name* name = shared->compileRequest->getNamePool()->getName(text);
+ shared->reservedWords.Add(name);
}
void registerReservedWords()
@@ -781,7 +782,7 @@ struct LoweringVisitor
Expr* loweredExpr,
Expr* expr)
{
- loweredExpr->Position = expr->Position;
+ loweredExpr->loc = expr->loc;
loweredExpr->type.type = lowerType(expr->type.type);
}
@@ -796,19 +797,27 @@ struct LoweringVisitor
}
RefPtr<Expr> createUncheckedVarRef(
- char const* name)
+ Name* name)
{
RefPtr<VarExpr> result = new VarExpr();
result->name = name;
return result;
}
+
+ RefPtr<Expr> createUncheckedVarRef(
+ char const* name)
+ {
+ return createUncheckedVarRef(
+ shared->compileRequest->getNamePool()->getName(name));
+ }
+
RefPtr<Expr> createSimpleVarRef(
SourceLoc const& loc,
VarDeclBase* decl)
{
RefPtr<VarExpr> result = new VarExpr();
- result->Position = loc;
+ result->loc = loc;
result->type.type = decl->type.type;
result->declRef = makeDeclRef(decl);
result->name = decl->getName();
@@ -842,7 +851,7 @@ struct LoweringVisitor
TupleVarDecl* decl)
{
RefPtr<TupleExpr> result = new TupleExpr();
- result->Position = loc;
+ result->loc = loc;
result->type.type = decl->type.type;
if (auto primaryDecl = decl->primaryDecl)
@@ -891,11 +900,11 @@ struct LoweringVisitor
// If we are referencing a declaration that got tuple-ified,
// then we need to produce a tuple expression as well.
- return createTupleRef(expr->Position, tupleVarDecl);
+ return createTupleRef(expr->loc, tupleVarDecl);
}
else if (auto varyingTupleVarDecl = loweredDecl.asVaryingTupleDecl())
{
- return createVaryingTupleRef(expr->Position, varyingTupleVarDecl);
+ return createVaryingTupleRef(expr->loc, varyingTupleVarDecl);
}
RefPtr<VarExpr> loweredExpr = new VarExpr();
@@ -905,26 +914,31 @@ struct LoweringVisitor
return LoweredExpr(loweredExpr);
}
- String generateName()
+ Name* getName(String const& text)
+ {
+ return shared->compileRequest->getNamePool()->getName(text);
+ }
+
+ Name* generateName()
{
int id = shared->nameCounter++;
String result;
result.append("SLANG_tmp_");
result.append(id);
- return result;
+ return getName(result);
}
RefPtr<Expr> moveTemp(RefPtr<Expr> expr)
{
RefPtr<Variable> varDecl = new Variable();
- varDecl->name.Content = generateName();
+ varDecl->nameAndLoc.name = generateName();
varDecl->type.type = expr->type.type;
varDecl->initExpr = expr;
addDecl(varDecl);
- return createSimpleVarRef(expr->Position, varDecl);
+ return createSimpleVarRef(expr->loc, varDecl);
}
// The idea of this function is to take an expression that we plan to
@@ -953,7 +967,7 @@ struct LoweringVisitor
if (auto tupleExpr = expr.asTuple())
{
RefPtr<TupleExpr> resultExpr = new TupleExpr();
- resultExpr->Position = tupleExpr->Position;
+ resultExpr->loc = tupleExpr->loc;
resultExpr->type = tupleExpr->type;
if (tupleExpr->primaryExpr)
{
@@ -973,7 +987,7 @@ struct LoweringVisitor
else if (auto varyingTupleExpr = expr.asVaryingTuple())
{
RefPtr<VaryingTupleExpr> resultExpr = new VaryingTupleExpr();
- resultExpr->Position = varyingTupleExpr->Position;
+ resultExpr->loc = varyingTupleExpr->loc;
resultExpr->type = varyingTupleExpr->type;
for (auto ee : varyingTupleExpr->elements)
{
@@ -1057,7 +1071,7 @@ struct LoweringVisitor
rightExpr = maybeMoveTemp(rightExpr);
RefPtr<AggTypeCtorExpr> ctorExpr = new AggTypeCtorExpr();
- ctorExpr->Position = rightExpr->Position;
+ ctorExpr->loc = rightExpr->loc;
ctorExpr->type.type = leftType;
ctorExpr->base.type = leftType;
@@ -1065,7 +1079,7 @@ struct LoweringVisitor
for (int ee = 0; ee < elementCount; ++ee)
{
RefPtr<SwizzleExpr> swizzleExpr = new SwizzleExpr();
- swizzleExpr->Position = rightExpr->Position;
+ swizzleExpr->loc = rightExpr->loc;
swizzleExpr->type.type = rightVecType->elementType;
swizzleExpr->base = rightExpr;
swizzleExpr->elementCount = 1;
@@ -1104,19 +1118,24 @@ struct LoweringVisitor
RefPtr<Expr>* link = nullptr;
};
- RefPtr<Expr> createSimpleVarExpr(char const* name)
+ RefPtr<Expr> createSimpleVarExpr(Name* name)
{
RefPtr<VarExpr> varExpr = new VarExpr();
varExpr->name = name;
return varExpr;
}
+ RefPtr<Expr> createSimpleVarExpr(char const* name)
+ {
+ return createSimpleVarExpr(getName(name));
+ }
+
RefPtr<InvokeExpr> createSeqExpr(
RefPtr<Expr> left,
RefPtr<Expr> right)
{
RefPtr<InfixExpr> seqExpr = new InfixExpr();
- seqExpr->Position = left->Position;
+ seqExpr->loc = left->loc;
seqExpr->type = right->type;
seqExpr->FunctionExpr = createSimpleVarExpr(",");
seqExpr->Arguments.Add(left);
@@ -1207,14 +1226,14 @@ struct LoweringVisitor
{
// LHS array element
RefPtr<IndexExpr> arrayElemExpr = new IndexExpr();
- arrayElemExpr->Position = leftExpr->Position;
+ arrayElemExpr->loc = leftExpr->loc;
arrayElemExpr->type.type = leftArrayType->BaseType;
arrayElemExpr->BaseExpression = leftExpr;
arrayElemExpr->IndexExpression = createConstIntExpr(ee);
// RHS swizzle
RefPtr<SwizzleExpr> swizzleExpr = new SwizzleExpr();
- swizzleExpr->Position = rightExpr->Position;
+ swizzleExpr->loc = rightExpr->loc;
swizzleExpr->type.type = rightVecType->elementType;
swizzleExpr->base = rightExpr;
swizzleExpr->elementCount = 1;
@@ -1315,7 +1334,7 @@ struct LoweringVisitor
{
RefPtr<VaryingTupleExpr> resultTuple = new VaryingTupleExpr();
resultTuple->type.type = leftVaryingTuple->type.type;
- resultTuple->Position = leftVaryingTuple->Position;
+ resultTuple->loc = leftVaryingTuple->loc;
SLANG_RELEASE_ASSERT(resultTuple->type.type);
@@ -1344,7 +1363,7 @@ struct LoweringVisitor
RefPtr<VaryingTupleExpr> resultTuple = new VaryingTupleExpr();
resultTuple->type.type = leftVaryingTuple->type.type;
- resultTuple->Position = leftVaryingTuple->Position;
+ resultTuple->loc = leftVaryingTuple->loc;
SLANG_RELEASE_ASSERT(resultTuple->type.type);
@@ -1366,7 +1385,7 @@ struct LoweringVisitor
RefPtr<MemberExpr> rightElemExpr = new MemberExpr();
- rightElemExpr->Position = rightSimpleExpr->Position;
+ rightElemExpr->loc = rightSimpleExpr->loc;
rightElemExpr->type.type = GetType(leftElem.originalFieldDeclRef);
rightElemExpr->declRef = leftElem.originalFieldDeclRef;
rightElemExpr->name = leftElem.originalFieldDeclRef.GetName();
@@ -1392,7 +1411,7 @@ struct LoweringVisitor
RefPtr<VaryingTupleExpr> resultTuple = new VaryingTupleExpr();
resultTuple->type.type = leftSimpleExpr->type.type;
- resultTuple->Position = leftSimpleExpr->Position;
+ resultTuple->loc = leftSimpleExpr->loc;
SLANG_RELEASE_ASSERT(resultTuple->type.type);
@@ -1413,7 +1432,7 @@ struct LoweringVisitor
RefPtr<MemberExpr> leftElemExpr = new MemberExpr();
- leftElemExpr->Position = leftSimpleExpr->Position;
+ leftElemExpr->loc = leftSimpleExpr->loc;
leftElemExpr->type.type = GetType(rightElem.originalFieldDeclRef);
leftElemExpr->declRef = rightElem.originalFieldDeclRef;
leftElemExpr->name = rightElem.originalFieldDeclRef.GetName();
@@ -2038,7 +2057,7 @@ struct LoweringVisitor
{
if (auto varExpr = infixExpr->FunctionExpr.As<VarExpr>())
{
- if (varExpr->name == ",")
+ if (getText(varExpr->name) == ",")
{
// Call to "operator comma"
for (auto aa : infixExpr->Arguments)
@@ -2124,7 +2143,7 @@ struct LoweringVisitor
Stmt* loweredStmt,
Stmt* originalStmt)
{
- loweredStmt->Position = originalStmt->Position;
+ loweredStmt->loc = originalStmt->loc;
loweredStmt->modifiers = originalStmt->modifiers;
}
@@ -2190,7 +2209,9 @@ struct LoweringVisitor
for (auto token : stmt->tokens)
{
if (token.type == TokenType::Identifier)
- doSampleRateInputCheck(token.Content);
+ {
+ doSampleRateInputCheck(token.getName());
+ }
}
loweredStmt->tokens = stmt->tokens;
@@ -2284,7 +2305,7 @@ struct LoweringVisitor
constExpr->integerValue = ii;
RefPtr<VaryingTupleVarDecl> loweredVarDecl = new VaryingTupleVarDecl();
- loweredVarDecl->Position = varDecl->Position;
+ loweredVarDecl->loc = varDecl->loc;
loweredVarDecl->type = varType;
loweredVarDecl->expr = LoweredExpr(constExpr);
@@ -2354,7 +2375,7 @@ struct LoweringVisitor
RefPtr<Expr> expr)
{
RefPtr<ExplicitCastExpr> castExpr = new ExplicitCastExpr();
- castExpr->Position = expr->Position;
+ castExpr->loc = expr->loc;
castExpr->type.type = type;
castExpr->TargetType.type = type;
castExpr->Expression = expr;
@@ -2521,7 +2542,7 @@ struct LoweringVisitor
if (isBuildingStmt)
{
RefPtr<DeclStmt> declStmt = new DeclStmt();
- declStmt->Position = decl->Position;
+ declStmt->loc = decl->loc;
declStmt->decl = decl;
addStmt(declStmt);
}
@@ -2573,9 +2594,13 @@ struct LoweringVisitor
// and ad hoc fashion, but longer term we'll want to do
// something sytematic.
- if (isReservedWord(decl->getName()))
+ auto name = decl->getName();
+ if (isReservedWord(name))
{
- decl->name.Content.append("_");
+ auto nameText = getText(name);
+ nameText.append("_");
+
+ decl->nameAndLoc.name = getName(nameText);
}
}
@@ -2610,8 +2635,8 @@ struct LoweringVisitor
{
registerLoweredDecl(loweredDecl, decl);
- loweredDecl->Position = decl->Position;
- loweredDecl->name = decl->getNameToken();
+ loweredDecl->loc = decl->loc;
+ loweredDecl->nameAndLoc = decl->nameAndLoc;
// Deal with renaming - we shouldn't allow decls with names that are reserved words
ensureDeclHasAValidName(loweredDecl);
@@ -3000,7 +3025,7 @@ struct LoweringVisitor
SLANG_RELEASE_ASSERT(!info.initExpr);
RefPtr<Expr> fieldInitExpr;
- String fieldName = info.name + "_" + dd.GetName();
+ String fieldName = info.name + "_" + getText(dd.GetName());
auto fieldType = GetType(dd);
@@ -3102,7 +3127,7 @@ struct LoweringVisitor
}
RefPtr<VarDeclBase> fieldVarDecl = info.varDeclClass.createInstance();
- fieldVarDecl->name.Content = fieldName;
+ fieldVarDecl->nameAndLoc = NameLoc(getName(fieldName));
fieldVarDecl->type.type = fieldVarType;
addDecl(fieldVarDecl);
@@ -3132,10 +3157,10 @@ struct LoweringVisitor
SyntaxClass<VarDeclBase> varDeclClass,
RefPtr<VarDeclBase> originalVarDecl,
String const& name,
- RefPtr<Type> tupleType,
+ RefPtr<Type> tupleType,
DeclRef<AggTypeDecl> tupleTypeDecl,
TupleTypeModifier* tupleTypeMod,
- RefPtr<Expr> initExpr,
+ RefPtr<Expr> initExpr,
RefPtr<VarLayout> primaryVarLayout,
RefPtr<StructTypeLayout> tupleTypeLayout)
{
@@ -3144,14 +3169,14 @@ struct LoweringVisitor
// We'll need a placeholder declaration to wrap the whole thing up:
RefPtr<TupleVarDecl> tupleDecl = new TupleVarDecl();
- tupleDecl->name.Content = name;
+ tupleDecl->nameAndLoc = NameLoc(getName(name));
// First, if the tuple type had any "ordinary" data,
// then we go ahead and create a declaration for that stuff
if (tupleTypeMod->hasAnyNonTupleFields)
{
RefPtr<VarDeclBase> primaryVarDecl = varDeclClass.createInstance();
- primaryVarDecl->name.Content = name;
+ primaryVarDecl->nameAndLoc.name = getName(name);
primaryVarDecl->type.type = tupleType;
primaryVarDecl->modifiers = originalVarDecl->modifiers;
@@ -3257,7 +3282,7 @@ struct LoweringVisitor
auto tupleDecl = createTupleTypeVarDecls(
loweredDeclClass,
decl,
- decl->getName(),
+ getText(decl->getName()),
loweredType.type,
tupleTypeMod,
loweredInit,
@@ -3276,7 +3301,7 @@ struct LoweringVisitor
auto tupleDecl = createTupleTypeVarDecls(
loweredDeclClass,
decl,
- decl->getName(),
+ getText(decl->getName()),
loweredType.type,
elementTupleTypeMod,
nullptr,
@@ -3357,9 +3382,10 @@ struct LoweringVisitor
}
}
- void doSampleRateInputCheck(String const& name)
+ void doSampleRateInputCheck(Name* name)
{
- if (name == "gl_SampleIndex")
+ auto text = getText(name);
+ if (text == "gl_SampleIndex")
{
setSampleRateFlag();
}
@@ -3616,7 +3642,7 @@ struct LoweringVisitor
RefPtr<Type> type)
{
RefPtr<VarExpr> globalVarRef = new VarExpr();
- globalVarRef->name = name;
+ globalVarRef->name = getName(name);
globalVarRef->type.type = type;
return globalVarRef;
}
@@ -3939,7 +3965,7 @@ struct LoweringVisitor
if (!globalVarExpr)
{
RefPtr<Variable> globalVarDecl = new Variable();
- globalVarDecl->name.Content = info.name;
+ globalVarDecl->nameAndLoc.name = getName(info.name);
globalVarDecl->type.type = type;
ensureDeclHasAValidName(globalVarDecl);
@@ -3998,7 +4024,7 @@ struct LoweringVisitor
RefPtr<VarExpr> globalVarRef = new VarExpr();
- globalVarRef->Position = globalVarDecl->Position;
+ globalVarRef->loc = globalVarDecl->loc;
globalVarRef->type.type = globalVarDecl->type.type;
globalVarRef->declRef = makeDeclRef(globalVarDecl.Ptr());
globalVarRef->name = globalVarDecl->getName();
@@ -4077,7 +4103,7 @@ struct LoweringVisitor
fieldVarChain.varDecl = fieldDeclRef.getDecl();
VaryingParameterInfo fieldInfo = info;
- fieldInfo.name = info.name + "_" + fieldDeclRef.GetName();
+ fieldInfo.name = info.name + "_" + getText(fieldDeclRef.GetName());
fieldInfo.varChain = &fieldVarChain;
// Need to find the layout for the given field...
@@ -4119,6 +4145,7 @@ struct LoweringVisitor
VaryingParameterDirection direction)
{
auto name = originalVarDecl->getName();
+ auto nameText = getText(name);
auto declRef = makeDeclRef(originalVarDecl.Ptr());
VaryingParameterVarChain varChain;
@@ -4126,7 +4153,7 @@ struct LoweringVisitor
varChain.varDecl = originalVarDecl;
VaryingParameterInfo info;
- info.name = name;
+ info.name = nameText;
info.direction = direction;
info.varChain = &varChain;
@@ -4134,11 +4161,11 @@ struct LoweringVisitor
switch (direction)
{
case VaryingParameterDirection::Input:
- info.name = "SLANG_in_" + name;
+ info.name = "SLANG_in_" + nameText;
break;
case VaryingParameterDirection::Output:
- info.name = "SLANG_out_" + name;
+ info.name = "SLANG_out_" + nameText;
break;
}
@@ -4168,7 +4195,7 @@ struct LoweringVisitor
LoweredExpr loweredExpr)
{
RefPtr<VaryingTupleVarDecl> loweredDecl = new VaryingTupleVarDecl();
- loweredDecl->name = originalVarDecl->name;
+ loweredDecl->nameAndLoc = originalVarDecl->nameAndLoc;
loweredDecl->type = loweredType;
loweredDecl->expr = loweredExpr;
@@ -4197,14 +4224,18 @@ struct LoweringVisitor
// First, loer the entry-point function as an ordinary function:
auto loweredEntryPointFunc = visitFunctionDeclBase(entryPointDecl).getDecl()->As<FunctionDeclBase>();
+ auto mainName = getName("main");
+
// Now we will generate a `void main() { ... }` function to call the lowered code.
RefPtr<FuncDecl> mainDecl = new FuncDecl();
mainDecl->ReturnType.type = getSession()->getVoidType();
- mainDecl->name.Content = "main";
+
+
+ mainDecl->nameAndLoc = NameLoc(mainName);
// If the user's entry point was called `main` then rename it here
- if (loweredEntryPointFunc->getName() == "main")
- loweredEntryPointFunc->name.Content = "main_";
+ if (loweredEntryPointFunc->getName() == mainName)
+ loweredEntryPointFunc->nameAndLoc = NameLoc(getName("main_"));
RefPtr<BlockStmt> bodyStmt = new BlockStmt();
bodyStmt->scopeDecl = new ScopeDecl();
@@ -4229,8 +4260,8 @@ struct LoweringVisitor
SLANG_RELEASE_ASSERT(paramLayout);
RefPtr<Variable> localVarDecl = new Variable();
- localVarDecl->Position = paramDecl->Position;
- localVarDecl->name.Content = paramDecl->getName();
+ localVarDecl->loc = paramDecl->loc;
+ localVarDecl->nameAndLoc = paramDecl->getNameAndLoc();
localVarDecl->type = lowerType(paramDecl->type);
ensureDeclHasAValidName(localVarDecl);
@@ -4267,8 +4298,8 @@ struct LoweringVisitor
if (!loweredEntryPointFunc->ReturnType->Equals(getSession()->getVoidType()))
{
resultVarDecl = new Variable();
- resultVarDecl->Position = loweredEntryPointFunc->Position;
- resultVarDecl->name.Content = "main_result";
+ resultVarDecl->loc = loweredEntryPointFunc->loc;
+ resultVarDecl->nameAndLoc = NameLoc(getName("main_result"));
resultVarDecl->type = TypeExp(loweredEntryPointFunc->ReturnType);
ensureDeclHasAValidName(resultVarDecl);
@@ -4335,7 +4366,7 @@ struct LoweringVisitor
if (resultVarDecl)
{
VaryingParameterInfo info;
- info.name = "SLANG_out_" + resultVarDecl->getName();
+ info.name = "SLANG_out_" + getText(resultVarDecl->getName());
info.direction = VaryingParameterDirection::Output;
info.varChain = nullptr;