(1)Function descriptor on AIX
On AIX, a called routine may have 2 distinct symbols associated with it:
- A function descriptor (Name)
- A function entry point (.Name)
The descriptor structure on AIX is the same as those in the ELF V1 ABI:
- The address of the entry point of the function.
- The TOC base address for the function.
- The environment pointer.
The descriptor symbol uses the same name as the source level function in C.
The function entry point is analogous to the symbol we would generate for a function in a
non-descriptor-based ABI, except that it is renamed by prepending a ".".
Which symbol gets referenced depends on the context:
- Taking the address of the function references the descriptor symbol.
- Calling the function references the entry point symbol.
(2)Speaking of implementation on AIX, for direct function call target, we create proper MCSymbol SDNode(e.g . ".foo") while constructing SDAG to replace original TargetGlobalAddress SDNode. Then down the path, we can take advantage of this MCSymbol.
(3)And since -stop-after llc option is used to test MIR results in the LIT testcase, to be able to get a MCSymbolXCOFF in SDAG layer, an option "-init-MC" is added to use together with -stop-after/-stop-before option to force llc doing the target object file lowering.
llvm/IR/GlobalValue.h can't be included in MC, that creates a circular dependency between MC and IR libraries. This circular dependency is causing an issue for build system that enforce layering. Is there another way to implement this change?