summaryrefslogtreecommitdiff
path: root/src/gallium/state_trackers/clover/llvm/invocation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/clover/llvm/invocation.cpp')
-rw-r--r--src/gallium/state_trackers/clover/llvm/invocation.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index dae61f7fa7d..a50cf37dfcb 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -304,14 +304,20 @@ namespace {
for (llvm::Function::arg_iterator I = kernel_func->arg_begin(),
E = kernel_func->arg_end(); I != E; ++I) {
llvm::Argument &arg = *I;
- llvm::Type *arg_type = arg.getType();
#if HAVE_LLVM < 0x0302
llvm::TargetData TD(kernel_func->getParent());
#else
llvm::DataLayout TD(kernel_func->getParent()->getDataLayout());
#endif
+
+ llvm::Type *arg_type = arg.getType();
unsigned arg_size = TD.getTypeStoreSize(arg_type);
+ llvm::Type *target_type = arg_type->isIntegerTy() ?
+ TD.getSmallestLegalIntType(mod->getContext(), arg_size * 8) :
+ arg_type;
+ unsigned target_size = TD.getTypeStoreSize(target_type);
+
if (llvm::isa<llvm::PointerType>(arg_type) && arg.hasByValAttr()) {
arg_type =
llvm::dyn_cast<llvm::PointerType>(arg_type)->getElementType();
@@ -324,11 +330,24 @@ namespace {
unsigned address_space = llvm::cast<llvm::PointerType>(arg_type)->getAddressSpace();
switch (address_space) {
default:
- args.push_back(module::argument(module::argument::global, arg_size));
+ args.push_back(
+ module::argument(module::argument::global, arg_size,
+ target_size, 0,
+ module::argument::zero_ext));
break;
}
+
} else {
- args.push_back(module::argument(module::argument::scalar, arg_size));
+ llvm::AttributeSet attrs = kernel_func->getAttributes();
+ enum module::argument::ext_type ext_type =
+ (attrs.hasAttribute(arg.getArgNo() + 1,
+ llvm::Attribute::SExt) ?
+ module::argument::sign_ext :
+ module::argument::zero_ext);
+
+ args.push_back(
+ module::argument(module::argument::scalar, arg_size,
+ target_size, 0, ext_type));
}
}