summaryrefslogtreecommitdiffstats
path: root/source/slang/emit.cpp
diff options
context:
space:
mode:
authorTim Foley <tim.foley.is@gmail.com>2017-08-10 15:25:04 -0700
committerGitHub <noreply@github.com>2017-08-10 15:25:04 -0700
commitdb4079f7e3635a6a61b8725643b1d7ecf68b97d8 (patch)
tree224c16ad374c5ed533a497beeb75753e7ce2d771 /source/slang/emit.cpp
parent6e4830f4d74adef0a47c6503d84dc114240fafa3 (diff)
parenta5a436c4783fb75a0d089a6483219c06db91f593 (diff)
Merge pull request #156 from tfoleyNV/source-file-cleanup
Make source location lightweight
Diffstat (limited to 'source/slang/emit.cpp')
-rw-r--r--source/slang/emit.cpp125
1 files changed, 68 insertions, 57 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp
index 72632260f..2a5f40787 100644
--- a/source/slang/emit.cpp
+++ b/source/slang/emit.cpp
@@ -58,8 +58,8 @@ struct SharedEmitContext
StringBuilder sb;
// Current source position for tracking purposes...
- CodePosition loc;
- CodePosition nextSourceLocation;
+ HumaneSourceLoc loc;
+ HumaneSourceLoc nextSourceLocation;
bool needToUpdateSourceLocation;
// For GLSL output, we can't emit traidtional `#line` directives
@@ -344,7 +344,7 @@ struct EDeclarator
// Used for `Flavor::Name`
String name;
- CodePosition loc;
+ SourceLoc loc;
// Used for `Flavor::Array`
IntVal* elementCount;
@@ -407,7 +407,7 @@ struct EmitVisitor
// Update our logical position
// TODO(tfoley): Need to make "corelib" not use `int` for pointer-sized things...
auto len = int(textEnd - textBegin);
- context->shared->loc.Col += len;
+ context->shared->loc.column += len;
}
void Emit(char const* textBegin, char const* textEnd)
@@ -431,8 +431,8 @@ struct EmitVisitor
// At the end of a line, we need to update our tracking
// information on code positions
emitTextSpan(spanBegin, spanEnd);
- context->shared->loc.Line++;
- context->shared->loc.Col = 1;
+ context->shared->loc.line++;
+ context->shared->loc.column = 1;
// Start a new span for emit purposes
spanBegin = spanEnd;
@@ -452,7 +452,7 @@ struct EmitVisitor
void emitName(
String const& inName,
- CodePosition const& loc)
+ SourceLoc const& loc)
{
String name = inName;
@@ -467,7 +467,7 @@ struct EmitVisitor
void emitName(String const& name)
{
- emitName(name, CodePosition());
+ emitName(name, SourceLoc());
}
void Emit(IntegerLiteralValue value)
@@ -504,12 +504,12 @@ struct EmitVisitor
// Emit a `#line` directive to the output.
// Doesn't udpate state of source-location tracking.
void emitLineDirective(
- CodePosition const& sourceLocation)
+ HumaneSourceLoc const& sourceLocation)
{
emitRawText("\n#line ");
char buffer[16];
- sprintf(buffer, "%d", sourceLocation.Line);
+ sprintf(buffer, "%d", sourceLocation.line);
emitRawText(buffer);
emitRawText(" ");
@@ -547,7 +547,7 @@ struct EmitVisitor
if(shouldUseGLSLStyleLineDirective)
{
- auto path = sourceLocation.FileName;
+ auto path = sourceLocation.getPath();
// GLSL doesn't support the traditional form of a `#line` directive without
// an extension. Rather than depend on that extension we will output
@@ -578,7 +578,7 @@ struct EmitVisitor
// in a module that tracks source files.
emitRawText("\"");
- for(auto c : sourceLocation.FileName)
+ for(auto c : sourceLocation.getPath())
{
char charBuffer[] = { c, 0 };
switch(c)
@@ -607,17 +607,18 @@ struct EmitVisitor
// ensure that source location tracking information
// is correct based on the directive we just output.
void emitLineDirectiveAndUpdateSourceLocation(
- CodePosition const& sourceLocation)
+ HumaneSourceLoc const& sourceLocation)
{
emitLineDirective(sourceLocation);
-
- context->shared->loc.FileName = sourceLocation.FileName;
- context->shared->loc.Line = sourceLocation.Line;
- context->shared->loc.Col = 1;
+
+ HumaneSourceLoc newLoc = sourceLocation;
+ newLoc.column = 1;
+
+ context->shared->loc = newLoc;
}
void emitLineDirectiveIfNeeded(
- CodePosition const& sourceLocation)
+ HumaneSourceLoc const& sourceLocation)
{
// Don't do any of this work if the user has requested that we
// not emit line directives.
@@ -626,31 +627,31 @@ struct EmitVisitor
return;
// Ignore invalid source locations
- if(sourceLocation.Line <= 0)
+ if(sourceLocation.line <= 0)
return;
// If we are currently emitting code at a source location with
// a differnet file or line, *or* if the source location is
// somehow later on the line than what we want to emit,
// then we need to emit a new `#line` directive.
- if(sourceLocation.FileName != context->shared->loc.FileName
- || sourceLocation.Line != context->shared->loc.Line
- || sourceLocation.Col < context->shared->loc.Col)
+ if(sourceLocation.path != context->shared->loc.path
+ || sourceLocation.line != context->shared->loc.line
+ || sourceLocation.column < context->shared->loc.column)
{
// Special case: if we are in the same file, and within a small number
// of lines of the target location, then go ahead and output newlines
// to get us caught up.
enum { kSmallLineCount = 3 };
- auto lineDiff = sourceLocation.Line - context->shared->loc.Line;
- if(sourceLocation.FileName == context->shared->loc.FileName
- && sourceLocation.Line > context->shared->loc.Line
+ auto lineDiff = sourceLocation.line - context->shared->loc.line;
+ if(sourceLocation.path == context->shared->loc.path
+ && sourceLocation.line > context->shared->loc.line
&& lineDiff <= kSmallLineCount)
{
for(int ii = 0; ii < lineDiff; ++ii )
{
Emit("\n");
}
- SLANG_RELEASE_ASSERT(sourceLocation.Line == context->shared->loc.Line);
+ SLANG_RELEASE_ASSERT(sourceLocation.line == context->shared->loc.line);
}
else
{
@@ -666,28 +667,39 @@ struct EmitVisitor
// came in as spaces or tabs, so there is necessarily going to be
// coupling between how the downstream compiler counts columns,
// and how we do.
- if(sourceLocation.Col > context->shared->loc.Col)
+ if(sourceLocation.column > context->shared->loc.column)
{
- int delta = sourceLocation.Col - context->shared->loc.Col;
+ int delta = sourceLocation.column - context->shared->loc.column;
for( int ii = 0; ii < delta; ++ii )
{
emitRawText(" ");
}
- context->shared->loc.Col = sourceLocation.Col;
+ context->shared->loc.column = sourceLocation.column;
}
}
void advanceToSourceLocation(
- CodePosition const& sourceLocation)
+ HumaneSourceLoc const& sourceLocation)
{
// Skip invalid locations
- if(sourceLocation.Line <= 0)
+ if(sourceLocation.line <= 0)
return;
context->shared->needToUpdateSourceLocation = true;
context->shared->nextSourceLocation = sourceLocation;
}
+ SourceManager* getSourceManager()
+ {
+ return context->shared->entryPoint->compileRequest->getSourceManager();
+ }
+
+ void advanceToSourceLocation(
+ SourceLoc const& sourceLocation)
+ {
+ advanceToSourceLocation(getSourceManager()->getHumaneLoc(sourceLocation));
+ }
+
void flushSourceLocationChange()
{
if(!context->shared->needToUpdateSourceLocation)
@@ -707,9 +719,8 @@ struct EmitVisitor
if (mode == LineDirectiveMode::None)
return;
-
if ((mode == LineDirectiveMode::None)
- || token.Position.FileName.Length() == 0)
+ || !token.Position.isValid())
{
// If we don't have the original position info, or we are in the
// mode where the user didn't want line directives, we need to play
@@ -755,7 +766,7 @@ struct EmitVisitor
}
else
{
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unknown type of integer constant value");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unknown type of integer constant value");
}
}
@@ -787,7 +798,7 @@ struct EmitVisitor
break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unknown declarator flavor");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unknown declarator flavor");
break;
}
}
@@ -808,7 +819,7 @@ struct EmitVisitor
case BaseType::Bool: Emit("b"); break;
case BaseType::Double: Emit("d"); break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled GLSL type prefix");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled GLSL type prefix");
break;
}
}
@@ -822,7 +833,7 @@ struct EmitVisitor
}
else
{
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled GLSL type prefix");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled GLSL type prefix");
}
}
@@ -851,7 +862,7 @@ struct EmitVisitor
break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled resource access mode");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled resource access mode");
break;
}
@@ -863,7 +874,7 @@ struct EmitVisitor
case TextureType::ShapeCube: Emit("TextureCube"); break;
case TextureType::ShapeBuffer: Emit("Buffer"); break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled resource shape");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled resource shape");
break;
}
@@ -895,7 +906,7 @@ struct EmitVisitor
case TextureType::ShapeCube: Emit("Cube"); break;
case TextureType::ShapeBuffer: Emit("Buffer"); break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled resource shape");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled resource shape");
break;
}
@@ -941,7 +952,7 @@ struct EmitVisitor
break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled code generation target");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled code generation target");
break;
}
}
@@ -956,7 +967,7 @@ struct EmitVisitor
break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "this target should see combined texture-sampler types");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "this target should see combined texture-sampler types");
break;
}
}
@@ -975,7 +986,7 @@ struct EmitVisitor
break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "this target should see GLSL image types");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "this target should see GLSL image types");
break;
}
}
@@ -1026,7 +1037,7 @@ struct EmitVisitor
case BaseType::Bool: Emit("bool"); break;
case BaseType::Double: Emit("double"); break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled scalar type");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled scalar type");
break;
}
@@ -1058,7 +1069,7 @@ struct EmitVisitor
break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled code generation target");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled code generation target");
break;
}
@@ -1096,7 +1107,7 @@ struct EmitVisitor
break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled code generation target");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled code generation target");
break;
}
@@ -1136,7 +1147,7 @@ struct EmitVisitor
case SamplerStateType::Flavor::SamplerState: Emit("SamplerState"); break;
case SamplerStateType::Flavor::SamplerComparisonState: Emit("SamplerComparisonState"); break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled sampler state flavor");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled sampler state flavor");
break;
}
break;
@@ -1147,7 +1158,7 @@ struct EmitVisitor
case SamplerStateType::Flavor::SamplerState: Emit("sampler"); break;
case SamplerStateType::Flavor::SamplerComparisonState: Emit("samplerShadow"); break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled sampler state flavor");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled sampler state flavor");
break;
}
break;
@@ -1187,9 +1198,9 @@ struct EmitVisitor
void EmitType(
RefPtr<Type> type,
- CodePosition const& typeLoc,
+ SourceLoc const& typeLoc,
String const& name,
- CodePosition const& nameLoc)
+ SourceLoc const& nameLoc)
{
advanceToSourceLocation(typeLoc);
@@ -1203,7 +1214,7 @@ struct EmitVisitor
void EmitType(RefPtr<Type> type, Token const& nameToken)
{
- EmitType(type, CodePosition(), nameToken.Content, nameToken.Position);
+ EmitType(type, SourceLoc(), nameToken.Content, nameToken.Position);
}
void EmitType(RefPtr<Type> type)
@@ -1232,13 +1243,13 @@ struct EmitVisitor
}
}
- void EmitType(TypeExp const& typeExp, String const& name, CodePosition const& nameLoc)
+ void EmitType(TypeExp const& typeExp, String const& name, SourceLoc const& nameLoc)
{
if (!typeExp.type || typeExp.type->As<ErrorType>())
{
if (!typeExp.exp)
{
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unresolved type expression should have expression part");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unresolved type expression should have expression part");
}
EDeclarator nameDeclarator;
@@ -1251,7 +1262,7 @@ struct EmitVisitor
else
{
EmitType(typeExp.type,
- typeExp.exp ? typeExp.exp->Position : CodePosition(),
+ typeExp.exp ? typeExp.exp->Position : SourceLoc(),
name, nameLoc);
}
}
@@ -1263,7 +1274,7 @@ struct EmitVisitor
void EmitType(TypeExp const& typeExp, String const& name)
{
- EmitType(typeExp, name, CodePosition());
+ EmitType(typeExp, name, SourceLoc());
}
void emitTypeExp(TypeExp const& typeExp)
@@ -1463,7 +1474,7 @@ struct EmitVisitor
switch(context->shared->target)
{
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled code generation target");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled code generation target");
return false;
case CodeGenTarget::GLSL: return targetName == "glsl";
@@ -3203,7 +3214,7 @@ struct EmitVisitor
Emit("s");
break;
default:
- SLANG_DIAGNOSE_UNEXPECTED(getSink(), CodePosition(), "unhandled HLSL register type");
+ SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled HLSL register type");
break;
}
Emit(info.index);