diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/MC/MCStreamer.h | 7 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 17 | ||||
| -rw-r--r-- | llvm/lib/MC/MCMachOStreamer.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/MC/MCNullStreamer.cpp | 2 | 
5 files changed, 24 insertions, 14 deletions
diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h index cb8196e2982..2a2529b382d 100644 --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -188,6 +188,13 @@ namespace llvm {      /// to pass in a MCExpr for constant integers.      virtual void EmitIntValue(uint64_t Value, unsigned Size,unsigned AddrSpace); +    /// EmitGPRel32Value - Emit the expression @param Value into the output as a +    /// gprel32 (32-bit GP relative) value. +    /// +    /// This is used to implement assembler directives such as .gprel32 on +    /// targets that support them. +    virtual void EmitGPRel32Value(const MCExpr *Value) = 0; +          /// EmitFill - Emit NumBytes bytes worth of the value specified by      /// FillValue.  This implements directives such as '.space'.      virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue, diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index d75210d0723..c0c93506ddb 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -544,8 +544,9 @@ void AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,                                          const MachineBasicBlock *MBB,                                          unsigned uid)  const {    // If the target supports GPRel, use it. -  if (const char *GPRel32Dir = MAI->getGPRel32Directive()) { -    O << GPRel32Dir << *GetMBBSymbol(MBB->getNumber()) << '\n'; +  if (MAI->getGPRel32Directive() != 0) { +    MCSymbol *MBBSym = GetMBBSymbol(MBB->getNumber()); +    OutStreamer.EmitGPRel32Value(MCSymbolRefExpr::Create(MBBSym, OutContext));      return;    } diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index f9a3128f90a..d177f9525a1 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -110,6 +110,8 @@ public:    virtual void EmitValue(const MCExpr *Value, unsigned Size,unsigned AddrSpace);    virtual void EmitIntValue(uint64_t Value, unsigned Size, unsigned AddrSpace); +  virtual void EmitGPRel32Value(const MCExpr *Value); +      virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue,                          unsigned AddrSpace); @@ -182,12 +184,6 @@ static inline int64_t truncateToSize(int64_t Value, unsigned Bytes) {    return Value & ((uint64_t) (int64_t) -1 >> (64 - Bytes * 8));  } -static inline const MCExpr *truncateToSize(const MCExpr *Value, -                                           unsigned Bytes) { -  // FIXME: Do we really need this routine? -  return Value; -} -  void MCAsmStreamer::SwitchSection(const MCSection *Section) {    assert(Section && "Cannot switch to a null section!");    if (Section != CurSection) { @@ -425,10 +421,17 @@ void MCAsmStreamer::EmitValue(const MCExpr *Value, unsigned Size,    }    assert(Directive && "Invalid size for machine code value!"); -  OS << Directive << *truncateToSize(Value, Size); +  OS << Directive << *Value;    EmitEOL();  } +void MCAsmStreamer::EmitGPRel32Value(const MCExpr *Value) { +  assert(MAI.getGPRel32Directive() != 0); +  OS << MAI.getGPRel32Directive() << *Value; +  EmitEOL(); +} + +  /// EmitFill - Emit NumBytes bytes worth of the value specified by  /// FillValue.  This implements directives such as '.space'.  void MCAsmStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue, diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp index 545f8d09452..143793cde10 100644 --- a/llvm/lib/MC/MCMachOStreamer.cpp +++ b/llvm/lib/MC/MCMachOStreamer.cpp @@ -46,13 +46,9 @@ class MCMachOStreamer : public MCStreamer {  private:    MCAssembler Assembler; -    MCCodeEmitter *Emitter; -    MCSectionData *CurSectionData; -    DenseMap<const MCSection*, MCSectionData*> SectionMap; -      DenseMap<const MCSymbol*, MCSymbolData*> SymbolMap;  private: @@ -134,6 +130,9 @@ public:                              unsigned Size = 0, unsigned ByteAlignment = 0);    virtual void EmitBytes(StringRef Data, unsigned AddrSpace);    virtual void EmitValue(const MCExpr *Value, unsigned Size,unsigned AddrSpace); +  virtual void EmitGPRel32Value(const MCExpr *Value) { +    assert(0 && "macho doesn't support this directive"); +  }    virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,                                      unsigned ValueSize = 1,                                      unsigned MaxBytesToEmit = 0); diff --git a/llvm/lib/MC/MCNullStreamer.cpp b/llvm/lib/MC/MCNullStreamer.cpp index 151cf283226..46e9ebfa886 100644 --- a/llvm/lib/MC/MCNullStreamer.cpp +++ b/llvm/lib/MC/MCNullStreamer.cpp @@ -50,7 +50,7 @@ namespace {      virtual void EmitValue(const MCExpr *Value, unsigned Size,                             unsigned AddrSpace) {} - +    virtual void EmitGPRel32Value(const MCExpr *Value) {}      virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,                                        unsigned ValueSize = 1,                                        unsigned MaxBytesToEmit = 0) {}  | 

