diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -24,6 +24,7 @@ #include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/MC/MCSymbol.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" #include @@ -34,6 +35,10 @@ #define DEBUG_TYPE "mccodeemitter" +cl::opt DontGenPLTForDSOLocalCalls( + "dont-gen-plt-for-dsolocal-calls", cl::Hidden, cl::init(false), + cl::desc("Disables generation of PLT relocations for DSO local symbols")); + namespace { class X86MCCodeEmitter : public MCCodeEmitter { @@ -1464,6 +1469,15 @@ case X86II::RawFrm: emitByte(BaseOpcode + OpcodeOffset, OS); + // Check if unconditional generation of PLT32 relocations for + // calls/jumps has been explicitly disabled. This may be useful for cases + // when nonstandard linker is used. For example, linking of JITed code is + // done in a special way and symbols exported by VM get linked only after + // PLT table has already been generated and it's too late to reduce PLT32 + // relocations. + if (DontGenPLTForDSOLocalCalls) + break; + if (!STI.hasFeature(X86::Mode64Bit) || !isPCRel32Branch(MI, MCII)) break;