return false;
}
-static inline bool shouldPrintPLT(TargetMachine &TM, const X86Subtarget* ST) {
- return ST->isTargetELF() && TM.getRelocationModel() == Reloc::PIC_;
-}
-
-static inline bool shouldPrintStub(TargetMachine &TM, const X86Subtarget* ST) {
- return ST->isPICStyleStub() && TM.getRelocationModel() != Reloc::Static;
-}
-
/// print_pcrel_imm - This is used to print an immediate value that ends up
/// being encoded as a pc-relative value. These print slightly differently, for
/// example, a $ is not emitted.
needCloseParen = true;
}
- if (shouldPrintStub(TM, Subtarget)) {
- // DARWIN/X86-32 in != static mode.
-
- // Link-once, declaration, or Weakly-linked global variables need
- // non-lazily-resolved stubs
- if (GV->isDeclaration() || GV->isWeakForLinker()) {
- // Dynamically-resolved functions need a stub for the function.
- if (isa<Function>(GV)) {
- // Function stubs are no longer needed for Mac OS X 10.5 and up.
- if (Subtarget->isTargetDarwin() && Subtarget->getDarwinVers() >= 9) {
- O << Name;
- } else {
- FnStubs.insert(Name);
- printSuffixedName(Name, "$stub");
- }
- assert(MO.getTargetFlags() == 0);
- } else if (GV->hasHiddenVisibility()) {
- if (!GV->isDeclaration() && !GV->hasCommonLinkage())
- // Definition is not definitely in the current translation unit.
- O << Name;
- else {
- HiddenGVStubs.insert(Name);
- printSuffixedName(Name, "$non_lazy_ptr");
- assert(MO.getTargetFlags() == 0);
- }
- } else {
- GVStubs.insert(Name);
- printSuffixedName(Name, "$non_lazy_ptr");
- assert(MO.getTargetFlags() == 0);
- }
- } else {
- O << Name;
- }
+ // Handle dllimport linkage.
+ if (MO.getTargetFlags() == X86II::MO_DLLIMPORT)
+ O << "__imp_";
+
+ if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) {
+ FnStubs.insert(Name);
+ printSuffixedName(Name, "$stub");
} else {
- if (GV->hasDLLImportLinkage()) {
- assert(MO.getTargetFlags() == 0);
- O << "__imp_";
- }
O << Name;
-
- if (shouldPrintPLT(TM, Subtarget)) {
- // Assemble call via PLT for externally visible symbols
- if (!GV->hasHiddenVisibility() && !GV->hasProtectedVisibility() &&
- !GV->hasLocalLinkage())
- O << "@PLT";
- }
- if (Subtarget->isTargetCygMing() && GV->isDeclaration())
- // Save function name for later type emission
- FnStubs.insert(Name);
}
+ // Assemble call via PLT for externally visible symbols.
+ if (MO.getTargetFlags() == X86II::MO_PLT)
+ O << "@PLT";
+
+ if (Subtarget->isTargetCygMing() && GV->isDeclaration())
+ // Save function name for later type emission
+ CygMingStubs.insert(Name);
+
printOffset(MO.getOffset());
if (needCloseParen)
bool needCloseParen = false;
std::string Name(TAI->getGlobalPrefix());
Name += MO.getSymbolName();
- // Print function stub suffix unless it's Mac OS X 10.5 and up.
- if (shouldPrintStub(TM, Subtarget) &&
- // DARWIN/X86-32 in != static mode.
- !(Subtarget->isTargetDarwin() && Subtarget->getDarwinVers() >= 9)) {
-
- FnStubs.insert(Name);
- printSuffixedName(Name, "$stub");
- return;
- }
-
+
if (Name[0] == '$') {
// The name begins with a dollar-sign. In order to avoid having it look
// like an integer immediate to the assembler, enclose it in parens.
needCloseParen = true;
}
- O << Name;
+ if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) {
+ FnStubs.insert(Name);
+ printSuffixedName(Name, "$stub");
+ } else {
+ O << Name;
+ }
if (MO.getTargetFlags() == X86II::MO_GOT_ABSOLUTE_ADDRESS) {
O << " + [.-";
O << ']';
}
- if (shouldPrintPLT(TM, Subtarget))
+ if (MO.getTargetFlags() == X86II::MO_PLT)
O << "@PLT";
if (needCloseParen)
needCloseParen = true;
}
- if (shouldPrintStub(TM, Subtarget)) {
- // DARWIN/X86-32 in != static mode.
-
- // Link-once, declaration, or Weakly-linked global variables need
- // non-lazily-resolved stubs
- if (GV->isDeclaration() || GV->isWeakForLinker()) {
- if (GV->hasHiddenVisibility()) {
- if (!GV->isDeclaration() && !GV->hasCommonLinkage())
- // Definition is not definitely in the current translation unit.
- O << Name;
- else {
- HiddenGVStubs.insert(Name);
- printSuffixedName(Name, "$non_lazy_ptr");
- assert(MO.getTargetFlags() == 0);
- }
- } else {
- GVStubs.insert(Name);
- printSuffixedName(Name, "$non_lazy_ptr");
- assert(MO.getTargetFlags() == 0);
- }
- } else {
- O << Name;
- }
-
- if (TM.getRelocationModel() == Reloc::PIC_) {
- O << '-';
- PrintPICBaseSymbol();
- }
+ // Handle dllimport linkage.
+ if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) {
+ O << "__imp_" << Name;
+ } else if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
+ MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE) {
+ GVStubs.insert(Name);
+ printSuffixedName(Name, "$non_lazy_ptr");
+ } else if (MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY ||
+ MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE){
+ HiddenGVStubs.insert(Name);
+ printSuffixedName(Name, "$non_lazy_ptr");
} else {
- if (GV->hasDLLImportLinkage()) {
- O << "__imp_";
- assert(MO.getTargetFlags() == 0);
- }
O << Name;
}
- printOffset(MO.getOffset());
-
if (needCloseParen)
O << ')';
+ printOffset(MO.getOffset());
break;
}
case MachineOperand::MO_ExternalSymbol:
/// NOTE: MO_ExternalSymbol in a non-pcrel_imm context is *only* generated
/// by _GLOBAL_OFFSET_TABLE_ on X86-32. All others are call operands, which
/// are pcrel_imm's.
- assert(!Subtarget->is64Bit() && !Subtarget->isPICStyleRIPRel());
+ assert(!Subtarget->is64Bit());
// These are never used as memory operands.
assert(Modifier == 0 || strcmp(Modifier, "mem"));
O << '$';
switch (MO.getTargetFlags()) {
default:
assert(0 && "Unknown target flag on GV operand");
- case X86II::MO_NO_FLAG:
+ case X86II::MO_NO_FLAG: // No flag.
+ break;
+ case X86II::MO_DARWIN_NONLAZY:
+ case X86II::MO_DARWIN_HIDDEN_NONLAZY:
+ case X86II::MO_DLLIMPORT:
+ // These affect the name of the symbol, not any suffix.
break;
case X86II::MO_GOT_ABSOLUTE_ADDRESS:
O << " + [.-";
O << ']';
break;
case X86II::MO_PIC_BASE_OFFSET:
+ case X86II::MO_DARWIN_NONLAZY_PIC_BASE:
+ case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE:
O << '-';
PrintPICBaseSymbol();
break;
O << "\t.subsections_via_symbols\n";
} else if (Subtarget->isTargetCygMing()) {
// Emit type information for external functions
- for (StringSet<>::iterator i = FnStubs.begin(), e = FnStubs.end();
+ for (StringSet<>::iterator i = CygMingStubs.begin(), e = CygMingStubs.end();
i != e; ++i) {
O << "\t.def\t " << i->getKeyData()
<< ";\t.scl\t" << COFF::C_EXT