clover: fix llvm 3.5 build error

There is no MDOperand in llvm 3.5.

v2: Check if kernel metadata is present to avoid crash (EdB).
v3: Second attempt to avoid crash: switch off metadata query for llvm < 3.6.

Reviewed-by: Serge Martin (EdB) <edb+mesa@sigluy.net>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
Zoltan Gilian
2015-08-19 11:56:08 +02:00
committed by Francisco Jerez
parent 7eda897bf0
commit df5cdec132

View File

@@ -346,6 +346,15 @@ namespace {
// Kernel metadata // Kernel metadata
struct kernel_arg_md {
llvm::StringRef type_name;
llvm::StringRef access_qual;
kernel_arg_md(llvm::StringRef type_name_, llvm::StringRef access_qual_):
type_name(type_name_), access_qual(access_qual_) {}
};
#if HAVE_LLVM >= 0x0306
const llvm::MDNode * const llvm::MDNode *
get_kernel_metadata(const llvm::Function *kernel_func) { get_kernel_metadata(const llvm::Function *kernel_func) {
auto mod = kernel_func->getParent(); auto mod = kernel_func->getParent();
@@ -356,12 +365,8 @@ namespace {
const llvm::MDNode *kernel_node = nullptr; const llvm::MDNode *kernel_node = nullptr;
for (unsigned i = 0; i < kernels_node->getNumOperands(); ++i) { for (unsigned i = 0; i < kernels_node->getNumOperands(); ++i) {
#if HAVE_LLVM >= 0x0306
auto func = llvm::mdconst::dyn_extract<llvm::Function>( auto func = llvm::mdconst::dyn_extract<llvm::Function>(
#else kernels_node->getOperand(i)->getOperand(0));
auto func = llvm::dyn_cast<llvm::Function>(
#endif
kernels_node->getOperand(i)->getOperand(0));
if (func == kernel_func) { if (func == kernel_func) {
kernel_node = kernels_node->getOperand(i); kernel_node = kernels_node->getOperand(i);
break; break;
@@ -387,13 +392,6 @@ namespace {
return node; return node;
} }
struct kernel_arg_md {
llvm::StringRef type_name;
llvm::StringRef access_qual;
kernel_arg_md(llvm::StringRef type_name_, llvm::StringRef access_qual_):
type_name(type_name_), access_qual(access_qual_) {}
};
std::vector<kernel_arg_md> std::vector<kernel_arg_md>
get_kernel_arg_md(const llvm::Function *kernel_func) { get_kernel_arg_md(const llvm::Function *kernel_func) {
auto num_args = kernel_func->getArgumentList().size(); auto num_args = kernel_func->getArgumentList().size();
@@ -415,6 +413,17 @@ namespace {
return res; return res;
} }
#else
std::vector<kernel_arg_md>
get_kernel_arg_md(const llvm::Function *kernel_func) {
return std::vector<kernel_arg_md>(
kernel_func->getArgumentList().size(),
kernel_arg_md("", ""));
}
#endif // HAVE_LLVM >= 0x0306
std::vector<module::argument> std::vector<module::argument>
get_kernel_args(const llvm::Module *mod, const std::string &kernel_name, get_kernel_args(const llvm::Module *mod, const std::string &kernel_name,
const clang::LangAS::Map &address_spaces) { const clang::LangAS::Map &address_spaces) {