I need to print some extra information about libcall names in assembly. Libcall names are managed as ExternalSymbols in LLVM.
How do I access these ExternalSymbols from Asmprinter?
AsmPrinter uses class Module that lists all the global variables (including extern variables) and functions (include extern functions). But it does not list any information about the libcalls (ExternalSymbols) generated during lowering.
I need to emit declarations of the libcalls (that are made in the current module) at the beginning of the assembly file. The class “Module” does not maintain any list of the libcalls made during the program. Although, it maintains lists of all the global variables and functions in the current module.
Traversing each instruction and its operand to find if any libcall has been invoked seems to be very very costly. Is there some other way to find the libcalls that are made in module?
The declaration of functions called via the "call" instruction is a GlobalValue in your Module. You can go through all of the GlobalValues, look for those that are Function declarations (use the "Function::isDeclaration()" method), and then placing them in the appropriate place in your assembly file.
The declaration of functions called via the "call" instruction is a
GlobalValue in your Module. You can go through all of the
GlobalValues, look for those that are Function declarations (use the
"Function::isDeclaration()" method), and then placing them in the
appropriate place in your assembly file.
Would that work?
Hi Bill,
Function definitions and declarations that are parsed by clang make part
of the FunctionList in Module. However the libcalls that are created
during the lowering do not make part of this list.
For example PIC16 does not support shift operation of 16 bits. For this
LLVM generates the libcall. For creating such a call it uses
ExternalSymbol and therefore it is not available in the FunctionList.
I need to emit declaration for these libcalls. So FunctionList does not
provide me the information. Is there any other way I can get the
information of these libcalls in AsmPrinter?
I'm not sure. I suppose that they would have to be in a list somewhere, because they would need to be printed in the ASM file. Try grepping around in the AsmPrinter stuff to see what prints them out. See if there's a list and then go from there.