I am working on developing a method to do some analysis on Ada code. I have converted the high level code (multiple Ada files) to the corresponding LLVM IR (.s files) using the tool dragonegg. The structure of my code is such that there are function calls across these files. Is there any way to inline these function calls? That is if function A in A.s calls function B in B.s, can the code for function B be added in A.s using some flag or pass in LLVM, like the AlwaysInlinerLegacyPass?
I need to do the analysis on the .s file, so doing it during linking or assembling will not help.
As nobody else has answered you, I will give it a try, although I am not an expert in this area by any means.
When you say “.s files” what I think of are assembler source text files, i.e., machine instructions. There is no mechanism for supporting inlining in that case. But then you also said they are LLVM IR files, which by convention in the LLVM project have a .ll extension. That’s a different story. I believe the correct tool for merging several IR files into one file would be llvm-link; once you have a single IR module, then everything would be available for your analysis.
There might be more clever ways to do this, but I’m not aware of a way to extract a single function from one file to merge into another file as a separate IR pass.
Hope this helps,
Thank you very much for your response. I will try doing as you suggested.
If you are talking about LLVM IR when you said (Assembly); you might also want to look at LLVM Link Time optimizations: https://www.llvm.org/docs/LinkTimeOptimization.html
–Sameer Abu Asal ,
Ok, thanks a lot! Will go through it.
In continuation to my previous doubt, I have an LLVM module with multiple functions. I am adding the AlwaysInline attribute to all functions and running createAlwaysInlinerLegacyPass. But 3-4 large functions are not getting inlined. Is there any way to ensure all the functions in the module are inlined irrespective of their size?