TargetExternalSymbol and TargetGlobalAddress

I have noticed that TargetGlobalAddress is generated for "source code"
functions and TargetExternalSymbol is generated for builtins like
__lshrdi3. What is the difference between TargetExternalSymbol and


The only real difference is that one exists in the LLVM code and one doesn't. :slight_smile: In particular, TargetExternalSymbol's are limited to being defined in some other module, but TargetGlobalAddress can be defined in the current module.

TargetExternalSymbol is a somewhat ugly solution to handle things like "__lshrdi3" or "malloc", which don't necessarily exist in the LLVM .bc file. Previously we would add new prototypes to represent these things to the LLVM module, but we aim to have the code generator not modify the LLVM module at all.

In my opinion, a better overall design would be to have the lowering phase totally eliminate LLVM GlobalValue references, making everything in the code generator be a reference to a lowered name. This would simplify several pieces of code, particularly the x86 backend.