[llvm] r174113 - Give the MCStreamer class hierarchy LLVM RTTI facilities for use with

Jim Grosbach grosbach at apple.com
Thu Jan 31 15:36:56 PST 2013


Sweet! Thanks, Chandler.

-Jim

On Jan 31, 2013, at 3:29 PM, Chandler Carruth <chandlerc at gmail.com> wrote:

> Author: chandlerc
> Date: Thu Jan 31 17:29:57 2013
> New Revision: 174113
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=174113&view=rev
> Log:
> Give the MCStreamer class hierarchy LLVM RTTI facilities for use with
> isa<> and dyn_cast<>. In several places, code is already hacking around
> the absence of this, and there seem to be several interfaces that might
> be lifted and/or devirtualized using this.
> 
> This change was based on a discussion with Jim Grosbach about how best
> to handle testing for specific MCStreamer subclasses. He said that this
> was the correct end state, and everything else was too hacky so
> I decided to just make it so.
> 
> No functionality should be changed here, this is just threading the kind
> through all the constructors and setting up the classof overloads.
> 
> Modified:
>    llvm/trunk/include/llvm/MC/MCELFStreamer.h
>    llvm/trunk/include/llvm/MC/MCObjectStreamer.h
>    llvm/trunk/include/llvm/MC/MCStreamer.h
>    llvm/trunk/lib/MC/MCAsmStreamer.cpp
>    llvm/trunk/lib/MC/MCMachOStreamer.cpp
>    llvm/trunk/lib/MC/MCNullStreamer.cpp
>    llvm/trunk/lib/MC/MCObjectStreamer.cpp
>    llvm/trunk/lib/MC/MCPureStreamer.cpp
>    llvm/trunk/lib/MC/MCStreamer.cpp
>    llvm/trunk/lib/MC/WinCOFFStreamer.cpp
>    llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
>    llvm/trunk/tools/lto/LTOModule.cpp
> 
> Modified: llvm/trunk/include/llvm/MC/MCELFStreamer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCELFStreamer.h?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCELFStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCELFStreamer.h Thu Jan 31 17:29:57 2013
> @@ -28,15 +28,20 @@ class MCSymbolData;
> class raw_ostream;
> 
> class MCELFStreamer : public MCObjectStreamer {
> -public:
> -  MCELFStreamer(MCContext &Context, MCAsmBackend &TAB,
> +protected:
> +  MCELFStreamer(StreamerKind Kind, MCContext &Context, MCAsmBackend &TAB,
>                 raw_ostream &OS, MCCodeEmitter *Emitter)
> -    : MCObjectStreamer(Context, TAB, OS, Emitter) {}
> +      : MCObjectStreamer(Kind, Context, TAB, OS, Emitter) {}
> 
> -  MCELFStreamer(MCContext &Context, MCAsmBackend &TAB,
> -                raw_ostream &OS, MCCodeEmitter *Emitter,
> -                MCAssembler *Assembler)
> -    : MCObjectStreamer(Context, TAB, OS, Emitter, Assembler) {}
> +public:
> +  MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
> +                MCCodeEmitter *Emitter)
> +      : MCObjectStreamer(SK_ELFStreamer, Context, TAB, OS, Emitter) {}
> +
> +  MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
> +                MCCodeEmitter *Emitter, MCAssembler *Assembler)
> +      : MCObjectStreamer(SK_ELFStreamer, Context, TAB, OS, Emitter,
> +                         Assembler) {}
> 
>   virtual ~MCELFStreamer();
> 
> @@ -81,6 +86,10 @@ public:
>   virtual void FinishImpl();
>   /// @}
> 
> +  static bool classof(const MCStreamer *S) {
> +    return S->getKind() == SK_ELFStreamer && S->getKind() == SK_ARMELFStreamer;
> +  }
> +
> private:
>   virtual void EmitInstToFragment(const MCInst &Inst);
>   virtual void EmitInstToData(const MCInst &Inst);
> 
> Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCObjectStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCObjectStreamer.h Thu Jan 31 17:29:57 2013
> @@ -38,9 +38,9 @@ class MCObjectStreamer : public MCStream
>   virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame);
> 
> protected:
> -  MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
> +  MCObjectStreamer(StreamerKind Kind, MCContext &Context, MCAsmBackend &TAB,
>                    raw_ostream &_OS, MCCodeEmitter *_Emitter);
> -  MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
> +  MCObjectStreamer(StreamerKind Kind, MCContext &Context, MCAsmBackend &TAB,
>                    raw_ostream &_OS, MCCodeEmitter *_Emitter,
>                    MCAssembler *_Assembler);
>   ~MCObjectStreamer();
> @@ -107,6 +107,10 @@ public:
>   virtual void FinishImpl();
> 
>   /// @}
> +
> +  static bool classof(const MCStreamer *S) {
> +    return S->getKind() >= SK_ELFStreamer && S->getKind() <= SK_WinCOFFStreamer;
> +  }
> };
> 
> } // end namespace llvm
> 
> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Thu Jan 31 17:29:57 2013
> @@ -46,6 +46,22 @@ namespace llvm {
>   /// a .s file, and implementations that write out .o files of various formats.
>   ///
>   class MCStreamer {
> +  public:
> +    enum StreamerKind {
> +      SK_AsmStreamer,
> +      SK_NullStreamer,
> +      SK_RecordStreamer,
> +
> +      // MCObjectStreamer subclasses.
> +      SK_ELFStreamer,
> +      SK_ARMELFStreamer,
> +      SK_MachOStreamer,
> +      SK_PureStreamer,
> +      SK_WinCOFFStreamer
> +    };
> +
> +  private:
> +    const StreamerKind Kind;
>     MCContext &Context;
> 
>     MCStreamer(const MCStreamer&) LLVM_DELETED_FUNCTION;
> @@ -74,7 +90,7 @@ namespace llvm {
>     bool AutoInitSections;
> 
>   protected:
> -    MCStreamer(MCContext &Ctx);
> +    MCStreamer(StreamerKind Kind, MCContext &Ctx);
> 
>     const MCExpr *BuildSymbolDiff(MCContext &Context, const MCSymbol *A,
>                                   const MCSymbol *B);
> @@ -93,6 +109,8 @@ namespace llvm {
>   public:
>     virtual ~MCStreamer();
> 
> +    StreamerKind getKind() const { return Kind; }
> +
>     /// State management
>     ///
>     virtual void reset();
> 
> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Thu Jan 31 17:29:57 2013
> @@ -71,7 +71,7 @@ public:
>                 MCInstPrinter *printer, MCCodeEmitter *emitter,
>                 MCAsmBackend *asmbackend,
>                 bool showInst)
> -    : MCStreamer(Context), OS(os), MAI(Context.getAsmInfo()),
> +    : MCStreamer(SK_AsmStreamer, Context), OS(os), MAI(Context.getAsmInfo()),
>       InstPrinter(printer), Emitter(emitter), AsmBackend(asmbackend),
>       CommentStream(CommentToEmit), IsVerboseAsm(isVerboseAsm),
>       ShowInst(showInst), UseLoc(useLoc), UseCFI(useCFI),
> @@ -277,6 +277,10 @@ public:
>   virtual void FinishImpl();
> 
>   /// @}
> +
> +  static bool classof(const MCStreamer *S) {
> +    return S->getKind() == SK_NullStreamer;
> +  }
> };
> 
> } // end anonymous namespace.
> 
> Modified: llvm/trunk/lib/MC/MCMachOStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCMachOStreamer.cpp?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCMachOStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCMachOStreamer.cpp Thu Jan 31 17:29:57 2013
> @@ -34,9 +34,9 @@ private:
>   void EmitDataRegion(DataRegionData::KindTy Kind);
>   void EmitDataRegionEnd();
> public:
> -  MCMachOStreamer(MCContext &Context, MCAsmBackend &MAB,
> -                  raw_ostream &OS, MCCodeEmitter *Emitter)
> -    : MCObjectStreamer(Context, MAB, OS, Emitter) {}
> +  MCMachOStreamer(MCContext &Context, MCAsmBackend &MAB, raw_ostream &OS,
> +                  MCCodeEmitter *Emitter)
> +      : MCObjectStreamer(SK_MachOStreamer, Context, MAB, OS, Emitter) {}
> 
>   /// @name MCStreamer Interface
>   /// @{
> @@ -87,6 +87,10 @@ public:
>   virtual void FinishImpl();
> 
>   /// @}
> +
> +  static bool classof(const MCStreamer *S) {
> +    return S->getKind() == SK_MachOStreamer;
> +  }
> };
> 
> } // end anonymous namespace.
> 
> Modified: llvm/trunk/lib/MC/MCNullStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCNullStreamer.cpp?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCNullStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCNullStreamer.cpp Thu Jan 31 17:29:57 2013
> @@ -19,7 +19,7 @@ namespace {
> 
>   class MCNullStreamer : public MCStreamer {
>   public:
> -    MCNullStreamer(MCContext &Context) : MCStreamer(Context) {}
> +    MCNullStreamer(MCContext &Context) : MCStreamer(SK_NullStreamer, Context) {}
> 
>     /// @name MCStreamer Interface
>     /// @{
> @@ -109,6 +109,11 @@ namespace {
>     }
> 
>     /// @}
> +
> +    static bool classof(const MCStreamer *S) {
> +      return S->getKind() == SK_NullStreamer;
> +    }
> +
>   };
> 
> }
> 
> Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Thu Jan 31 17:29:57 2013
> @@ -20,22 +20,19 @@
> #include "llvm/Support/ErrorHandling.h"
> using namespace llvm;
> 
> -MCObjectStreamer::MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
> -                                   raw_ostream &OS, MCCodeEmitter *Emitter_)
> -  : MCStreamer(Context),
> -    Assembler(new MCAssembler(Context, TAB,
> -                              *Emitter_, *TAB.createObjectWriter(OS),
> -                              OS)),
> -    CurSectionData(0)
> -{
> -}
> -
> -MCObjectStreamer::MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
> -                                   raw_ostream &OS, MCCodeEmitter *Emitter_,
> +MCObjectStreamer::MCObjectStreamer(StreamerKind Kind, MCContext &Context,
> +                                   MCAsmBackend &TAB, raw_ostream &OS,
> +                                   MCCodeEmitter *Emitter_)
> +    : MCStreamer(Kind, Context),
> +      Assembler(new MCAssembler(Context, TAB, *Emitter_,
> +                                *TAB.createObjectWriter(OS), OS)),
> +      CurSectionData(0) {}
> +
> +MCObjectStreamer::MCObjectStreamer(StreamerKind Kind, MCContext &Context,
> +                                   MCAsmBackend &TAB, raw_ostream &OS,
> +                                   MCCodeEmitter *Emitter_,
>                                    MCAssembler *_Assembler)
> -  : MCStreamer(Context), Assembler(_Assembler), CurSectionData(0)
> -{
> -}
> +    : MCStreamer(Kind, Context), Assembler(_Assembler), CurSectionData(0) {}
> 
> MCObjectStreamer::~MCObjectStreamer() {
>   delete &Assembler->getBackend();
> 
> Modified: llvm/trunk/lib/MC/MCPureStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCPureStreamer.cpp?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCPureStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCPureStreamer.cpp Thu Jan 31 17:29:57 2013
> @@ -28,9 +28,9 @@ private:
>   virtual void EmitInstToData(const MCInst &Inst);
> 
> public:
> -  MCPureStreamer(MCContext &Context, MCAsmBackend &TAB,
> -                 raw_ostream &OS, MCCodeEmitter *Emitter)
> -    : MCObjectStreamer(Context, TAB, OS, Emitter) {}
> +  MCPureStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
> +                 MCCodeEmitter *Emitter)
> +      : MCObjectStreamer(SK_PureStreamer, Context, TAB, OS, Emitter) {}
> 
>   /// @name MCStreamer Interface
>   /// @{
> @@ -100,6 +100,10 @@ public:
>   }
> 
>   /// @}
> +
> +  static bool classof(const MCStreamer *S) {
> +    return S->getKind() == SK_PureStreamer;
> +  }
> };
> 
> } // end anonymous namespace.
> 
> Modified: llvm/trunk/lib/MC/MCStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCStreamer.cpp Thu Jan 31 17:29:57 2013
> @@ -21,10 +21,9 @@
> #include <cstdlib>
> using namespace llvm;
> 
> -MCStreamer::MCStreamer(MCContext &Ctx)
> -  : Context(Ctx), EmitEHFrame(true), EmitDebugFrame(false),
> -    CurrentW64UnwindInfo(0), LastSymbol(0),
> -    AutoInitSections(false) {
> +MCStreamer::MCStreamer(StreamerKind Kind, MCContext &Ctx)
> +    : Kind(Kind), Context(Ctx), EmitEHFrame(true), EmitDebugFrame(false),
> +      CurrentW64UnwindInfo(0), LastSymbol(0), AutoInitSections(false) {
>   const MCSection *section = NULL;
>   SectionStack.push_back(std::make_pair(section, section));
> }
> 
> Modified: llvm/trunk/lib/MC/WinCOFFStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFStreamer.cpp?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/WinCOFFStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/WinCOFFStreamer.cpp Thu Jan 31 17:29:57 2013
> @@ -75,6 +75,10 @@ public:
>   virtual void EmitWin64EHHandlerData();
>   virtual void FinishImpl();
> 
> +  static bool classof(const MCStreamer *S) {
> +    return S->getKind() == SK_WinCOFFStreamer;
> +  }
> +
> private:
>   virtual void EmitInstToData(const MCInst &Inst) {
>     MCDataFragment *DF = getOrCreateDataFragment();
> @@ -128,13 +132,10 @@ private:
> };
> } // end anonymous namespace.
> 
> -WinCOFFStreamer::WinCOFFStreamer(MCContext &Context,
> -                                 MCAsmBackend &MAB,
> -                                 MCCodeEmitter &CE,
> -                                 raw_ostream &OS)
> -    : MCObjectStreamer(Context, MAB, OS, &CE)
> -    , CurSymbol(NULL) {
> -}
> +WinCOFFStreamer::WinCOFFStreamer(MCContext &Context, MCAsmBackend &MAB,
> +                                 MCCodeEmitter &CE, raw_ostream &OS)
> +    : MCObjectStreamer(SK_WinCOFFStreamer, Context, MAB, OS, &CE),
> +      CurSymbol(NULL) {}
> 
> void WinCOFFStreamer::AddCommonSymbol(MCSymbol *Symbol, uint64_t Size,
>                                       unsigned ByteAlignment, bool External) {
> 
> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp Thu Jan 31 17:29:57 2013
> @@ -54,12 +54,11 @@ namespace {
> /// by MachO. Beware!
> class ARMELFStreamer : public MCELFStreamer {
> public:
> -  ARMELFStreamer(MCContext &Context, MCAsmBackend &TAB,
> -                 raw_ostream &OS, MCCodeEmitter *Emitter, bool IsThumb)
> -    : MCELFStreamer(Context, TAB, OS, Emitter),
> -      IsThumb(IsThumb), MappingSymbolCounter(0), LastEMS(EMS_None),
> -      ExTab(0), FnStart(0), Personality(0), CantUnwind(false) {
> -  }
> +  ARMELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
> +                 MCCodeEmitter *Emitter, bool IsThumb)
> +      : MCELFStreamer(SK_ARMELFStreamer, Context, TAB, OS, Emitter),
> +        IsThumb(IsThumb), MappingSymbolCounter(0), LastEMS(EMS_None), ExTab(0),
> +        FnStart(0), Personality(0), CantUnwind(false) {}
> 
>   ~ARMELFStreamer() {}
> 
> @@ -134,6 +133,10 @@ public:
>     }
>   }
> 
> +  static bool classof(const MCStreamer *S) {
> +    return S->getKind() == SK_ARMELFStreamer;
> +  }
> +
> private:
>   enum ElfMappingSymbol {
>     EMS_None,
> 
> Modified: llvm/trunk/tools/lto/LTOModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOModule.cpp?rev=174113&r1=174112&r2=174113&view=diff
> ==============================================================================
> --- llvm/trunk/tools/lto/LTOModule.cpp (original)
> +++ llvm/trunk/tools/lto/LTOModule.cpp Thu Jan 31 17:29:57 2013
> @@ -733,7 +733,8 @@ namespace {
>       return Symbols.end();
>     }
> 
> -    RecordStreamer(MCContext &Context) : MCStreamer(Context) {}
> +    RecordStreamer(MCContext &Context)
> +        : MCStreamer(SK_RecordStreamer, Context) {}
> 
>     virtual void EmitInstruction(const MCInst &Inst) {
>       // Scan for values.
> @@ -804,6 +805,10 @@ namespace {
>                                           const MCSymbol *Label,
>                                           unsigned PointerSize) {}
>     virtual void FinishImpl() {}
> +
> +    static bool classof(const MCStreamer *S) {
> +      return S->getKind == SK_RecordStreamer;
> +    }
>   };
> } // end anonymous namespace
> 
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list