From dac77fb389d47d188d0ff399889d541c781429b5 Mon Sep 17 00:00:00 2001 From: Matheus Almeida Date: Thu, 27 Mar 2014 11:39:03 +0000 Subject: [PATCH] [mips] Implement custom MCELFStreamer. This allows us to insert some hooks before emitting data into an actual object file. For example, we can capture the register usage for a translation unit by overriding the EmitInstruction method. The register usage information is needed to generate .reginfo and .Mips.options ELF sections. No functional changes. Differential Revision: http://llvm-reviews.chandlerc.com/D3129 llvm-svn: 204917 --- .../Target/Mips/MCTargetDesc/CMakeLists.txt | 1 + .../Mips/MCTargetDesc/MipsELFStreamer.cpp | 19 ++++++++ .../Mips/MCTargetDesc/MipsELFStreamer.h | 43 +++++++++++++++++++ .../Mips/MCTargetDesc/MipsMCTargetDesc.cpp | 4 +- 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 llvm/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp create mode 100644 llvm/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h diff --git a/llvm/lib/Target/Mips/MCTargetDesc/CMakeLists.txt b/llvm/lib/Target/Mips/MCTargetDesc/CMakeLists.txt index f7f54388b4cb..d3e2fd75498c 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/CMakeLists.txt +++ b/llvm/lib/Target/Mips/MCTargetDesc/CMakeLists.txt @@ -1,6 +1,7 @@ add_llvm_library(LLVMMipsDesc MipsAsmBackend.cpp MipsELFObjectWriter.cpp + MipsELFStreamer.cpp MipsMCAsmInfo.cpp MipsMCCodeEmitter.cpp MipsMCExpr.cpp diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp new file mode 100644 index 000000000000..fe378292befb --- /dev/null +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp @@ -0,0 +1,19 @@ +//===-------- MipsELFStreamer.cpp - ELF Object Output ---------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "MipsELFStreamer.h" + +namespace llvm { +MCELFStreamer *createMipsELFStreamer(MCContext &Context, MCAsmBackend &MAB, + raw_ostream &OS, MCCodeEmitter *Emitter, + const MCSubtargetInfo &STI, bool RelaxAll, + bool NoExecStack) { + return new MipsELFStreamer(Context, MAB, OS, Emitter, STI); +} +} diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h new file mode 100644 index 000000000000..aea9440ee7a4 --- /dev/null +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h @@ -0,0 +1,43 @@ +//===-------- MipsELFStreamer.h - ELF Object Output -----------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This is a custom MCELFStreamer which allows us to insert some hooks before +// emitting data into an actual object file. +// +//===----------------------------------------------------------------------===// + +#ifndef MIPSELFSTREAMER_H +#define MIPSELFSTREAMER_H + +#include "llvm/MC/MCELFStreamer.h" +#include "llvm/Support/raw_ostream.h" + +namespace llvm { +class MCAsmBackend; +class MCCodeEmitter; +class MCContext; +class MCSubtargetInfo; + +class MipsELFStreamer : public MCELFStreamer { + const MCSubtargetInfo &STI; + +public: + MipsELFStreamer(MCContext &Context, MCAsmBackend &MAB, raw_ostream &OS, + MCCodeEmitter *Emitter, const MCSubtargetInfo &STI) + : MCELFStreamer(Context, MAB, OS, Emitter), STI(STI) {} + + virtual ~MipsELFStreamer() {} +}; + +MCELFStreamer *createMipsELFStreamer(MCContext &Context, MCAsmBackend &MAB, + raw_ostream &OS, MCCodeEmitter *Emitter, + const MCSubtargetInfo &STI, bool RelaxAll, + bool NoExecStack); +} // namespace llvm. +#endif diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp index b663bf834059..490f03adc37f 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "InstPrinter/MipsInstPrinter.h" +#include "MipsELFStreamer.h" #include "MipsMCAsmInfo.h" #include "MipsMCNaCl.h" #include "MipsMCTargetDesc.h" @@ -112,7 +113,8 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT, bool RelaxAll, bool NoExecStack) { MCStreamer *S; if (!Triple(TT).isOSNaCl()) - S = createELFStreamer(Context, MAB, OS, Emitter, RelaxAll, NoExecStack); + S = createMipsELFStreamer(Context, MAB, OS, Emitter, STI, RelaxAll, + NoExecStack); else S = createMipsNaClELFStreamer(Context, MAB, OS, Emitter, RelaxAll, NoExecStack);