Move expression visitation logic up to MCStreamer.

Remove the duplicate from MCRecordStreamer. No functionality change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211714 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2014-06-25 15:45:33 +00:00
parent 1ca9d7610d
commit c7abd27294
17 changed files with 50 additions and 70 deletions

View File

@ -21,7 +21,7 @@ class MCAssembler;
class MCContext; class MCContext;
class MCSection; class MCSection;
class MCSectionData; class MCSectionData;
class MCObjectStreamer; class MCStreamer;
class MCSymbol; class MCSymbol;
class MCValue; class MCValue;
class raw_ostream; class raw_ostream;
@ -525,7 +525,7 @@ public:
virtual void PrintImpl(raw_ostream &OS) const = 0; virtual void PrintImpl(raw_ostream &OS) const = 0;
virtual bool EvaluateAsRelocatableImpl(MCValue &Res, virtual bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const = 0; const MCAsmLayout *Layout) const = 0;
virtual void visitUsedExpr(MCObjectStreamer& Streamer) const = 0; virtual void visitUsedExpr(MCStreamer& Streamer) const = 0;
virtual const MCSection *FindAssociatedSection() const = 0; virtual const MCSection *FindAssociatedSection() const = 0;
virtual void fixELFSymbolsInTLSFixups(MCAssembler &) const = 0; virtual void fixELFSymbolsInTLSFixups(MCAssembler &) const = 0;

View File

@ -79,8 +79,7 @@ protected:
MCDataFragment *getOrCreateDataFragment() const; MCDataFragment *getOrCreateDataFragment() const;
public: public:
void visitUsedExpr(const MCExpr &Expr); void visitUsedSymbol(const MCSymbol &Sym) override;
void visitUsedSymbol(const MCSymbol &Sym);
MCAssembler &getAssembler() { return *Assembler; } MCAssembler &getAssembler() { return *Assembler; }

View File

@ -214,6 +214,9 @@ protected:
public: public:
virtual ~MCStreamer(); virtual ~MCStreamer();
void visitUsedExpr(const MCExpr &Expr);
virtual void visitUsedSymbol(const MCSymbol &Sym);
void setTargetStreamer(MCTargetStreamer *TS) { void setTargetStreamer(MCTargetStreamer *TS) {
TargetStreamer.reset(TS); TargetStreamer.reset(TS);
} }

View File

