aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2011-04-30 03:44:37 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2011-04-30 03:44:37 +0000
commitf1a5c7ec04002769f1638e64f7439589f0f926e6 (patch)
treefb8c17ee530e039a738611d8de2ee46488c2ca73 /lib
parenta37bd1d02c0e3d93474fdf30352bf4a425cbe25b (diff)
downloadexternal_llvm-f1a5c7ec04002769f1638e64f7439589f0f926e6.tar.gz
external_llvm-f1a5c7ec04002769f1638e64f7439589f0f926e6.tar.bz2
external_llvm-f1a5c7ec04002769f1638e64f7439589f0f926e6.zip
Add all the plumbing needed for MC to expand cfi to the old tables in
the final assembly. It is the same technique used when targeting assemblers that don't support .loc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130587 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/LLVMTargetMachine.cpp1
-rw-r--r--lib/MC/MCAsmStreamer.cpp48
-rw-r--r--lib/Target/PTX/PTXMCAsmStreamer.cpp2
-rw-r--r--lib/Target/PTX/PTXTargetMachine.cpp1
-rw-r--r--lib/Target/TargetMachine.cpp3
5 files changed, 49 insertions, 6 deletions
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp
index 8c2794a729..e1dad2efa9 100644
--- a/lib/CodeGen/LLVMTargetMachine.cpp
+++ b/lib/CodeGen/LLVMTargetMachine.cpp
@@ -149,6 +149,7 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
MCStreamer *S = getTarget().createAsmStreamer(*Context, Out,
getVerboseAsm(),
hasMCUseLoc(),
+ hasMCUseCFI(),
InstPrinter,
MCE, TAB,
ShowMCInst);
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);
}
diff --git a/lib/Target/PTX/PTXMCAsmStreamer.cpp b/lib/Target/PTX/PTXMCAsmStreamer.cpp
index 0d1f7846ef..63bac790cc 100644
--- a/lib/Target/PTX/PTXMCAsmStreamer.cpp
+++ b/lib/Target/PTX/PTXMCAsmStreamer.cpp
@@ -531,7 +531,7 @@ void PTXMCAsmStreamer::Finish() {}
namespace llvm {
MCStreamer *createPTXAsmStreamer(MCContext &Context,
formatted_raw_ostream &OS,
- bool isVerboseAsm, bool useLoc,
+ bool isVerboseAsm, bool useLoc, bool useCFI,
MCInstPrinter *IP,
MCCodeEmitter *CE, TargetAsmBackend *TAB,
bool ShowInst) {
diff --git a/lib/Target/PTX/PTXTargetMachine.cpp b/lib/Target/PTX/PTXTargetMachine.cpp
index 78a7b0daf1..1b737c9d86 100644
--- a/lib/Target/PTX/PTXTargetMachine.cpp
+++ b/lib/Target/PTX/PTXTargetMachine.cpp
@@ -23,6 +23,7 @@ using namespace llvm;
namespace llvm {
MCStreamer *createPTXAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
bool isVerboseAsm, bool useLoc,
+ bool useCFI,
MCInstPrinter *InstPrint,
MCCodeEmitter *CE,
TargetAsmBackend *TAB,
diff --git a/lib/Target/TargetMachine.cpp b/lib/Target/TargetMachine.cpp
index 4a1ac94826..76ccc09195 100644
--- a/lib/Target/TargetMachine.cpp
+++ b/lib/Target/TargetMachine.cpp
@@ -227,7 +227,8 @@ TargetMachine::TargetMachine(const Target &T)
MCRelaxAll(false),
MCNoExecStack(false),
MCSaveTempLabels(false),
- MCUseLoc(true) {
+ MCUseLoc(true),
+ MCUseCFI(true) {
// Typically it will be subtargets that will adjust FloatABIType from Default
// to Soft or Hard.
if (UseSoftFloat)