[Mesa-dev] [PATCH 1/2] clover: Use a structure to hold information about llvm kernel functions
Francisco Jerez
currojerez at riseup.net
Tue Mar 24 09:51:31 PDT 2015
Tom Stellard <thomas.stellard at amd.com> writes:
> ---
> .../state_trackers/clover/llvm/invocation.cpp | 71 +++++++++++++---------
> 1 file changed, 41 insertions(+), 30 deletions(-)
>
This seems kind of ugly to me, what are you trying to achieve exactly?
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> index 4da62b9..28198a5 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> @@ -127,6 +127,16 @@ namespace {
> return module::deserialize(cs);
> }
> #endif
> +
> + struct llvm_kernel {
> +
> + llvm_kernel() : fn(NULL), offset(0) {
> + }
> +
> + llvm::Function *fn;
> + size_t offset;
> + };
> +
> void debug_log(const std::string &msg, const std::string &suffix) {
> const char *dbg_file = debug_get_option("CLOVER_DEBUG_FILE", "stderr");
> if (!strcmp("stderr", dbg_file)) {
> @@ -277,7 +287,7 @@ namespace {
> }
>
> void
> - find_kernels(llvm::Module *mod, std::vector<llvm::Function *> &kernels) {
> + find_kernels(llvm::Module *mod, std::vector<llvm_kernel> &kernels) {
> const llvm::NamedMDNode *kernel_node =
> mod->getNamedMetadata("opencl.kernels");
> // This means there are no kernels in the program. The spec does not
> @@ -288,18 +298,20 @@ namespace {
> }
>
> for (unsigned i = 0; i < kernel_node->getNumOperands(); ++i) {
> + kernels.resize(i + 1);
> + llvm_kernel &kernel = kernels[i];
> #if HAVE_LLVM >= 0x0306
> - kernels.push_back(llvm::mdconst::dyn_extract<llvm::Function>(
> + kernel.fn = llvm::mdconst::dyn_extract<llvm::Function>(
> #else
> - kernels.push_back(llvm::dyn_cast<llvm::Function>(
> + kernel.fn = llvm::dyn_cast<llvm::Function>(
> #endif
> - kernel_node->getOperand(i)->getOperand(0)));
> + kernel_node->getOperand(i)->getOperand(0));
> }
> }
>
> void
> optimize(llvm::Module *mod, unsigned optimization_level,
> - const std::vector<llvm::Function *> &kernels) {
> + const std::vector<llvm_kernel> &kernels) {
>
> #if HAVE_LLVM >= 0x0307
> llvm::legacy::PassManager PM;
> @@ -322,10 +334,10 @@ namespace {
> // treat the functions in the list as "main" functions and internalize
> // all of the other functions.
> std::vector<const char*> export_list;
> - for (std::vector<llvm::Function *>::const_iterator I = kernels.begin(),
> + for (std::vector<llvm_kernel>::const_iterator I = kernels.begin(),
> E = kernels.end();
> I != E; ++I) {
> - llvm::Function *kernel = *I;
> + llvm::Function *kernel = (*I).fn;
> export_list.push_back(kernel->getName().data());
> }
> #if HAVE_LLVM < 0x0305
> @@ -350,11 +362,11 @@ namespace {
> }
>
> compat::vector<module::argument>
> - get_kernel_args(const llvm::Module *mod, const std::string &kernel_name,
> + get_kernel_args(const llvm::Module *mod, const llvm_kernel &kernel,
> const clang::LangAS::Map &address_spaces) {
>
> compat::vector<module::argument> args;
> - llvm::Function *kernel_func = mod->getFunction(kernel_name);
> + llvm::Function *kernel_func = kernel.fn;
>
> #if HAVE_LLVM < 0x0305
> llvm::DataLayout TD(kernel_func->getParent()->getDataLayout());
> @@ -448,7 +460,7 @@ namespace {
>
> module
> build_module_llvm(llvm::Module *mod,
> - const std::vector<llvm::Function *> &kernels,
> + const std::vector<llvm_kernel> &kernels,
> clang::LangAS::Map& address_spaces) {
>
> module m;
> @@ -461,9 +473,10 @@ namespace {
> bitcode_ostream.flush();
>
> for (unsigned i = 0; i < kernels.size(); ++i) {
> - std::string kernel_name = kernels[i]->getName();
> + const llvm_kernel &kernel = kernels[i];
> compat::vector<module::argument> args =
> - get_kernel_args(mod, kernel_name, address_spaces);
> + get_kernel_args(mod, kernel, address_spaces);
> + std::string kernel_name = kernel.fn->getName().str();
>
> m.syms.push_back(module::symbol(kernel_name, 0, i, args ));
> }
> @@ -555,9 +568,9 @@ namespace {
> return code;
> }
>
> - std::map<std::string, unsigned>
> - get_kernel_offsets(std::vector<char> &code,
> - const std::vector<llvm::Function *> &kernels,
> + void
> + set_kernel_offsets(std::vector<char> &code,
> + std::vector<llvm_kernel> &kernels,
> compat::string &r_log) {
>
> // One of the libelf implementations
> @@ -602,32 +615,29 @@ namespace {
> GElf_Sym *symbol;
> GElf_Sym s;
>
> - std::map<std::string, unsigned> kernel_offsets;
> symtab_data = elf_getdata(symtab, symtab_data);
>
> // Determine the offsets for each kernel
> for (int i = 0; (symbol = gelf_getsym(symtab_data, i, &s)); i++) {
> char *name = elf_strptr(elf, symtab_header.sh_link, symbol->st_name);
> - for (std::vector<llvm::Function*>::const_iterator it = kernels.begin(),
> - e = kernels.end(); it != e; ++it) {
> - llvm::Function *f = *it;
> - if (f->getName() == std::string(name))
> - kernel_offsets[f->getName()] = symbol->st_value;
> + for (unsigned kern_idx = 0, kern_end = kernels.size();
> + kern_idx != kern_end; ++kern_idx) {
> + llvm_kernel& kernel = kernels[kern_idx];
> + if (kernel.fn->getName() == std::string(name))
> + kernel.offset = symbol->st_value;
> }
> }
> elf_end(elf);
> - return kernel_offsets;
> }
>
> module
> build_module_native(std::vector<char> &code,
> const llvm::Module *mod,
> - const std::vector<llvm::Function *> &kernels,
> + std::vector<llvm_kernel> &kernels,
> const clang::LangAS::Map &address_spaces,
> compat::string &r_log) {
>
> - std::map<std::string, unsigned> kernel_offsets =
> - get_kernel_offsets(code, kernels, r_log);
> + set_kernel_offsets(code, kernels, r_log);
>
> // Begin building the clover module
> module m;
> @@ -641,11 +651,12 @@ namespace {
> m.secs.push_back(module::section(0, module::section::text,
> header.num_bytes, data));
>
> - for (std::map<std::string, unsigned>::iterator i = kernel_offsets.begin(),
> - e = kernel_offsets.end(); i != e; ++i) {
> + for (std::vector<llvm_kernel>::const_iterator i = kernels.begin(),
> + e = kernels.end(); i != e; ++i) {
> compat::vector<module::argument> args =
> - get_kernel_args(mod, i->first, address_spaces);
> - m.syms.push_back(module::symbol(i->first, 0, i->second, args ));
> + get_kernel_args(mod, *i, address_spaces);
> + std::string kernel_name = (*i).fn->getName().str();
> + m.syms.push_back(module::symbol(kernel_name, 0, (*i).offset, args ));
> }
>
> return m;
> @@ -712,7 +723,7 @@ clover::compile_program_llvm(const compat::string &source,
>
> init_targets();
>
> - std::vector<llvm::Function *> kernels;
> + std::vector<llvm_kernel> kernels;
> size_t processor_str_len = std::string(target).find_first_of("-");
> std::string processor(target, 0, processor_str_len);
> std::string triple(target, processor_str_len + 1,
> --
> 2.0.4
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150324/b718db54/attachment.sig>
More information about the mesa-dev
mailing list