@ -605,31 +605,8 @@ namespace {
} }
} }
// FIXME: mostly copied for the obj streamer. void visitUsedSymbol(const MCSymbol &Sym) override {
void AddValueSymbols(const MCExpr *Value) { markUsed(Sym);
switch (Value->getKind()) {
case MCExpr::Target:
// FIXME: What should we do in here?
break;
case MCExpr::Constant:
break;
case MCExpr::Binary: {
const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value);
AddValueSymbols(BE->getLHS());
AddValueSymbols(BE->getRHS());
break;
}
case MCExpr::SymbolRef:
markUsed(cast<MCSymbolRefExpr>(Value)->getSymbol());
break;
case MCExpr::Unary:
AddValueSymbols(cast<MCUnaryExpr>(Value)->getSubExpr());
break;
}
} }
public: public:
@ -650,7 +627,7 @@ namespace {
// Scan for values. // Scan for values.
for (unsigned i = Inst.getNumOperands(); i--; ) for (unsigned i = Inst.getNumOperands(); i--; )
if (Inst.getOperand(i).isExpr()) if (Inst.getOperand(i).isExpr())
AddValueSymbols(Inst.getOperand(i).getExpr()); visitUsedExpr(*Inst.getOperand(i).getExpr());
} }
void EmitLabel(MCSymbol *Symbol) override { void EmitLabel(MCSymbol *Symbol) override {
MCStreamer::EmitLabel(Symbol); MCStreamer::EmitLabel(Symbol);
@ -659,7 +636,7 @@ namespace {
void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override { void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override {
// FIXME: should we handle aliases? // FIXME: should we handle aliases?
markDefined(*Symbol); markDefined(*Symbol);
AddValueSymbols(Value); visitUsedExpr(*Value);
} }
bool EmitSymbolAttribute(MCSymbol *Symbol, bool EmitSymbolAttribute(MCSymbol *Symbol,
MCSymbolAttr Attribute) override { MCSymbolAttr Attribute) override {

View File

@ -87,32 +87,6 @@ void MCObjectStreamer::visitUsedSymbol(const MCSymbol &Sym) {
Assembler->getOrCreateSymbolData(Sym); Assembler->getOrCreateSymbolData(Sym);
} }
void MCObjectStreamer::visitUsedExpr(const MCExpr &Expr) {
switch (Expr.getKind()) {
case MCExpr::Target:
cast<MCTargetExpr>(Expr).visitUsedExpr(*this);
break;
case MCExpr::Constant:
break;
case MCExpr::Binary: {
const MCBinaryExpr &BE = cast<MCBinaryExpr>(Expr);
visitUsedExpr(*BE.getLHS());
visitUsedExpr(*BE.getRHS());
break;
}
case MCExpr::SymbolRef:
visitUsedSymbol(cast<MCSymbolRefExpr>(Expr).getSymbol());
break;
case MCExpr::Unary:
visitUsedExpr(*cast<MCUnaryExpr>(Expr).getSubExpr());
break;
}
}
void MCObjectStreamer::EmitCFISections(bool EH, bool Debug) { void MCObjectStreamer::EmitCFISections(bool EH, bool Debug) {
MCStreamer::EmitCFISections(EH, Debug); MCStreamer::EmitCFISections(EH, Debug);
EmitEHFrame = EH; EmitEHFrame = EH;

View File

@ -614,6 +614,35 @@ void MCStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
TS->emitAssignment(Symbol, Value); TS->emitAssignment(Symbol, Value);
} }
void MCStreamer::visitUsedSymbol(const MCSymbol &Sym) {
}
void MCStreamer::visitUsedExpr(const MCExpr &Expr) {
switch (Expr.getKind()) {
case MCExpr::Target:
cast<MCTargetExpr>(Expr).visitUsedExpr(*this);
break;
case MCExpr::Constant:
break;
case MCExpr::Binary: {
const MCBinaryExpr &BE = cast<MCBinaryExpr>(Expr);
visitUsedExpr(*BE.getLHS());
visitUsedExpr(*BE.getRHS());
break;
}
case MCExpr::SymbolRef:
visitUsedSymbol(cast<MCSymbolRefExpr>(Expr).getSymbol());
break;
case MCExpr::Unary:
visitUsedExpr(*cast<MCUnaryExpr>(Expr).getSubExpr());
break;
}
}
void MCStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {} void MCStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {}
void MCStreamer::EmitThumbFunc(MCSymbol *Func) {} void MCStreamer::EmitThumbFunc(MCSymbol *Func) {}
void MCStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {} void MCStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}

View File

@ -16,7 +16,6 @@
#include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h" #include "llvm/MC/MCContext.h"
#include "llvm/MC/MCELF.h" #include "llvm/MC/MCELF.h"
#include "llvm/MC/MCObjectStreamer.h"
#include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCSymbol.h"
#include "llvm/MC/MCValue.h" #include "llvm/MC/MCValue.h"
#include "llvm/Object/ELF.h" #include "llvm/Object/ELF.h"
@ -82,7 +81,7 @@ void AArch64MCExpr::PrintImpl(raw_ostream &OS) const {
OS << *Expr; OS << *Expr;
} }
void AArch64MCExpr::visitUsedExpr(MCObjectStreamer &Streamer) const { void AArch64MCExpr::visitUsedExpr(MCStreamer &Streamer) const {
Streamer.visitUsedExpr(*getSubExpr()); Streamer.visitUsedExpr(*getSubExpr());
} }

View File

@ -147,7 +147,7 @@ public:
void PrintImpl(raw_ostream &OS) const override; void PrintImpl(raw_ostream &OS) const override;
void visitUsedExpr(MCObjectStreamer &Streamer) const override; void visitUsedExpr(MCStreamer &Streamer) const override;
const MCSection *FindAssociatedSection() const override; const MCSection *FindAssociatedSection() const override;

View File

@ -10,7 +10,6 @@
#include "ARMMCExpr.h" #include "ARMMCExpr.h"
#include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h" #include "llvm/MC/MCContext.h"
#include "llvm/MC/MCObjectStreamer.h"
using namespace llvm; using namespace llvm;
#define DEBUG_TYPE "armmcexpr" #define DEBUG_TYPE "armmcexpr"
@ -42,6 +41,6 @@ ARMMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
return false; return false;
} }
void ARMMCExpr::visitUsedExpr(MCObjectStreamer &Streamer) const { void ARMMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
Streamer.visitUsedExpr(*getSubExpr()); Streamer.visitUsedExpr(*getSubExpr());
} }

