Commit 0aec9b61 by Ben Clayton

SpirvShaderDebugger: Handle template types

The type info is parsed into the corresponding structs, but nothing consumes these just yet. Bug: b/148401179 Change-Id: I0568ea61fe22a5e8be5d6dc07e43868a6e5a35ec Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45352Tested-by: 's avatarBen Clayton <bclayton@google.com> Reviewed-by: 's avatarAntonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
parent 77a09d91
...@@ -113,6 +113,7 @@ struct Object ...@@ -113,6 +113,7 @@ struct Object
Source, Source,
SourceScope, SourceScope,
Value, Value,
TemplateParameter,
// Scopes // Scopes
CompilationUnit, CompilationUnit,
...@@ -124,6 +125,7 @@ struct Object ...@@ -124,6 +125,7 @@ struct Object
VectorType, VectorType,
FunctionType, FunctionType,
CompositeType, CompositeType,
TemplateType,
}; };
using ID = sw::SpirvID<Object>; using ID = sw::SpirvID<Object>;
...@@ -155,6 +157,7 @@ constexpr const char *cstr(Object::Kind k) ...@@ -155,6 +157,7 @@ constexpr const char *cstr(Object::Kind k)
case Object::Kind::Source: return "Source"; case Object::Kind::Source: return "Source";
case Object::Kind::SourceScope: return "SourceScope"; case Object::Kind::SourceScope: return "SourceScope";
case Object::Kind::Value: return "Value"; case Object::Kind::Value: return "Value";
case Object::Kind::TemplateParameter: return "TemplateParameter";
case Object::Kind::CompilationUnit: return "CompilationUnit"; case Object::Kind::CompilationUnit: return "CompilationUnit";
case Object::Kind::LexicalBlock: return "LexicalBlock"; case Object::Kind::LexicalBlock: return "LexicalBlock";
case Object::Kind::BasicType: return "BasicType"; case Object::Kind::BasicType: return "BasicType";
...@@ -162,6 +165,7 @@ constexpr const char *cstr(Object::Kind k) ...@@ -162,6 +165,7 @@ constexpr const char *cstr(Object::Kind k)
case Object::Kind::VectorType: return "VectorType"; case Object::Kind::VectorType: return "VectorType";
case Object::Kind::FunctionType: return "FunctionType"; case Object::Kind::FunctionType: return "FunctionType";
case Object::Kind::CompositeType: return "CompositeType"; case Object::Kind::CompositeType: return "CompositeType";
case Object::Kind::TemplateType: return "TemplateType";
} }
return "<unknown>"; return "<unknown>";
} }
...@@ -234,7 +238,8 @@ struct Type : public Object ...@@ -234,7 +238,8 @@ struct Type : public Object
kind == Kind::ArrayType || kind == Kind::ArrayType ||
kind == Kind::VectorType || kind == Kind::VectorType ||
kind == Kind::FunctionType || kind == Kind::FunctionType ||
kind == Kind::CompositeType; kind == Kind::CompositeType ||
kind == Kind::TemplateType;
} }
}; };
...@@ -292,6 +297,22 @@ struct CompositeType : ObjectImpl<CompositeType, Type, Object::Kind::CompositeTy ...@@ -292,6 +297,22 @@ struct CompositeType : ObjectImpl<CompositeType, Type, Object::Kind::CompositeTy
std::vector<Member *> members; std::vector<Member *> members;
}; };
struct TemplateParameter : ObjectImpl<TemplateParameter, Object, Object::Kind::TemplateParameter>
{
std::string name;
Type *type = nullptr;
uint32_t value = 0;
Source *source = nullptr;
uint32_t line = 0;
uint32_t column = 0;
};
struct TemplateType : ObjectImpl<TemplateType, Type, Object::Kind::TemplateType>
{
Type *target = nullptr; // Class, struct or function.
std::vector<TemplateParameter *> parameters;
};
struct Member : ObjectImpl<Member, Object, Object::Kind::Member> struct Member : ObjectImpl<Member, Object, Object::Kind::Member>
{ {
std::string name; std::string name;
...@@ -980,6 +1001,25 @@ void SpirvShader::Impl::Debugger::process(const SpirvShader *shader, const InsnI ...@@ -980,6 +1001,25 @@ void SpirvShader::Impl::Debugger::process(const SpirvShader *shader, const InsnI
member->flags = insn.word(13); member->flags = insn.word(13);
}); });
break; break;
case OpenCLDebugInfo100DebugTypeTemplate:
defineOrEmit(insn, pass, [&](debug::TemplateType *tpl) {
tpl->target = get(debug::Type::ID(insn.word(5)));
for(size_t i = 6, c = insn.wordCount(); i < c; i++)
{
tpl->parameters.emplace_back(get(debug::TemplateParameter::ID(insn.word(i))));
}
});
break;
case OpenCLDebugInfo100DebugTypeTemplateParameter:
defineOrEmit(insn, pass, [&](debug::TemplateParameter *param) {
param->name = shader->getString(insn.word(5));
param->type = get(debug::Type::ID(insn.word(6)));
param->value = 0; // TODO: Get value from OpConstant if "a template value parameter".
param->source = get(debug::Source::ID(insn.word(8)));
param->line = insn.word(9);
param->column = insn.word(10);
});
break;
case OpenCLDebugInfo100DebugGlobalVariable: case OpenCLDebugInfo100DebugGlobalVariable:
defineOrEmit(insn, pass, [&](debug::GlobalVariable *var) { defineOrEmit(insn, pass, [&](debug::GlobalVariable *var) {
var->name = shader->getString(insn.word(5)); var->name = shader->getString(insn.word(5));
...@@ -1122,8 +1162,6 @@ void SpirvShader::Impl::Debugger::process(const SpirvShader *shader, const InsnI ...@@ -1122,8 +1162,6 @@ void SpirvShader::Impl::Debugger::process(const SpirvShader *shader, const InsnI
case OpenCLDebugInfo100DebugTypeEnum: case OpenCLDebugInfo100DebugTypeEnum:
case OpenCLDebugInfo100DebugTypeInheritance: case OpenCLDebugInfo100DebugTypeInheritance:
case OpenCLDebugInfo100DebugTypePtrToMember: case OpenCLDebugInfo100DebugTypePtrToMember:
case OpenCLDebugInfo100DebugTypeTemplate:
case OpenCLDebugInfo100DebugTypeTemplateParameter:
case OpenCLDebugInfo100DebugTypeTemplateTemplateParameter: case OpenCLDebugInfo100DebugTypeTemplateTemplateParameter:
case OpenCLDebugInfo100DebugTypeTemplateParameterPack: case OpenCLDebugInfo100DebugTypeTemplateParameterPack:
case OpenCLDebugInfo100DebugFunctionDeclaration: case OpenCLDebugInfo100DebugFunctionDeclaration:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment