Explorar o código

[spirv] Handle lowering type of function parameters.

Ehsan Nasiri %!s(int64=6) %!d(string=hai) anos
pai
achega
c2a976e8cb

+ 3 - 0
tools/clang/include/clang/SPIRV/LowerTypeVisitor.h

@@ -32,6 +32,9 @@ public:
 
   // Custom visitor for variables. Variables must have a pointer result-type.
   bool visit(SpirvVariable *);
+  // Custom visitor for function parameters. We use pointer type for function
+  // parameters.
+  bool visit(SpirvFunctionParameter *);
 
   /// The "sink" visit function for all instructions.
   ///

+ 0 - 2
tools/clang/lib/SPIRV/DeclResultIdMapper.cpp

@@ -524,8 +524,6 @@ SpirvInstruction *DeclResultIdMapper::getDeclEvalInfo(const ValueDecl *decl) {
 
 SpirvFunctionParameter *
 DeclResultIdMapper::createFnParam(const ParmVarDecl *param) {
-  // TODO(ehsan): Setting QualType for function parameter. In SPIR-V, this
-  // should be a pointer-to-translated-qualtype (with Function storage class).
   const auto type = getTypeOrFnRetType(param);
   const auto loc = param->getLocation();
   SpirvFunctionParameter *fnParamInstr =

+ 0 - 4
tools/clang/lib/SPIRV/EmitVisitor.cpp

@@ -184,10 +184,6 @@ std::vector<uint32_t> EmitVisitor::takeBinary() {
   result.insert(result.end(), typeConstantBinary.begin(),
                 typeConstantBinary.end());
   result.insert(result.end(), mainBinary.begin(), mainBinary.end());
-
-  for (auto word : result) {
-    printf("%08" PRIx32 "\n", word);
-  }
   return result;
 }
 

+ 11 - 0
tools/clang/lib/SPIRV/LowerTypeVisitor.cpp

@@ -70,6 +70,17 @@ bool LowerTypeVisitor::visit(SpirvVariable *var) {
   return true;
 }
 
+bool LowerTypeVisitor::visit(SpirvFunctionParameter *param) {
+  if (!visitInstruction(param))
+    return false;
+
+  const SpirvType *valueType = param->getResultType();
+  const SpirvType *pointerType =
+      spvContext.getPointerType(valueType, param->getStorageClass());
+  param->setResultType(pointerType);
+  return true;
+}
+
 const SpirvType *LowerTypeVisitor::lowerType(const HybridType *hybrid,
                                              SpirvLayoutRule rule,
                                              SourceLocation loc) {

+ 1 - 0
tools/clang/lib/SPIRV/SpirvBuilder.cpp

@@ -51,6 +51,7 @@ SpirvFunctionParameter *SpirvBuilder::addFnParam(QualType ptrType,
                                                  llvm::StringRef name) {
   assert(function && "found detached parameter");
   auto *param = new (context) SpirvFunctionParameter(ptrType, /*id*/ 0, loc);
+  param->setStorageClass(spv::StorageClass::Function);
   param->setDebugName(name);
   function->addParameter(param);
   return param;