diff options
Diffstat (limited to 'llvm/lib')
18 files changed, 70 insertions, 41 deletions
diff --git a/llvm/lib/CodeGen/LLVMTargetMachine.cpp b/llvm/lib/CodeGen/LLVMTargetMachine.cpp index f835f16ea3e..c68ae7db802 100644 --- a/llvm/lib/CodeGen/LLVMTargetMachine.cpp +++ b/llvm/lib/CodeGen/LLVMTargetMachine.cpp @@ -131,13 +131,14 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,      Context->setAllowTemporaryLabels(false);    const MCAsmInfo &MAI = *getMCAsmInfo(); +  const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();    OwningPtr<MCStreamer> AsmStreamer;    switch (FileType) {    default: return true;    case CGFT_AssemblyFile: {      MCInstPrinter *InstPrinter = -      getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI); +      getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI, STI);      // Create a code emitter if asked to show the encoding.      MCCodeEmitter *MCE = 0; @@ -161,7 +162,6 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,    case CGFT_ObjectFile: {      // Create the code emitter for the target if it exists.  If not, .o file      // emission fails. -    const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();      MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(*getInstrInfo(), STI,                                                           *Context);      MCAsmBackend *MAB = getTarget().createMCAsmBackend(getTargetTriple()); diff --git a/llvm/lib/MC/MCDisassembler/Disassembler.cpp b/llvm/lib/MC/MCDisassembler/Disassembler.cpp index 603df94f99c..fd462f84c48 100644 --- a/llvm/lib/MC/MCDisassembler/Disassembler.cpp +++ b/llvm/lib/MC/MCDisassembler/Disassembler.cpp @@ -57,19 +57,23 @@ LLVMDisasmContextRef LLVMCreateDisasm(const char *TripleName, void *DisInfo,    std::string FeaturesStr;    std::string CPU; +  const MCSubtargetInfo *STI = TheTarget->createMCSubtargetInfo(TripleName, CPU, +                                                                FeaturesStr); +  assert(STI && "Unable to create subtarget info!"); +    // Set up the MCContext for creating symbols and MCExpr's.    MCContext *Ctx = new MCContext(*MAI, *MRI, 0);    assert(Ctx && "Unable to create MCContext!");    // Set up disassembler. -  MCDisassembler *DisAsm = TheTarget->createMCDisassembler(); +  MCDisassembler *DisAsm = TheTarget->createMCDisassembler(*STI);    assert(DisAsm && "Unable to create disassembler!");    DisAsm->setupForSymbolicDisassembly(GetOpInfo, DisInfo, Ctx);    // Set up the instruction printer.    int AsmPrinterVariant = MAI->getAssemblerDialect();    MCInstPrinter *IP = TheTarget->createMCInstPrinter(AsmPrinterVariant, -                                                     *MAI); +                                                     *MAI, *STI);    assert(IP && "Unable to create instruction printer!");    LLVMDisasmContext *DC = new LLVMDisasmContext(TripleName, DisInfo, TagType, diff --git a/llvm/lib/MC/MCDisassembler/EDDisassembler.cpp b/llvm/lib/MC/MCDisassembler/EDDisassembler.cpp index 68a201b96a9..70b6300d74b 100644 --- a/llvm/lib/MC/MCDisassembler/EDDisassembler.cpp +++ b/llvm/lib/MC/MCDisassembler/EDDisassembler.cpp @@ -178,7 +178,12 @@ EDDisassembler::EDDisassembler(CPUKey &key) :    if (!AsmInfo)      return; -  Disassembler.reset(Tgt->createMCDisassembler()); +  STI.reset(Tgt->createMCSubtargetInfo(tripleString, "", "")); +   +  if (!STI) +    return; + +  Disassembler.reset(Tgt->createMCDisassembler(*STI));    if (!Disassembler)      return; @@ -187,7 +192,7 @@ EDDisassembler::EDDisassembler(CPUKey &key) :    InstString.reset(new std::string);    InstStream.reset(new raw_string_ostream(*InstString)); -  InstPrinter.reset(Tgt->createMCInstPrinter(LLVMSyntaxVariant, *AsmInfo)); +  InstPrinter.reset(Tgt->createMCInstPrinter(LLVMSyntaxVariant, *AsmInfo, *STI));    if (!InstPrinter)      return; diff --git a/llvm/lib/MC/MCDisassembler/EDDisassembler.h b/llvm/lib/MC/MCDisassembler/EDDisassembler.h index 954a98d66d4..38c22038c51 100644 --- a/llvm/lib/MC/MCDisassembler/EDDisassembler.h +++ b/llvm/lib/MC/MCDisassembler/EDDisassembler.h @@ -137,6 +137,8 @@ struct EDDisassembler {    const llvm::Target *Tgt;    /// The assembly information for the target architecture    llvm::OwningPtr<const llvm::MCAsmInfo> AsmInfo; +  /// The subtarget information for the target architecture +  llvm::OwningPtr<const llvm::MCSubtargetInfo> STI;    // The register information for the target architecture.    llvm::OwningPtr<const llvm::MCRegisterInfo> MRI;    /// The disassembler for the target architecture diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp index 4d646298b4b..cd0e5e44fdd 100644 --- a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp +++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp @@ -11,6 +11,7 @@  #include "ARM.h"  #include "ARMRegisterInfo.h" +#include "ARMSubtarget.h"  #include "MCTargetDesc/ARMAddressingModes.h"  #include "MCTargetDesc/ARMBaseInfo.h"  #include "llvm/MC/EDInstInfo.h" @@ -34,8 +35,8 @@ class ARMDisassembler : public MCDisassembler {  public:    /// Constructor     - Initializes the disassembler.    /// -  ARMDisassembler() : -    MCDisassembler() { +  ARMDisassembler(const MCSubtargetInfo &STI) : +    MCDisassembler(STI) {    }    ~ARMDisassembler() { @@ -58,8 +59,8 @@ class ThumbDisassembler : public MCDisassembler {  public:    /// Constructor     - Initializes the disassembler.    /// -  ThumbDisassembler() : -    MCDisassembler() { +  ThumbDisassembler(const MCSubtargetInfo &STI) : +    MCDisassembler(STI) {    }    ~ThumbDisassembler() { @@ -296,12 +297,12 @@ static DecodeStatus DecodeIT(llvm::MCInst &Inst, unsigned Val,  #include "ARMGenInstrInfo.inc"  #include "ARMGenEDInfo.inc" -static MCDisassembler *createARMDisassembler(const Target &T) { -  return new ARMDisassembler; +static MCDisassembler *createARMDisassembler(const Target &T, const MCSubtargetInfo &STI) { +  return new ARMDisassembler(STI);  } -static MCDisassembler *createThumbDisassembler(const Target &T) { -  return new ThumbDisassembler; +static MCDisassembler *createThumbDisassembler(const Target &T, const MCSubtargetInfo &STI) { +  return new ThumbDisassembler(STI);  }  EDInstInfo *ARMDisassembler::getEDInfo() const { diff --git a/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp b/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp index c421f1cda46..643bf4a3ec5 100644 --- a/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp +++ b/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp @@ -35,6 +35,14 @@ static unsigned translateShiftImm(unsigned imm) {    return imm;  } + +ARMInstPrinter::ARMInstPrinter(const MCAsmInfo &MAI, +                               const MCSubtargetInfo &STI) : +  MCInstPrinter(MAI) { +  // Initialize the set of available features. +  setAvailableFeatures(STI.getFeatureBits()); +} +  StringRef ARMInstPrinter::getOpcodeName(unsigned Opcode) const {    return getInstructionName(Opcode);  } diff --git a/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h b/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h index e68a6290fe5..5bde1581afc 100644 --- a/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h +++ b/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h @@ -15,6 +15,7 @@  #define ARMINSTPRINTER_H  #include "llvm/MC/MCInstPrinter.h" +#include "llvm/MC/MCSubtargetInfo.h"  namespace llvm { @@ -22,8 +23,7 @@ class MCOperand;  class ARMInstPrinter : public MCInstPrinter {  public: -  ARMInstPrinter(const MCAsmInfo &MAI) -    : MCInstPrinter(MAI) {} +    ARMInstPrinter(const MCAsmInfo &MAI, const MCSubtargetInfo &STI);    virtual void printInst(const MCInst *MI, raw_ostream &O);    virtual StringRef getOpcodeName(unsigned Opcode) const; diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp index 1c7e75ec488..9badf937825 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp @@ -164,9 +164,10 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,  static MCInstPrinter *createARMMCInstPrinter(const Target &T,                                               unsigned SyntaxVariant, -                                             const MCAsmInfo &MAI) { +                                             const MCAsmInfo &MAI, +                                             const MCSubtargetInfo &STI) {    if (SyntaxVariant == 0) -    return new ARMInstPrinter(MAI); +    return new ARMInstPrinter(MAI, STI);    return 0;  } diff --git a/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.cpp b/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.cpp index 46f980c3f51..999080a5b04 100644 --- a/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.cpp +++ b/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.cpp @@ -696,8 +696,9 @@ MCDisassembler::DecodeStatus MBlazeDisassembler::getInstruction(MCInst &instr,    return Success;  } -static MCDisassembler *createMBlazeDisassembler(const Target &T) { -  return new MBlazeDisassembler; +static MCDisassembler *createMBlazeDisassembler(const Target &T, +                                                const MCSubtargetInfo &STI) { +  return new MBlazeDisassembler(STI);  }  extern "C" void LLVMInitializeMBlazeDisassembler() { diff --git a/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.h b/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.h index b839a696d6a..3d689dbcfea 100644 --- a/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.h +++ b/llvm/lib/Target/MBlaze/Disassembler/MBlazeDisassembler.h @@ -32,8 +32,8 @@ class MBlazeDisassembler : public MCDisassembler {  public:    /// Constructor     - Initializes the disassembler.    /// -  MBlazeDisassembler() : -    MCDisassembler() { +  MBlazeDisassembler(const MCSubtargetInfo &STI) : +    MCDisassembler(STI) {    }    ~MBlazeDisassembler() { diff --git a/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.cpp b/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.cpp index 53cf712a1ef..43ae281519c 100644 --- a/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.cpp +++ b/llvm/lib/Target/MBlaze/MCTargetDesc/MBlazeMCTargetDesc.cpp @@ -95,7 +95,8 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,  static MCInstPrinter *createMBlazeMCInstPrinter(const Target &T,                                                  unsigned SyntaxVariant, -                                                const MCAsmInfo &MAI) { +                                                const MCAsmInfo &MAI, +                                                const MCSubtargetInfo &STI) {    if (SyntaxVariant == 0)      return new MBlazeInstPrinter(MAI);    return 0; diff --git a/llvm/lib/Target/MSP430/InstPrinter/MSP430InstPrinter.h b/llvm/lib/Target/MSP430/InstPrinter/MSP430InstPrinter.h index 50d98b7c41f..82b342eccf7 100644 --- a/llvm/lib/Target/MSP430/InstPrinter/MSP430InstPrinter.h +++ b/llvm/lib/Target/MSP430/InstPrinter/MSP430InstPrinter.h @@ -22,7 +22,7 @@ namespace llvm {    class MSP430InstPrinter : public MCInstPrinter {    public:      MSP430InstPrinter(const MCAsmInfo &MAI) -      : MCInstPrinter(MAI) {} +        : MCInstPrinter(MAI) {}      virtual void printInst(const MCInst *MI, raw_ostream &O); diff --git a/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp b/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp index 3041c0e07be..fda70b81dc8 100644 --- a/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp +++ b/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp @@ -59,7 +59,8 @@ static MCCodeGenInfo *createMSP430MCCodeGenInfo(StringRef TT, Reloc::Model RM,  static MCInstPrinter *createMSP430MCInstPrinter(const Target &T,                                                  unsigned SyntaxVariant, -                                                const MCAsmInfo &MAI) { +                                                const MCAsmInfo &MAI, +                                                const MCSubtargetInfo &STI) {    if (SyntaxVariant == 0)      return new MSP430InstPrinter(MAI);    return 0; diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp index 8272219ab51..7ea7498bcb2 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp @@ -78,7 +78,8 @@ static MCCodeGenInfo *createMipsMCCodeGenInfo(StringRef TT, Reloc::Model RM,  static MCInstPrinter *createMipsMCInstPrinter(const Target &T,                                                unsigned SyntaxVariant, -                                              const MCAsmInfo &MAI) { +                                              const MCAsmInfo &MAI, +                                              const MCSubtargetInfo &STI) {    return new MipsInstPrinter(MAI);  } diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp index 5099bc89331..d5c8a9e72c6 100644 --- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp +++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp @@ -105,7 +105,8 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,  static MCInstPrinter *createPPCMCInstPrinter(const Target &T,                                               unsigned SyntaxVariant, -                                             const MCAsmInfo &MAI) { +                                             const MCAsmInfo &MAI, +                                             const MCSubtargetInfo &STI) {    return new PPCInstPrinter(MAI, SyntaxVariant);  } diff --git a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp index 46b70b71d7e..1f1c1dcd162 100644 --- a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp +++ b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp @@ -21,6 +21,7 @@  #include "llvm/MC/MCDisassembler.h"  #include "llvm/MC/MCDisassembler.h"  #include "llvm/MC/MCInst.h" +#include "llvm/MC/MCSubtargetInfo.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/MemoryObject.h"  #include "llvm/Support/TargetRegistry.h" @@ -66,8 +67,8 @@ extern Target TheX86_32Target, TheX86_64Target;  static bool translateInstruction(MCInst &target,                                  InternalInstruction &source); -X86GenericDisassembler::X86GenericDisassembler(DisassemblerMode mode) : -    MCDisassembler(), +X86GenericDisassembler::X86GenericDisassembler(const MCSubtargetInfo &STI, DisassemblerMode mode) : +    MCDisassembler(STI),      fMode(mode) {  } @@ -578,12 +579,12 @@ static bool translateInstruction(MCInst &mcInst,    return false;  } -static MCDisassembler *createX86_32Disassembler(const Target &T) { -  return new X86Disassembler::X86_32Disassembler; +static MCDisassembler *createX86_32Disassembler(const Target &T, const MCSubtargetInfo &STI) { +  return new X86Disassembler::X86_32Disassembler(STI);  } -static MCDisassembler *createX86_64Disassembler(const Target &T) { -  return new X86Disassembler::X86_64Disassembler; +static MCDisassembler *createX86_64Disassembler(const Target &T, const MCSubtargetInfo &STI) { +  return new X86Disassembler::X86_64Disassembler(STI);  }  extern "C" void LLVMInitializeX86Disassembler() {  diff --git a/llvm/lib/Target/X86/Disassembler/X86Disassembler.h b/llvm/lib/Target/X86/Disassembler/X86Disassembler.h index cced10e4a20..419b8703097 100644 --- a/llvm/lib/Target/X86/Disassembler/X86Disassembler.h +++ b/llvm/lib/Target/X86/Disassembler/X86Disassembler.h @@ -92,6 +92,7 @@ struct InternalInstruction;  namespace llvm {  class MCInst; +class MCSubtargetInfo;  class MemoryObject;  class raw_ostream; @@ -107,7 +108,7 @@ protected:    /// Constructor     - Initializes the disassembler.    ///    /// @param mode     - The X86 architecture mode to decode for. -  X86GenericDisassembler(DisassemblerMode mode); +  X86GenericDisassembler(const MCSubtargetInfo &STI, DisassemblerMode mode);  public:    ~X86GenericDisassembler(); @@ -127,24 +128,24 @@ private:  /// X86_16Disassembler - 16-bit X86 disassembler.  class X86_16Disassembler : public X86GenericDisassembler {  public: -  X86_16Disassembler() : -    X86GenericDisassembler(MODE_16BIT) { +  X86_16Disassembler(const MCSubtargetInfo &STI) : +    X86GenericDisassembler(STI, MODE_16BIT) {    }  };    /// X86_16Disassembler - 32-bit X86 disassembler.  class X86_32Disassembler : public X86GenericDisassembler {  public: -  X86_32Disassembler() : -    X86GenericDisassembler(MODE_32BIT) { +  X86_32Disassembler(const MCSubtargetInfo &STI) : +    X86GenericDisassembler(STI, MODE_32BIT) {    }  };  /// X86_16Disassembler - 64-bit X86 disassembler.  class X86_64Disassembler : public X86GenericDisassembler {  public: -  X86_64Disassembler() : -    X86GenericDisassembler(MODE_64BIT) { +  X86_64Disassembler(const MCSubtargetInfo &STI) : +    X86GenericDisassembler(STI, MODE_64BIT) {    }  }; diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp index 06d8a920e3d..f98d5e331fe 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -394,7 +394,8 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,  static MCInstPrinter *createX86MCInstPrinter(const Target &T,                                               unsigned SyntaxVariant, -                                             const MCAsmInfo &MAI) { +                                             const MCAsmInfo &MAI, +                                             const MCSubtargetInfo &STI) {    if (SyntaxVariant == 0)      return new X86ATTInstPrinter(MAI);    if (SyntaxVariant == 1)  | 

