diff options
author | Luo Xionghu <xionghu.luo@intel.com> | 2015-11-26 13:59:57 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2015-12-09 11:42:09 +0800 |
commit | 6ce7d1faedcc3b6cd433f55ca0535d37a2ce3d9e (patch) | |
tree | 375a11519c1057ec7eb928dd0804d7ef39ed955d | |
parent | 73a3ff2563b44495eaf26fb095cd17bb6ec31b67 (diff) |
gbe: use kernel_arg_base_type to recognize image arguments.
we use string compare function to recognize the image type, but
image types could be defined to other type, so use kernel_arg_base_type
to recognize image arguments.
Signed-off-by: Luo Xionghu <xionghu.luo@intel.com>
Reviewed-by: Yang Rong <rong.r.yang@intel.com>
-rw-r--r-- | backend/src/ir/function.hpp | 15 | ||||
-rw-r--r-- | backend/src/llvm/llvm_gen_backend.cpp | 13 |
2 files changed, 21 insertions, 7 deletions
diff --git a/backend/src/ir/function.hpp b/backend/src/ir/function.hpp index 265fdc39..b7853c17 100644 --- a/backend/src/ir/function.hpp +++ b/backend/src/ir/function.hpp @@ -177,27 +177,28 @@ namespace ir { struct InfoFromLLVM { // All the info about passed by llvm, using -cl-kernel-arg-info uint32_t addrSpace; std::string typeName; + std::string typeBaseName; std::string accessQual; std::string typeQual; std::string argName; // My different from arg->getName() bool isImage1dT() const { - return typeName.compare("image1d_t") == 0; + return typeBaseName.compare("image1d_t") == 0; } bool isImage1dArrayT() const { - return typeName.compare("image1d_array_t") == 0; + return typeBaseName.compare("image1d_array_t") == 0; } bool isImage1dBufferT() const { - return typeName.compare("image1d_buffer_t") == 0; + return typeBaseName.compare("image1d_buffer_t") == 0; } bool isImage2dT() const { - return typeName.compare("image2d_t") == 0; + return typeBaseName.compare("image2d_t") == 0; } bool isImage2dArrayT() const { - return typeName.compare("image2d_array_t") == 0; + return typeBaseName.compare("image2d_array_t") == 0; } bool isImage3dT() const { - return typeName.compare("image3d_t") == 0; + return typeBaseName.compare("image3d_t") == 0; } bool isImageType() const { @@ -206,7 +207,7 @@ namespace ir { } bool isSamplerType() const { - return typeName.compare("sampler_t") == 0; + return typeBaseName.compare("sampler_t") == 0; } }; diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp index 7f84240d..f011e1f9 100644 --- a/backend/src/llvm/llvm_gen_backend.cpp +++ b/backend/src/llvm/llvm_gen_backend.cpp @@ -1164,6 +1164,7 @@ namespace gbe BtiMap.insert(std::make_pair(&v, getNewBti(&v, false))); } MDNode *typeNameNode = NULL; + MDNode *typeBaseNameNode = NULL; MDNode *node = getKernelFunctionMetadata(&F); for(uint j = 0; j < node->getNumOperands() - 1; j++) { MDNode *attrNode = dyn_cast_or_null<MDNode>(node->getOperand(1 + j)); @@ -1173,12 +1174,18 @@ namespace gbe if (attrName->getString() == "kernel_arg_type") { typeNameNode = attrNode; } + if (attrName->getString() == "kernel_arg_base_type") { + typeBaseNameNode = attrNode; + } } unsigned argID = 0; ir::FunctionArgument::InfoFromLLVM llvmInfo; for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I, argID++) { llvmInfo.typeName= (cast<MDString>(typeNameNode->getOperand(1 + argID)))->getString(); + if(typeBaseNameNode) { + llvmInfo.typeBaseName= (cast<MDString>(typeBaseNameNode->getOperand(1 + argID)))->getString(); + } bool isImage = llvmInfo.isImageType(); if (I->getType()->isPointerTy() || isImage) { BtiMap.insert(std::make_pair(I, getNewBti(I, isImage))); @@ -1891,6 +1898,7 @@ namespace gbe ir::FunctionArgument::InfoFromLLVM llvmInfo; MDNode *addrSpaceNode = NULL; MDNode *typeNameNode = NULL; + MDNode *typeBaseNameNode = NULL; MDNode *accessQualNode = NULL; MDNode *typeQualNode = NULL; MDNode *argNameNode = NULL; @@ -1946,6 +1954,8 @@ namespace gbe accessQualNode = attrNode; } else if (attrName->getString() == "kernel_arg_type") { typeNameNode = attrNode; + } else if (attrName->getString() == "kernel_arg_base_type") { + typeBaseNameNode = attrNode; } else if (attrName->getString() == "kernel_arg_type_qual") { typeQualNode = attrNode; } else if (attrName->getString() == "kernel_arg_name") { @@ -2007,6 +2017,9 @@ namespace gbe llvmInfo.addrSpace = (mdconst::extract<ConstantInt>(addrSpaceNode->getOperand(1 + argID)))->getZExtValue(); #endif llvmInfo.typeName = (cast<MDString>(typeNameNode->getOperand(1 + argID)))->getString(); + if(typeBaseNameNode){ + llvmInfo.typeBaseName = (cast<MDString>(typeBaseNameNode->getOperand(1 + argID)))->getString(); + } llvmInfo.accessQual = (cast<MDString>(accessQualNode->getOperand(1 + argID)))->getString(); llvmInfo.typeQual = (cast<MDString>(typeQualNode->getOperand(1 + argID)))->getString(); if(argNameNode){ |