View File

@ -59,7 +59,7 @@ public:
void PrintImpl(raw_ostream &OS) const override; void PrintImpl(raw_ostream &OS) const override;
bool EvaluateAsRelocatableImpl(MCValue &Res, bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override; const MCAsmLayout *Layout) const override;
void visitUsedExpr(MCObjectStreamer &Streamer) const override; void visitUsedExpr(MCStreamer &Streamer) const override;
const MCSection *FindAssociatedSection() const override { const MCSection *FindAssociatedSection() const override {
return getSubExpr()->FindAssociatedSection(); return getSubExpr()->FindAssociatedSection();
} }

View File

@ -84,6 +84,6 @@ MipsMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
return getSubExpr()->EvaluateAsRelocatable(Res, Layout); return getSubExpr()->EvaluateAsRelocatable(Res, Layout);
} }
void MipsMCExpr::visitUsedExpr(MCObjectStreamer &Streamer) const { void MipsMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
Streamer.visitUsedExpr(*getSubExpr()); Streamer.visitUsedExpr(*getSubExpr());
} }

View File

@ -49,7 +49,7 @@ public:
void PrintImpl(raw_ostream &OS) const override; void PrintImpl(raw_ostream &OS) const override;
bool EvaluateAsRelocatableImpl(MCValue &Res, bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override; const MCAsmLayout *Layout) const override;
void visitUsedExpr(MCObjectStreamer &Streamer) const override; void visitUsedExpr(MCStreamer &Streamer) const override;
const MCSection *FindAssociatedSection() const override { const MCSection *FindAssociatedSection() const override {
return getSubExpr()->FindAssociatedSection(); return getSubExpr()->FindAssociatedSection();
} }

View File

@ -66,7 +66,7 @@ public:
const MCAsmLayout *Layout) const override { const MCAsmLayout *Layout) const override {
return false; return false;
} }
void visitUsedExpr(MCObjectStreamer &Streamer) const override {}; void visitUsedExpr(MCStreamer &Streamer) const override {};
const MCSection *FindAssociatedSection() const override { const MCSection *FindAssociatedSection() const override {
return nullptr; return nullptr;
} }

View File

@ -128,6 +128,6 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
return true; return true;
} }
void PPCMCExpr::visitUsedExpr(MCObjectStreamer &Streamer) const { void PPCMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
Streamer.visitUsedExpr(*getSubExpr()); Streamer.visitUsedExpr(*getSubExpr());
} }

View File

@ -79,7 +79,7 @@ public:
void PrintImpl(raw_ostream &OS) const override; void PrintImpl(raw_ostream &OS) const override;
bool EvaluateAsRelocatableImpl(MCValue &Res, bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override; const MCAsmLayout *Layout) const override;
void visitUsedExpr(MCObjectStreamer &Streamer) const override; void visitUsedExpr(MCStreamer &Streamer) const override;
const MCSection *FindAssociatedSection() const override { const MCSection *FindAssociatedSection() const override {
return getSubExpr()->FindAssociatedSection(); return getSubExpr()->FindAssociatedSection();
} }

View File

@ -220,6 +220,6 @@ void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
fixELFSymbolsInTLSFixupsImpl(getSubExpr(), Asm); fixELFSymbolsInTLSFixupsImpl(getSubExpr(), Asm);
} }
void SparcMCExpr::visitUsedExpr(MCObjectStreamer &Streamer) const { void SparcMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
Streamer.visitUsedExpr(*getSubExpr()); Streamer.visitUsedExpr(*getSubExpr());
} }

View File

@ -88,7 +88,7 @@ public:
void PrintImpl(raw_ostream &OS) const override; void PrintImpl(raw_ostream &OS) const override;
bool EvaluateAsRelocatableImpl(MCValue &Res, bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override; const MCAsmLayout *Layout) const override;
void visitUsedExpr(MCObjectStreamer &Streamer) const override; void visitUsedExpr(MCStreamer &Streamer) const override;
const MCSection *FindAssociatedSection() const override { const MCSection *FindAssociatedSection() const override {
return getSubExpr()->FindAssociatedSection(); return getSubExpr()->FindAssociatedSection();
} }