Fetching the functions in C files

Hello Everyone,

Just subscribed to the mailing list.

I was wondering how I am going to fetch each functions of a specific source code file (c/c++) using the LLVM framework. For instance, I would like to apply certain passes using llvm-opt on certain functions not the whole file.

I would appreciate any hints or idea leading me about the starting point.

Regards,

-Amir

You might be able to use the llvm-extract tool to pull out the functions you want into a separate bitcode file and then use opt to optimize them. You’d then need to create a second bitcode file that contains the remaining functions (using llvm-extract again). Finally, you’d take the optimized bitcode file and the bitcode file containing the other functions and link them together using clang and libLTO or the llvm-link tool. Regards, John Criswell

Thanks for the answer John.

I checked the llvm-extract and it works, but my concern is if the output of the extract could be saved as .ll instead of .bc. Sort of human-readable format so that I can parse it. Otherwise, it is better to parse the foo.ll file right away instead of using the extract tool.

Please correct me if I am wrong.

Thanks,

-Amir

You can use llvm-dis to turn .bc files into .ll files.

Thanks Markus.

Having llvm-as to turn the extracted function.bc file to .ll caused an error saying:

llvm-as-3.4: function_bc:1:1: error: expected top-level entity

BC! #AI29bEBB2I (some more binary)

This error is just the same error that I received while using llvm-extract on a .c file (not .bc or .ll).

Do I have to include other things in the command ? I mean generating a function.ll without anything as header, Module ID, etc might be wrong. right ?

-Amir

Thanks Markus.

Having llvm-as to turn the extracted function.bc file to .ll caused an
error saying:

llvm-as is for converting bitcode (.bc) to readable LLVM IR (.ll)
llvm-dis is for the other direction

Eli

Thanks Markus.

Having llvm-as to turn the extracted function.bc file to .ll caused an
error saying:

llvm-as is for converting bitcode (.bc) to readable LLVM IR (.ll)
llvm-dis is for the other direction

I'm sorry, this is exactly reversed. Typo :slight_smile:

llvm-dis is for .bc --> .ll
llvm-as is for .ll --> .bc