Skip to content

Commit

Permalink
Merge pull request #1753 from pixeljetstream/ckubischnv_dumpbuiltins
Browse files Browse the repository at this point in the history
introduce ability to dump builtin symbol table
  • Loading branch information
johnkslang authored Apr 17, 2019
2 parents 0527c9d + 8331801 commit 805b09f
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 19 deletions.
6 changes: 6 additions & 0 deletions StandAlone/StandAlone.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ const char* shaderStageName = nullptr;
const char* variableName = nullptr;
bool HlslEnable16BitTypes = false;
bool HlslDX9compatible = false;
bool DumpBuiltinSymbols = false;
std::vector<std::string> IncludeDirectoryList;

// Source environment
Expand Down Expand Up @@ -494,6 +495,8 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
Error("--client expects vulkan100 or opengl100");
}
bumpArg();
} else if (lowerword == "dump-builtin-symbols") {
DumpBuiltinSymbols = true;
} else if (lowerword == "entry-point") {
entryPointName = argv[1];
if (argc <= 1)
Expand Down Expand Up @@ -833,6 +836,8 @@ void SetMessageOptions(EShMessages& messages)
messages = (EShMessages)(messages | EShMsgHlslLegalization);
if (HlslDX9compatible)
messages = (EShMessages)(messages | EShMsgHlslDX9Compatible);
if (DumpBuiltinSymbols)
messages = (EShMessages)(messages | EShMsgBuiltinSymbolTable);
}

//
Expand Down Expand Up @@ -1520,6 +1525,7 @@ void usage()
" --auto-map-locations | --aml automatically locate input/output lacking\n"
" 'location' (fragile, not cross stage)\n"
" --client {vulkan<ver>|opengl<ver>} see -V and -G\n"
" --dump-builtin-symbols prints builtin symbol table prior each compile\n"
" -dumpfullversion | -dumpversion print bare major.minor.patchlevel\n"
" --flatten-uniform-arrays | --fua flatten uniform texture/sampler arrays to\n"
" scalars\n"
Expand Down
2 changes: 1 addition & 1 deletion glslang/Include/Types.h
Original file line number Diff line number Diff line change
Expand Up @@ -2018,7 +2018,7 @@ class TType {
}

