diff options
Diffstat (limited to 'lib/Target/X86/X86AsmPrinter.cpp')
| -rw-r--r-- | lib/Target/X86/X86AsmPrinter.cpp | 73 | 
1 files changed, 38 insertions, 35 deletions
| diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index fdd712520b44..6b228b0b0329 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -13,33 +13,33 @@  //===----------------------------------------------------------------------===//  #include "X86AsmPrinter.h" +#include "InstPrinter/X86ATTInstPrinter.h"  #include "X86.h"  #include "X86COFFMachineModuleInfo.h"  #include "X86MachineFunctionInfo.h"  #include "X86TargetMachine.h" -#include "InstPrinter/X86ATTInstPrinter.h" -#include "llvm/CallingConv.h" -#include "llvm/DebugInfo.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Module.h" -#include "llvm/Type.h" +#include "llvm/ADT/SmallString.h"  #include "llvm/Assembly/Writer.h" +#include "llvm/CodeGen/MachineJumpTableInfo.h" +#include "llvm/CodeGen/MachineModuleInfoImpls.h" +#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" +#include "llvm/DebugInfo.h" +#include "llvm/IR/CallingConv.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Type.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/MC/MCContext.h"  #include "llvm/MC/MCExpr.h"  #include "llvm/MC/MCSectionMachO.h"  #include "llvm/MC/MCStreamer.h"  #include "llvm/MC/MCSymbol.h" -#include "llvm/CodeGen/MachineJumpTableInfo.h" -#include "llvm/CodeGen/MachineModuleInfoImpls.h" -#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" -#include "llvm/Target/Mangler.h" -#include "llvm/Target/TargetOptions.h"  #include "llvm/Support/COFF.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/TargetRegistry.h" -#include "llvm/ADT/SmallString.h" +#include "llvm/Target/Mangler.h" +#include "llvm/Target/TargetOptions.h"  using namespace llvm;  //===----------------------------------------------------------------------===// @@ -201,7 +201,7 @@ void X86AsmPrinter::printSymbolOperand(const MachineOperand &MO,    case X86II::MO_TLVP_PIC_BASE:      O << "@TLVP" << '-' << *MF->getPICBaseSymbol();      break; -  case X86II::MO_SECREL:      O << "@SECREL";      break; +  case X86II::MO_SECREL:    O << "@SECREL32";  break;    }  } @@ -252,14 +252,15 @@ void X86AsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,    }    case MachineOperand::MO_Immediate: -    O << '$' << MO.getImm(); +    if (AsmVariant == 0) O << '$'; +    O << MO.getImm();      return;    case MachineOperand::MO_JumpTableIndex:    case MachineOperand::MO_ConstantPoolIndex:    case MachineOperand::MO_GlobalAddress:    case MachineOperand::MO_ExternalSymbol: { -    O << '$'; +    if (AsmVariant == 0) O << '$';      printSymbolOperand(MO, O);      break;    } @@ -355,19 +356,23 @@ void X86AsmPrinter::printIntelMemReference(const MachineInstr *MI, unsigned Op,      NeedPlus = true;    } -  assert (DispSpec.isImm() && "Displacement is not an immediate!"); -  int64_t DispVal = DispSpec.getImm(); -  if (DispVal || (!IndexReg.getReg() && !BaseReg.getReg())) { -    if (NeedPlus) { -      if (DispVal > 0) -        O << " + "; -      else { -        O << " - "; -        DispVal = -DispVal; +  if (!DispSpec.isImm()) { +    if (NeedPlus) O << " + "; +    printOperand(MI, Op+3, O, Modifier, AsmVariant); +  } else { +    int64_t DispVal = DispSpec.getImm(); +    if (DispVal || (!IndexReg.getReg() && !BaseReg.getReg())) { +      if (NeedPlus) { +        if (DispVal > 0) +          O << " + "; +        else { +          O << " - "; +          DispVal = -DispVal; +        }        } +      O << DispVal;      } -    O << DispVal; -  }   +  }    O << ']';  } @@ -543,7 +548,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {                                          MCSA_IndirectSymbol);          // hlt; hlt; hlt; hlt; hlt     hlt = 0xf4.          const char HltInsts[] = "\xf4\xf4\xf4\xf4\xf4"; -        OutStreamer.EmitBytes(StringRef(HltInsts, 5), 0/*addrspace*/); +        OutStreamer.EmitBytes(StringRef(HltInsts, 5));        }        Stubs.clear(); @@ -569,7 +574,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {          // .long 0          if (MCSym.getInt())            // External to current translation unit. -          OutStreamer.EmitIntValue(0, 4/*size*/, 0/*addrspace*/); +          OutStreamer.EmitIntValue(0, 4/*size*/);          else            // Internal to current translation unit.            // @@ -578,8 +583,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {            // using NLPs.  However, sometimes the types are local to the file. So            // we need to fill in the value for the NLP in those cases.            OutStreamer.EmitValue(MCSymbolRefExpr::Create(MCSym.getPointer(), -                                                        OutContext), -                                4/*size*/, 0/*addrspace*/); +                                                        OutContext), 4/*size*/);        }        Stubs.clear();        OutStreamer.AddBlankLine(); @@ -596,8 +600,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {          // .long _foo          OutStreamer.EmitValue(MCSymbolRefExpr::                                Create(Stubs[i].second.getPointer(), -                                     OutContext), -                              4/*size*/, 0/*addrspace*/); +                                     OutContext), 4/*size*/);        }        Stubs.clear();        OutStreamer.AddBlankLine(); @@ -663,7 +666,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {            name += ",DATA";          else          name += ",data"; -        OutStreamer.EmitBytes(name, 0); +        OutStreamer.EmitBytes(name);        }        for (unsigned i = 0, e = DLLExportedFns.size(); i != e; ++i) { @@ -672,7 +675,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {          else            name = " -export:";          name += DLLExportedFns[i]->getName(); -        OutStreamer.EmitBytes(name, 0); +        OutStreamer.EmitBytes(name);        }      }    } @@ -692,7 +695,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {        for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {          OutStreamer.EmitLabel(Stubs[i].first);          OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(), -                                    TD->getPointerSize(), 0); +                                    TD->getPointerSize());        }        Stubs.clear();      } | 
