[llvm-dev] LLVMGetFirstFunction() / LLVMGetNextFunction( ) problem

Toshiyasu Morita via llvm-dev llvm-dev at lists.llvm.org
Fri Apr 28 14:06:11 PDT 2017


That works - thanks for the explanation. Much appreciated.

Toshi

On Fri, Apr 28, 2017 at 1:39 PM, Reid Kleckner <rnk at google.com> wrote:

> The intention of the API is that you iterate until LLVMGetNextFunction
> returns NULL, not the last function. See their implementations:
>
> LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) {
>   Module *Mod = unwrap(M);
>   Module::iterator I = Mod->end();
>   if (I == Mod->begin())
>     return nullptr;
>   return wrap(&*--I);
> }
>
> LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) {
>   Function *Func = unwrap<Function>(Fn);
>   Module::iterator I(Func);
>   if (++I == Func->getParent()->end())
>     return nullptr;
>   return wrap(&*I);
> }
>
> On Fri, Apr 28, 2017 at 1:23 PM, Toshiyasu Morita via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> Hi, I have a problem - looking for advice.
>>
>> I have a source code file with two functions which are compiled into a
>> .bc file.
>> When the bitcode file is loaded, I can dump the module and see the two
>> functions:
>>
>> ...
>> ; Materializable
>> ; Function Attrs: noinline nounwind uwtable
>> define void @matmul(double*, double*, double*, i32, i32, i32) #0 {}
>>
>> ; Materializable
>> ; Function Attrs: noinline nounwind uwtable
>> define i32 @main() #0 {}
>> ...
>>
>> However, when I use LLVMGetirstFunction() and LLVMGetNextFunction() to
>> iterate through the functions in the module, it only iterates through the
>> function "matmul".
>> It never finds main().
>>
>> 50      first_func = LLVMGetFirstFunction(module);
>> (gdb) next
>> 151      last_func = LLVMGetLastFunction(module);
>> (gdb)
>> 154      for (func = first_func; func != last_func; func =
>> LLVMGetNextFunction(func)) {
>> (gdb)
>> 155        func_name = LLVMGetValueName(func);
>> (gdb)
>> 156        func_addr = LLVMGetFunctionAddress(engine, func_name);
>> (gdb) print func_name
>> $9 = 0x1efe180 "matmul"
>> (gdb) next
>> 159        if (!func_addr) continue;
>> (gdb)
>> 161        symbol_table_add(symbol_table, func_name, func_addr);
>> (gdb)
>> 164        if ((size = mem_region_lookup(mem_region_anchor, func_addr)))
>> { symbol_table_add(symbol_table, "dummy_symbol", func_addr + size); }
>> (gdb)
>> 154      for (func = first_func; func != last_func; func =
>> LLVMGetNextFunction(func)) {
>> (gdb)
>> 168      symbol_table_calc_symbol_sizes(symbol_table);
>>
>> Any suggestions appreciated.
>>
>> Toshi
>>
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170428/63f75de3/attachment.html>


More information about the llvm-dev mailing list