// Add struct/block members
if (isStruct()) {
if (isStruct() && structure) {
appendStr("{");
for (size_t i = 0; i < structure->size(); ++i) {
if (! (*structure)[i].type->hiddenMember()) {
Expand Down
15 changes: 15 additions & 0 deletions glslang/MachineIndependent/ShaderLang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,8 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS
infoSink, commonTable, symbolTables);
#endif



return true;
}

Expand Down Expand Up @@ -474,6 +476,16 @@ void SetupBuiltinSymbolTable(int version, EProfile profile, const SpvVersion& sp
glslang::ReleaseGlobalLock();
}

// Function to Print all builtins
void DumpBuiltinSymbolTable(TInfoSink& infoSink, const TSymbolTable& symbolTable)
{
infoSink.debug << "BuiltinSymbolTable {\n";

symbolTable.dump(infoSink, true);

infoSink.debug << "}\n";
}

// Return true if the shader was correctly specified for version/profile/stage.
bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNotFirst, int defaultVersion,
EShSource source, int& version, EProfile& profile, const SpvVersion& spvVersion)
Expand Down Expand Up @@ -905,6 +917,9 @@ bool ProcessDeferred(
return false;
}

if (messages & EShMsgBuiltinSymbolTable)
DumpBuiltinSymbolTable(compiler->infoSink, *symbolTable);

//
// Now we can process the full shader under proper symbols and rules.
//
Expand Down
64 changes: 52 additions & 12 deletions glslang/MachineIndependent/SymbolTable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,37 +176,77 @@ void TType::buildMangledName(TString& mangledName) const
// Dump functions.
//

void TVariable::dump(TInfoSink& infoSink) const
void TSymbol::dumpExtensions(TInfoSink& infoSink) const
{
infoSink.debug << getName().c_str() << ": " << type.getStorageQualifierString() << " " << type.getBasicTypeString();
if (type.isArray()) {
infoSink.debug << "[0]";
int numExtensions = getNumExtensions();
if (numExtensions) {
infoSink.debug << " <";

for (int i = 0; i < numExtensions; i++)
infoSink.debug << getExtensions()[i] << ",";

infoSink.debug << ">";
}
}

void TVariable::dump(TInfoSink& infoSink, bool complete) const
{
if (complete) {
infoSink.debug << getName().c_str() << ": " << type.getCompleteString();
dumpExtensions(infoSink);
} else {
infoSink.debug << getName().c_str() << ": " << type.getStorageQualifierString() << " "
<< type.getBasicTypeString();

if (type.isArray())
infoSink.debug << "[0]";
}

infoSink.debug << "\n";
}

void TFunction::dump(TInfoSink& infoSink) const
void TFunction::dump(TInfoSink& infoSink, bool complete) const
{
infoSink.debug << getName().c_str() << ": " << returnType.getBasicTypeString() << " " << getMangledName().c_str() << "\n";
if (complete) {
infoSink.debug << getName().c_str() << ": " << returnType.getCompleteString() << " " << getName().c_str()
<< "(";

int numParams = getParamCount();
for (int i = 0; i < numParams; i++) {
const TParameter &param = parameters[i];
infoSink.debug << param.type->getCompleteString() << " "
<< (param.type->isStruct() ? "of " + param.type->getTypeName() + " " : "")
<< (param.name ? *param.name : "") << (i < numParams - 1 ? "," : "");
}

infoSink.debug << ")";
dumpExtensions(infoSink);
} else {
infoSink.debug << getName().c_str() << ": " << returnType.getBasicTypeString() << " "
<< getMangledName().c_str() << "n";
}

infoSink.debug << "\n";
}

void TAnonMember::dump(TInfoSink& TInfoSink) const
void TAnonMember::dump(TInfoSink& TInfoSink, bool complete) const
{
TInfoSink.debug << "anonymous member " << getMemberNumber() << " of " << getAnonContainer().getName().c_str() << "\n";
TInfoSink.debug << "anonymous member " << getMemberNumber() << " of " << getAnonContainer().getName().c_str()
<< "\n";
}

void TSymbolTableLevel::dump(TInfoSink &infoSink) const
void TSymbolTableLevel::dump(TInfoSink& infoSink, bool complete) const
{
tLevel::const_iterator it;
for (it = level.begin(); it != level.end(); ++it)
(*it).second->dump(infoSink);
(*it).second->dump(infoSink, complete);
}

void TSymbolTable::dump(TInfoSink &infoSink) const
void TSymbolTable::dump(TInfoSink& infoSink, bool complete) const
{
for (int level = currentLevel(); level >= 0; --level) {
infoSink.debug << "LEVEL " << level << "\n";
table[level]->dump(infoSink);
table[level]->dump(infoSink, complete);
}
}

Expand Down
13 changes: 7 additions & 6 deletions glslang/MachineIndependent/SymbolTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ class TSymbol {
}
virtual int getNumExtensions() const { return extensions == nullptr ? 0 : (int)extensions->size(); }
virtual const char** getExtensions() const { return extensions->data(); }
virtual void dump(TInfoSink &infoSink) const = 0;
virtual void dump(TInfoSink& infoSink, bool complete = false) const = 0;
void dumpExtensions(TInfoSink& infoSink) const;

virtual bool isReadOnly() const { return ! writable; }
virtual void makeReadOnly() { writable = false; }
Expand Down Expand Up @@ -192,7 +193,7 @@ class TVariable : public TSymbol {
}
virtual const char** getMemberExtensions(int member) const { return (*memberExtensions)[member].data(); }

virtual void dump(TInfoSink &infoSink) const;
virtual void dump(TInfoSink& infoSink, bool complete = false) const;

protected:
explicit TVariable(const TVariable&);
Expand Down Expand Up @@ -313,7 +314,7 @@ class TFunction : public TSymbol {
virtual TParameter& operator[](int i) { assert(writable); return parameters[i]; }
virtual const TParameter& operator[](int i) const { return parameters[i]; }

virtual void dump(TInfoSink &infoSink) const override;
virtual void dump(TInfoSink& infoSink, bool complete = false) const override;

protected:
explicit TFunction(const TFunction&);
Expand Down Expand Up @@ -373,7 +374,7 @@ class TAnonMember : public TSymbol {
virtual const char** getExtensions() const override { return anonContainer.getMemberExtensions(memberNumber); }

virtual int getAnonId() const { return anonId; }
virtual void dump(TInfoSink &infoSink) const override;
virtual void dump(TInfoSink& infoSink, bool complete = false) const override;

protected:
explicit TAnonMember(const TAnonMember&);
Expand Down Expand Up @@ -541,7 +542,7 @@ class TSymbolTableLevel {

void relateToOperator(const char* name, TOperator op);
void setFunctionExtensions(const char* name, int num, const char* const extensions[]);
void dump(TInfoSink &infoSink) const;
void dump(TInfoSink& infoSink, bool complete = false) const;
TSymbolTableLevel* clone() const;
void readOnly();

Expand Down Expand Up @@ -842,7 +843,7 @@ class TSymbolTable {
}

int getMaxSymbolId() { return uniqueId; }
void dump(TInfoSink &infoSink) const;
void dump(TInfoSink& infoSink, bool complete = false) const;
void copyTable(const TSymbolTable& copyOf);

void setPreviousDefaultPrecisions(TPrecisionQualifier *p) { table[currentLevel()]->setPreviousDefaultPrecisions(p); }
Expand Down
1 change: 1 addition & 0 deletions glslang/Public/ShaderLang.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ enum EShMessages {
EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (right now only for samplers)
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
};

//
Expand Down

0 comments on commit 805b09f

Please sign in to comment.