Merge pull request #1634 from greg-lunarg/lines10

Create separate OpSource for each included file when compiling -g
This commit is contained in:
John Kessenich 2018-12-29 17:44:50 -07:00 committed by GitHub
commit 83b2647293
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 131 additions and 104 deletions

View File

@ -1297,6 +1297,10 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, const gl
text.append("#line 1\n"); text.append("#line 1\n");
text.append(glslangIntermediate->getSourceText()); text.append(glslangIntermediate->getSourceText());
builder.setSourceText(text); builder.setSourceText(text);
// Pass name and text for all included files
const std::map<std::string, std::string>& include_txt = glslangIntermediate->getIncludeText();
for (auto iItr = include_txt.begin(); iItr != include_txt.end(); ++iItr)
builder.addInclude(iItr->first, iItr->second);
} }
stdBuiltins = builder.import("GLSL.std.450"); stdBuiltins = builder.import("GLSL.std.450");
if (glslangIntermediate->usingVulkanMemoryModel()) { if (glslangIntermediate->usingVulkanMemoryModel()) {

View File

@ -114,20 +114,8 @@ void Builder::setLine(int lineNum, const char* filename)
currentLine = lineNum; currentLine = lineNum;
currentFile = filename; currentFile = filename;
if (emitOpLines) { if (emitOpLines) {
// If filename previously seen, use its id, else create a string spv::Id strId = getStringId(filename);
// and put it in the map. addLine(strId, currentLine, 0);
auto sItr = stringIds.find(filename);
if (sItr != stringIds.end()) {
addLine(sItr->second, currentLine, 0);
} else {
Instruction* fileString =
new Instruction(getUniqueId(), NoType, OpString);
fileString->addStringOperand(filename);
spv::Id stringId = fileString->getResultId();
strings.push_back(std::unique_ptr<Instruction>(fileString));
addLine(stringId, currentLine, 0);
stringIds[filename] = stringId;
}
} }
} }
} }
@ -2843,7 +2831,8 @@ void Builder::createConditionalBranch(Id condition, Block* thenBlock, Block* els
// OpSource // OpSource
// [OpSourceContinued] // [OpSourceContinued]
// ... // ...
void Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const void Builder::dumpSourceInstructions(const spv::Id fileId, const std::string& text,
std::vector<unsigned int>& out) const
{ {
const int maxWordCount = 0xFFFF; const int maxWordCount = 0xFFFF;
const int opSourceWordCount = 4; const int opSourceWordCount = 4;
@ -2855,14 +2844,14 @@ void Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const
sourceInst.addImmediateOperand(source); sourceInst.addImmediateOperand(source);
sourceInst.addImmediateOperand(sourceVersion); sourceInst.addImmediateOperand(sourceVersion);
// File operand // File operand
if (sourceFileStringId != NoResult) { if (fileId != NoResult) {
sourceInst.addIdOperand(sourceFileStringId); sourceInst.addIdOperand(fileId);
// Source operand // Source operand
if (sourceText.size() > 0) { if (text.size() > 0) {
int nextByte = 0; int nextByte = 0;
std::string subString; std::string subString;
while ((int)sourceText.size() - nextByte > 0) { while ((int)text.size() - nextByte > 0) {
subString = sourceText.substr(nextByte, nonNullBytesPerInstruction); subString = text.substr(nextByte, nonNullBytesPerInstruction);
if (nextByte == 0) { if (nextByte == 0) {
// OpSource // OpSource
sourceInst.addStringOperand(subString.c_str()); sourceInst.addStringOperand(subString.c_str());
@ -2882,6 +2871,14 @@ void Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const
} }
} }
// Dump an OpSource[Continued] sequence for the source and every include file
void Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const
{
dumpSourceInstructions(sourceFileStringId, sourceText, out);
for (auto iItr = includeFiles.begin(); iItr != includeFiles.end(); ++iItr)
dumpSourceInstructions(iItr->first, *iItr->second, out);
}
void Builder::dumpInstructions(std::vector<unsigned int>& out, const std::vector<std::unique_ptr<Instruction> >& instructions) const void Builder::dumpInstructions(std::vector<unsigned int>& out, const std::vector<std::unique_ptr<Instruction> >& instructions) const
{ {
for (int i = 0; i < (int)instructions.size(); ++i) { for (int i = 0; i < (int)instructions.size(); ++i) {

View File

@ -57,6 +57,7 @@
#include <sstream> #include <sstream>
#include <stack> #include <stack>
#include <unordered_map> #include <unordered_map>
#include <map>
namespace spv { namespace spv {
@ -74,20 +75,33 @@ public:
source = lang; source = lang;
sourceVersion = version; sourceVersion = version;
} }
spv::Id getStringId(const std::string& str)
{
auto sItr = stringIds.find(str);
if (sItr != stringIds.end())
return sItr->second;
spv::Id strId = getUniqueId();
Instruction* fileString = new Instruction(strId, NoType, OpString);
const char* file_c_str = str.c_str();
fileString->addStringOperand(file_c_str);
strings.push_back(std::unique_ptr<Instruction>(fileString));
stringIds[file_c_str] = strId;
return strId;
}
void setSourceFile(const std::string& file) void setSourceFile(const std::string& file)
{ {
Instruction* fileString = new Instruction(getUniqueId(), NoType, OpString); sourceFileStringId = getStringId(file);
const char* file_c_str = file.c_str();
fileString->addStringOperand(file_c_str);
sourceFileStringId = fileString->getResultId();
strings.push_back(std::unique_ptr<Instruction>(fileString));
stringIds[file_c_str] = sourceFileStringId;
} }
void setSourceText(const std::string& text) { sourceText = text; } void setSourceText(const std::string& text) { sourceText = text; }
void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); } void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); }
void addModuleProcessed(const std::string& p) { moduleProcesses.push_back(p.c_str()); } void addModuleProcessed(const std::string& p) { moduleProcesses.push_back(p.c_str()); }
void setEmitOpLines() { emitOpLines = true; } void setEmitOpLines() { emitOpLines = true; }
void addExtension(const char* ext) { extensions.insert(ext); } void addExtension(const char* ext) { extensions.insert(ext); }
void addInclude(const std::string& name, const std::string& text)
{
spv::Id incId = getStringId(name);
includeFiles[incId] = &text;
}
Id import(const char*); Id import(const char*);
void setMemoryModel(spv::AddressingModel addr, spv::MemoryModel mem) void setMemoryModel(spv::AddressingModel addr, spv::MemoryModel mem)
{ {
@ -658,6 +672,7 @@ public:
void createAndSetNoPredecessorBlock(const char*); void createAndSetNoPredecessorBlock(const char*);
void createSelectionMerge(Block* mergeBlock, unsigned int control); void createSelectionMerge(Block* mergeBlock, unsigned int control);
void dumpSourceInstructions(std::vector<unsigned int>&) const; void dumpSourceInstructions(std::vector<unsigned int>&) const;
void dumpSourceInstructions(const spv::Id fileId, const std::string& text, std::vector<unsigned int>&) const;
void dumpInstructions(std::vector<unsigned int>&, const std::vector<std::unique_ptr<Instruction> >&) const; void dumpInstructions(std::vector<unsigned int>&, const std::vector<std::unique_ptr<Instruction> >&) const;
void dumpModuleProcesses(std::vector<unsigned int>&) const; void dumpModuleProcesses(std::vector<unsigned int>&) const;
@ -708,6 +723,9 @@ public:
// map from strings to their string ids // map from strings to their string ids
std::unordered_map<std::string, spv::Id> stringIds; std::unordered_map<std::string, spv::Id> stringIds;
// map from include file name ids to their contents
std::map<spv::Id, const std::string*> includeFiles;
// The stream for outputting warnings and errors. // The stream for outputting warnings and errors.
SpvBuildLogger* logger; SpvBuildLogger* logger;
}; // end Builder class }; // end Builder class

View File

@ -4,12 +4,12 @@ hlsl.pp.line3.frag
// Id's are bound by 78 // Id's are bound by 78
Capability Shader Capability Shader
2: ExtInstImport "GLSL.std.450" 3: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Fragment 5 "MainPs" 69 73 EntryPoint Fragment 6 "MainPs" 69 73
ExecutionMode 5 OriginUpperLeft ExecutionMode 6 OriginUpperLeft
1: String "hlsl.pp.line3.frag" 1: String "hlsl.pp.line3.frag"
31: String "./i1.h" 2: String "./i1.h"
Source HLSL 500 1 "// OpModuleProcessed entry-point MainPs Source HLSL 500 1 "// OpModuleProcessed entry-point MainPs
// OpModuleProcessed client vulkan100 // OpModuleProcessed client vulkan100
// OpModuleProcessed target-env vulkan1.0 // OpModuleProcessed target-env vulkan1.0
@ -50,18 +50,20 @@ PS_OUTPUT MainPs ( PS_INPUT i )
} }
" "
Name 5 "MainPs" Source HLSL 500 2 " u = g_nDataIdx;
Name 9 "PS_INPUT" "
MemberName 9(PS_INPUT) 0 "vTextureCoords" Name 6 "MainPs"
Name 12 "PS_OUTPUT" Name 10 "PS_INPUT"
MemberName 12(PS_OUTPUT) 0 "vColor" MemberName 10(PS_INPUT) 0 "vTextureCoords"
Name 15 "@MainPs(struct-PS_INPUT-vf21;" Name 13 "PS_OUTPUT"
Name 14 "i" MemberName 13(PS_OUTPUT) 0 "vColor"
Name 18 "PerViewConstantBuffer_t" Name 16 "@MainPs(struct-PS_INPUT-vf21;"
MemberName 18(PerViewConstantBuffer_t) 0 "g_nDataIdx" Name 15 "i"
MemberName 18(PerViewConstantBuffer_t) 1 "g_nDataIdx2" Name 19 "PerViewConstantBuffer_t"
MemberName 18(PerViewConstantBuffer_t) 2 "g_B" MemberName 19(PerViewConstantBuffer_t) 0 "g_nDataIdx"
Name 20 "" MemberName 19(PerViewConstantBuffer_t) 1 "g_nDataIdx2"
MemberName 19(PerViewConstantBuffer_t) 2 "g_B"
Name 21 ""
Name 33 "u" Name 33 "u"
Name 42 "ps_output" Name 42 "ps_output"
Name 47 "g_tColor" Name 47 "g_tColor"
@ -70,40 +72,40 @@ PS_OUTPUT MainPs ( PS_INPUT i )
Name 69 "i.vTextureCoords" Name 69 "i.vTextureCoords"
Name 73 "@entryPointOutput.vColor" Name 73 "@entryPointOutput.vColor"
Name 74 "param" Name 74 "param"
MemberDecorate 18(PerViewConstantBuffer_t) 0 Offset 0 MemberDecorate 19(PerViewConstantBuffer_t) 0 Offset 0
MemberDecorate 18(PerViewConstantBuffer_t) 1 Offset 4 MemberDecorate 19(PerViewConstantBuffer_t) 1 Offset 4
MemberDecorate 18(PerViewConstantBuffer_t) 2 Offset 8 MemberDecorate 19(PerViewConstantBuffer_t) 2 Offset 8
Decorate 18(PerViewConstantBuffer_t) Block Decorate 19(PerViewConstantBuffer_t) Block
Decorate 47(g_tColor) DescriptorSet 0 Decorate 47(g_tColor) DescriptorSet 0
Decorate 47(g_tColor) Binding 0 Decorate 47(g_tColor) Binding 0
Decorate 54(g_sAniso) DescriptorSet 0 Decorate 54(g_sAniso) DescriptorSet 0
Decorate 54(g_sAniso) Binding 0 Decorate 54(g_sAniso) Binding 0
Decorate 69(i.vTextureCoords) Location 0 Decorate 69(i.vTextureCoords) Location 0
Decorate 73(@entryPointOutput.vColor) Location 0 Decorate 73(@entryPointOutput.vColor) Location 0
3: TypeVoid 4: TypeVoid
4: TypeFunction 3 5: TypeFunction 4
7: TypeFloat 32 8: TypeFloat 32
8: TypeVector 7(float) 2 9: TypeVector 8(float) 2
9(PS_INPUT): TypeStruct 8(fvec2) 10(PS_INPUT): TypeStruct 9(fvec2)
10: TypePointer Function 9(PS_INPUT) 11: TypePointer Function 10(PS_INPUT)
11: TypeVector 7(float) 4 12: TypeVector 8(float) 4
12(PS_OUTPUT): TypeStruct 11(fvec4) 13(PS_OUTPUT): TypeStruct 12(fvec4)
13: TypeFunction 12(PS_OUTPUT) 10(ptr) 14: TypeFunction 13(PS_OUTPUT) 11(ptr)
17: TypeInt 32 0 18: TypeInt 32 0
18(PerViewConstantBuffer_t): TypeStruct 17(int) 17(int) 17(int) 19(PerViewConstantBuffer_t): TypeStruct 18(int) 18(int) 18(int)
19: TypePointer PushConstant 18(PerViewConstantBuffer_t) 20: TypePointer PushConstant 19(PerViewConstantBuffer_t)
20: 19(ptr) Variable PushConstant 21: 20(ptr) Variable PushConstant
21: TypeInt 32 1 22: TypeInt 32 1
22: 21(int) Constant 2 23: 22(int) Constant 2
23: TypePointer PushConstant 17(int) 24: TypePointer PushConstant 18(int)
26: TypeBool 27: TypeBool
27: 17(int) Constant 0 28: 18(int) Constant 0
32: TypePointer Function 17(int) 32: TypePointer Function 18(int)
34: 21(int) Constant 0 34: 22(int) Constant 0
38: 21(int) Constant 1 38: 22(int) Constant 1
41: TypePointer Function 12(PS_OUTPUT) 41: TypePointer Function 13(PS_OUTPUT)
43: TypeImage 7(float) 2D sampled format:Unknown 43: TypeImage 8(float) 2D sampled format:Unknown
44: 17(int) Constant 128 44: 18(int) Constant 128
45: TypeArray 43 44 45: TypeArray 43 44
46: TypePointer UniformConstant 45 46: TypePointer UniformConstant 45
47(g_tColor): 46(ptr) Variable UniformConstant 47(g_tColor): 46(ptr) Variable UniformConstant
@ -112,63 +114,63 @@ PS_OUTPUT MainPs ( PS_INPUT i )
53: TypePointer UniformConstant 52 53: TypePointer UniformConstant 52
54(g_sAniso): 53(ptr) Variable UniformConstant 54(g_sAniso): 53(ptr) Variable UniformConstant
56: TypeSampledImage 43 56: TypeSampledImage 43
58: TypePointer Function 8(fvec2) 58: TypePointer Function 9(fvec2)
62: TypePointer Function 11(fvec4) 62: TypePointer Function 12(fvec4)
68: TypePointer Input 8(fvec2) 68: TypePointer Input 9(fvec2)
69(i.vTextureCoords): 68(ptr) Variable Input 69(i.vTextureCoords): 68(ptr) Variable Input
72: TypePointer Output 11(fvec4) 72: TypePointer Output 12(fvec4)
73(@entryPointOutput.vColor): 72(ptr) Variable Output 73(@entryPointOutput.vColor): 72(ptr) Variable Output
5(MainPs): 3 Function None 4 6(MainPs): 4 Function None 5
6: Label 7: Label
67(i): 10(ptr) Variable Function 67(i): 11(ptr) Variable Function
74(param): 10(ptr) Variable Function 74(param): 11(ptr) Variable Function
Line 1 23 0 Line 1 23 0
70: 8(fvec2) Load 69(i.vTextureCoords) 70: 9(fvec2) Load 69(i.vTextureCoords)
71: 58(ptr) AccessChain 67(i) 34 71: 58(ptr) AccessChain 67(i) 34
Store 71 70 Store 71 70
75: 9(PS_INPUT) Load 67(i) 75:10(PS_INPUT) Load 67(i)
Store 74(param) 75 Store 74(param) 75
76:12(PS_OUTPUT) FunctionCall 15(@MainPs(struct-PS_INPUT-vf21;) 74(param) 76:13(PS_OUTPUT) FunctionCall 16(@MainPs(struct-PS_INPUT-vf21;) 74(param)
77: 11(fvec4) CompositeExtract 76 0 77: 12(fvec4) CompositeExtract 76 0
Store 73(@entryPointOutput.vColor) 77 Store 73(@entryPointOutput.vColor) 77
Return Return
FunctionEnd FunctionEnd
15(@MainPs(struct-PS_INPUT-vf21;):12(PS_OUTPUT) Function None 13 16(@MainPs(struct-PS_INPUT-vf21;):13(PS_OUTPUT) Function None 14
14(i): 10(ptr) FunctionParameter 15(i): 11(ptr) FunctionParameter
16: Label 17: Label
33(u): 32(ptr) Variable Function 33(u): 32(ptr) Variable Function
42(ps_output): 41(ptr) Variable Function 42(ps_output): 41(ptr) Variable Function
Line 1 27 0 Line 1 27 0
24: 23(ptr) AccessChain 20 22 25: 24(ptr) AccessChain 21 23
25: 17(int) Load 24 26: 18(int) Load 25
28: 26(bool) INotEqual 25 27 29: 27(bool) INotEqual 26 28
SelectionMerge 30 None SelectionMerge 31 None
BranchConditional 28 29 37 BranchConditional 29 30 37
29: Label 30: Label
Line 31 1 0 Line 2 1 0
35: 23(ptr) AccessChain 20 34 35: 24(ptr) AccessChain 21 34
36: 17(int) Load 35 36: 18(int) Load 35
Store 33(u) 36 Store 33(u) 36
Branch 30 Branch 31
37: Label 37: Label
Line 1 30 0 Line 1 30 0
39: 23(ptr) AccessChain 20 38 39: 24(ptr) AccessChain 21 38
40: 17(int) Load 39 40: 18(int) Load 39
Store 33(u) 40 Store 33(u) 40
Branch 30 Branch 31
30: Label 31: Label
Line 1 31 0 Line 1 31 0
48: 17(int) Load 33(u) 48: 18(int) Load 33(u)
50: 49(ptr) AccessChain 47(g_tColor) 48 50: 49(ptr) AccessChain 47(g_tColor) 48
51: 43 Load 50 51: 43 Load 50
55: 52 Load 54(g_sAniso) 55: 52 Load 54(g_sAniso)
57: 56 SampledImage 51 55 57: 56 SampledImage 51 55
59: 58(ptr) AccessChain 14(i) 34 59: 58(ptr) AccessChain 15(i) 34
60: 8(fvec2) Load 59 60: 9(fvec2) Load 59
61: 11(fvec4) ImageSampleImplicitLod 57 60 61: 12(fvec4) ImageSampleImplicitLod 57 60
63: 62(ptr) AccessChain 42(ps_output) 34 63: 62(ptr) AccessChain 42(ps_output) 34
Store 63 61 Store 63 61
Line 1 32 0 Line 1 32 0
64:12(PS_OUTPUT) Load 42(ps_output) 64:13(PS_OUTPUT) Load 42(ps_output)
ReturnValue 64 ReturnValue 64
FunctionEnd FunctionEnd

View File

@ -668,6 +668,8 @@ public:
const std::string& getSourceFile() const { return sourceFile; } const std::string& getSourceFile() const { return sourceFile; }
void addSourceText(const char* text) { sourceText = sourceText + text; } void addSourceText(const char* text) { sourceText = sourceText + text; }
const std::string& getSourceText() const { return sourceText; } const std::string& getSourceText() const { return sourceText; }
const std::map<std::string, std::string>& getIncludeText() const { return includeText; }
void addIncludeText(const char* name, const char* text, size_t len) { includeText[name].assign(text,len); }
void addProcesses(const std::vector<std::string>& p) void addProcesses(const std::vector<std::string>& p)
{ {
for (int i = 0; i < (int)p.size(); ++i) for (int i = 0; i < (int)p.size(); ++i)
@ -815,6 +817,9 @@ protected:
std::string sourceFile; std::string sourceFile;
std::string sourceText; std::string sourceText;
// Included text. First string is a name, second is the included text
std::map<std::string, std::string> includeText;
// for OpModuleProcessed, or equivalent // for OpModuleProcessed, or equivalent
TProcesses processes; TProcesses processes;

View File

@ -653,6 +653,7 @@ int TPpContext::CPPinclude(TPpToken* ppToken)
epilogue << (res->headerData[res->headerLength - 1] == '\n'? "" : "\n") << epilogue << (res->headerData[res->headerLength - 1] == '\n'? "" : "\n") <<
"#line " << directiveLoc.line + forNextLine << " " << directiveLoc.getStringNameOrNum() << "\n"; "#line " << directiveLoc.line + forNextLine << " " << directiveLoc.getStringNameOrNum() << "\n";
pushInput(new TokenizableIncludeFile(directiveLoc, prologue.str(), res, epilogue.str(), this)); pushInput(new TokenizableIncludeFile(directiveLoc, prologue.str(), res, epilogue.str(), this));
parseContext.intermediate.addIncludeText(res->headerName.c_str(), res->headerData, res->headerLength);
// There's no "current" location anymore. // There's no "current" location anymore.
parseContext.setCurrentColumn(0); parseContext.setCurrentColumn(0);
} else { } else {