Toshiyasu Morita via llvm-dev
2017-Apr-28 20:23 UTC
[llvm-dev] LLVMGetFirstFunction() / LLVMGetNextFunction( ) problem
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 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170428/ad81436e/attachment.html>
Reid Kleckner via llvm-dev
2017-Apr-28 20:39 UTC
[llvm-dev] LLVMGetFirstFunction() / LLVMGetNextFunction( ) problem
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/1badf6fa/attachment.html>
Toshiyasu Morita via llvm-dev
2017-Apr-28 21:06 UTC
[llvm-dev] LLVMGetFirstFunction() / LLVMGetNextFunction( ) problem
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>
Apparently Analagous Threads
- [LLVMdev] RFC: llvm-shlib-test (Was: [llvm] r191029 - llvm-c: Make LLVMGetFirstTarget a proper prototype)
- Test failures building RELEASE_3.9.0/final
- [LLVMdev] Backend optimizations
- Test failures building RELEASE_3.9.0/final
- [Bug 1739] New: meta mark 0x80000000 display error