#include "X86Subtarget.h"
#include "X86InstrInfo.h"
#include "X86GenSubtarget.inc"
-#include "llvm/Module.h"
+#include "llvm/GlobalValue.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
+#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
using namespace llvm;
#if defined(_MSC_VER)
- #include <intrin.h>
+#include <intrin.h>
#endif
static cl::opt<X86Subtarget::AsmWriterFlavorTy>
clEnumValN(X86Subtarget::Intel, "intel", "Emit Intel-style assembly"),
clEnumValEnd));
-bool X86Subtarget::isPICStyleStubPIC(const TargetMachine &TM) const {
- return PICStyle == PICStyles::Stub &&
- TM.getRelocationModel() == Reloc::PIC_;
-}
-
-bool X86Subtarget::isPICStyleStubNoDynamic(const TargetMachine &TM) const {
- return PICStyle == PICStyles::Stub &&
- TM.getRelocationModel() == Reloc::DynamicNoPIC;
-}
-
-
-
/// ClassifyGlobalReference - Classify a global variable reference for the
/// current subtarget according to how we should reference it in a non-pcrel
/// context.
if (GV->hasDLLImportLinkage())
return X86II::MO_DLLIMPORT;
+ // GV with ghost linkage (in JIT lazy compilation mode) do not require an
+ // extra load from stub.
+ bool isDecl = GV->isDeclaration() && !GV->hasNotBeenReadFromBitcode();
+
// X86-64 in PIC mode.
if (isPICStyleRIPRel()) {
// Large model never uses stubs.
if (TM.getCodeModel() == CodeModel::Large)
return X86II::MO_NO_FLAG;
- if (isTargetDarwin()) {
- // If symbol visibility is hidden, the extra load is not needed if
- // target is x86-64 or the symbol is definitely defined in the current
- // translation unit.
- if (GV->hasDefaultVisibility() &&
- (GV->isDeclaration() || GV->isWeakForLinker()))
- return X86II::MO_GOTPCREL;
- } else {
- assert(isTargetELF() && "Unknown rip-relative target");
-
- // Extra load is needed for all externally visible.
- if (!GV->hasLocalLinkage() && GV->hasDefaultVisibility())
- return X86II::MO_GOTPCREL;
- }
+ if (isTargetDarwin()) {
+ // If symbol visibility is hidden, the extra load is not needed if
+ // target is x86-64 or the symbol is definitely defined in the current
+ // translation unit.
+ if (GV->hasDefaultVisibility() &&
+ (isDecl || GV->isWeakForLinker()))
+ return X86II::MO_GOTPCREL;
+ } else {
+ assert(isTargetELF() && "Unknown rip-relative target");
+
+ // Extra load is needed for all externally visible.
+ if (!GV->hasLocalLinkage() && GV->hasDefaultVisibility())
+ return X86II::MO_GOTPCREL;
+ }
return X86II::MO_NO_FLAG;
}
return X86II::MO_GOT;
}
- if (isPICStyleStubAny()) {
- // In Darwin/32, we have multiple different stub types, and we have both PIC
- // and -mdynamic-no-pic. Determine whether we have a stub reference
- // and/or whether the reference is relative to the PIC base or not.
- bool IsPIC = TM.getRelocationModel() == Reloc::PIC_;
+ if (isPICStyleStubPIC()) { // Darwin/32 in PIC mode.
+ // Determine whether we have a stub reference and/or whether the reference
+ // is relative to the PIC base or not.
// If this is a strong reference to a definition, it is definitely not
// through a stub.
- if (!GV->isDeclaration() && !GV->isWeakForLinker())
- return IsPIC ? X86II::MO_PIC_BASE_OFFSET : 0;
+ if (!isDecl && !GV->isWeakForLinker())
+ return X86II::MO_PIC_BASE_OFFSET;
// Unless we have a symbol with hidden visibility, we have to go through a
// normal $non_lazy_ptr stub because this symbol might be resolved late.
- if (!GV->hasHiddenVisibility()) {
- // Non-hidden $non_lazy_ptr reference.
- return IsPIC ? X86II::MO_DARWIN_NONLAZY_PIC_BASE :
- X86II::MO_DARWIN_NONLAZY;
+ if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference.
+ return X86II::MO_DARWIN_NONLAZY_PIC_BASE;
+
+ // If symbol visibility is hidden, we have a stub for common symbol
+ // references and external declarations.
+ if (isDecl || GV->hasCommonLinkage()) {
+ // Hidden $non_lazy_ptr reference.
+ return X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE;
}
+ // Otherwise, no stub.
+ return X86II::MO_PIC_BASE_OFFSET;
+ }
+
+ if (isPICStyleStubNoDynamic()) { // Darwin/32 in -mdynamic-no-pic mode.
+ // Determine whether we have a stub reference.
+
+ // If this is a strong reference to a definition, it is definitely not
+ // through a stub.
+ if (!isDecl && !GV->isWeakForLinker())
+ return X86II::MO_NO_FLAG;
+
+ // Unless we have a symbol with hidden visibility, we have to go through a
+ // normal $non_lazy_ptr stub because this symbol might be resolved late.
+ if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference.
+ return X86II::MO_DARWIN_NONLAZY;
+
// If symbol visibility is hidden, we have a stub for common symbol
// references and external declarations.
- if (GV->isDeclaration() || GV->hasCommonLinkage()) {
+ if (isDecl || GV->hasCommonLinkage()) {
// Hidden $non_lazy_ptr reference.
- return IsPIC ? X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE :
- X86II::MO_DARWIN_HIDDEN_NONLAZY;
+ return X86II::MO_DARWIN_HIDDEN_NONLAZY;
}
// Otherwise, no stub.
- return IsPIC ? X86II::MO_PIC_BASE_OFFSET : 0;
+ return X86II::MO_NO_FLAG;
}
// Direct static reference to global.
}
case 15:
if (HasSSE3) {
- switch (Model) {
- default: return "k8-sse3";
- }
+ return "k8-sse3";
} else {
switch (Model) {
case 1: return "opteron";
}
}
case 16:
- switch (Model) {
- default: return "amdfam10";
- }
+ return "amdfam10";
default:
return "generic";
}
}
}
-X86Subtarget::X86Subtarget(const Module &M, const std::string &FS, bool is64Bit)
+X86Subtarget::X86Subtarget(const std::string &TT, const std::string &FS,
+ bool is64Bit)
: AsmFlavor(AsmWriterFlavor)
, PICStyle(PICStyles::None)
, X86SSELevel(NoMMXSSE)
if (Is64Bit)
HasX86_64 = true;
- DOUT << "Subtarget features: SSELevel " << X86SSELevel
- << ", 3DNowLevel " << X863DNowLevel
- << ", 64bit " << HasX86_64 << "\n";
+ DEBUG(errs() << "Subtarget features: SSELevel " << X86SSELevel
+ << ", 3DNowLevel " << X863DNowLevel
+ << ", 64bit " << HasX86_64 << "\n");
assert((!Is64Bit || HasX86_64) &&
"64-bit code requested on a subtarget that doesn't support it!");
// Set the boolean corresponding to the current target triple, or the default
// if one cannot be determined, to true.
- const std::string& TT = M.getTargetTriple();
if (TT.length() > 5) {
size_t Pos;
if ((Pos = TT.find("-darwin")) != std::string::npos) {