aboutsummaryrefslogtreecommitdiffstats
path: root/lib/MC/MCAsmStreamer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/MC/MCAsmStreamer.cpp')
-rw-r--r--lib/MC/MCAsmStreamer.cpp48
1 files changed, 44 insertions, 4 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index 2538475e4e..b0b948e2b9 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -45,20 +45,20 @@ class MCAsmStreamer : public MCStreamer {
unsigned IsVerboseAsm : 1;
unsigned ShowInst : 1;
unsigned UseLoc : 1;
+ unsigned UseCFI : 1;
bool needsSet(const MCExpr *Value);
public:
MCAsmStreamer(MCContext &Context, formatted_raw_ostream &os,
- bool isVerboseAsm,
- bool useLoc,
+ bool isVerboseAsm, bool useLoc, bool useCFI,
MCInstPrinter *printer, MCCodeEmitter *emitter,
TargetAsmBackend *asmbackend,
bool showInst)
: MCStreamer(Context), OS(os), MAI(Context.getAsmInfo()),
InstPrinter(printer), Emitter(emitter), AsmBackend(asmbackend),
CommentStream(CommentToEmit), IsVerboseAsm(isVerboseAsm),
- ShowInst(showInst), UseLoc(useLoc) {
+ ShowInst(showInst), UseLoc(useLoc), UseCFI(useCFI) {
if (InstPrinter && IsVerboseAsm)
InstPrinter->setCommentStream(CommentStream);
}
@@ -740,6 +740,9 @@ void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
void MCAsmStreamer::EmitCFIStartProc() {
MCStreamer::EmitCFIStartProc();
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_startproc";
EmitEOL();
}
@@ -747,6 +750,9 @@ void MCAsmStreamer::EmitCFIStartProc() {
void MCAsmStreamer::EmitCFIEndProc() {
MCStreamer::EmitCFIEndProc();
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_endproc";
EmitEOL();
}
@@ -754,6 +760,9 @@ void MCAsmStreamer::EmitCFIEndProc() {
void MCAsmStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {
MCStreamer::EmitCFIDefCfa(Register, Offset);
+ if (!UseCFI)
+ return;
+
OS << ".cfi_def_cfa " << Register << ", " << Offset;
EmitEOL();
}
@@ -761,6 +770,9 @@ void MCAsmStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {
void MCAsmStreamer::EmitCFIDefCfaOffset(int64_t Offset) {
MCStreamer::EmitCFIDefCfaOffset(Offset);
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_def_cfa_offset " << Offset;
EmitEOL();
}
@@ -768,6 +780,9 @@ void MCAsmStreamer::EmitCFIDefCfaOffset(int64_t Offset) {
void MCAsmStreamer::EmitCFIDefCfaRegister(int64_t Register) {
MCStreamer::EmitCFIDefCfaRegister(Register);
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_def_cfa_register " << Register;
EmitEOL();
}
@@ -775,6 +790,9 @@ void MCAsmStreamer::EmitCFIDefCfaRegister(int64_t Register) {
void MCAsmStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) {
this->MCStreamer::EmitCFIOffset(Register, Offset);
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_offset " << Register << ", " << Offset;
EmitEOL();
}
@@ -783,6 +801,9 @@ void MCAsmStreamer::EmitCFIPersonality(const MCSymbol *Sym,
unsigned Encoding) {
MCStreamer::EmitCFIPersonality(Sym, Encoding);
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_personality " << Encoding << ", " << *Sym;
EmitEOL();
}
@@ -790,6 +811,9 @@ void MCAsmStreamer::EmitCFIPersonality(const MCSymbol *Sym,
void MCAsmStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
MCStreamer::EmitCFILsda(Sym, Encoding);
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_lsda " << Encoding << ", " << *Sym;
EmitEOL();
}
@@ -797,6 +821,9 @@ void MCAsmStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
void MCAsmStreamer::EmitCFIRememberState() {
MCStreamer::EmitCFIRememberState();
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_remember_state";
EmitEOL();
}
@@ -804,6 +831,9 @@ void MCAsmStreamer::EmitCFIRememberState() {
void MCAsmStreamer::EmitCFIRestoreState() {
MCStreamer::EmitCFIRestoreState();
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_restore_state";
EmitEOL();
}
@@ -811,6 +841,9 @@ void MCAsmStreamer::EmitCFIRestoreState() {
void MCAsmStreamer::EmitCFISameValue(int64_t Register) {
MCStreamer::EmitCFISameValue(Register);
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_same_value " << Register;
EmitEOL();
}
@@ -818,6 +851,9 @@ void MCAsmStreamer::EmitCFISameValue(int64_t Register) {
void MCAsmStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {
MCStreamer::EmitCFIRelOffset(Register, Offset);
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_rel_offset " << Register << ", " << Offset;
EmitEOL();
}
@@ -825,6 +861,9 @@ void MCAsmStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {
void MCAsmStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {
MCStreamer::EmitCFIAdjustCfaOffset(Adjustment);
+ if (!UseCFI)
+ return;
+
OS << "\t.cfi_adjust_cfa_offset " << Adjustment;
EmitEOL();
}
@@ -1008,8 +1047,9 @@ void MCAsmStreamer::Finish() {
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
formatted_raw_ostream &OS,
bool isVerboseAsm, bool useLoc,
+ bool useCFI,
MCInstPrinter *IP, MCCodeEmitter *CE,
TargetAsmBackend *TAB, bool ShowInst) {
- return new MCAsmStreamer(Context, OS, isVerboseAsm, useLoc,
+ return new MCAsmStreamer(Context, OS, isVerboseAsm, useLoc, useCFI,
IP, CE, TAB, ShowInst);
}