summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2011-04-15 15:11:06 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2011-04-15 15:11:06 +0000
commita01cdb0e37e090c5c99db39bc1802a451bc4ecfa (patch)
tree4a8db4fe4f7d9862169a7e5e2976015c64907de3 /llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
parent6826eb816a847faf476473dfc853316c5f2e1930 (diff)
downloadbcm5719-llvm-a01cdb0e37e090c5c99db39bc1802a451bc4ecfa.tar.gz
bcm5719-llvm-a01cdb0e37e090c5c99db39bc1802a451bc4ecfa.zip
Add 129518 back with a fix for when we are producing eh just because of debug info.
Change ELF systems to use CFI for producing the EH tables. This reduces the size of the clang binary in Debug builds from 690MB to 679MB. llvm-svn: 129571
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 3d3abc2fed2..baf11a77db3 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -33,6 +33,7 @@
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/Mangler.h"
+#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetLowering.h"
@@ -624,6 +625,45 @@ static bool EmitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) {
return true;
}
+void AsmPrinter::emitPrologLabel(const MachineInstr &MI) {
+ MCSymbol *Label = MI.getOperand(0).getMCSymbol();
+ if (MAI->getExceptionHandlingType() != ExceptionHandling::DwarfCFI) {
+ OutStreamer.EmitLabel(Label);
+ return;
+ }
+
+ const MachineFunction &MF = *MI.getParent()->getParent();
+ MachineModuleInfo &MMI = MF.getMMI();
+ std::vector<MachineMove> &Moves = MMI.getFrameMoves();
+ const MachineMove *Move = NULL;
+ for (std::vector<MachineMove>::iterator I = Moves.begin(),
+ E = Moves.end(); I != E; ++I) {
+ if (I->getLabel() == Label) {
+ Move = &*I;
+ break;
+ }
+ }
+ assert(Move);
+
+ const MachineLocation &Dst = Move->getDestination();
+ const MachineLocation &Src = Move->getSource();
+ const TargetAsmInfo &AsmInfo = OutContext.getTargetAsmInfo();
+ if (Dst.isReg() && Dst.getReg() == MachineLocation::VirtualFP) {
+ if (Src.getReg() == MachineLocation::VirtualFP)
+ OutStreamer.EmitCFIDefCfaOffset(-Src.getOffset());
+ else {
+ unsigned Reg = AsmInfo.getDwarfRegNum(Src.getReg(), true);
+ OutStreamer.EmitCFIDefCfa(Reg, -Src.getOffset());
+ }
+ } else if (Src.isReg() && Src.getReg() == MachineLocation::VirtualFP) {
+ unsigned Reg = AsmInfo.getDwarfRegNum(Dst.getReg(), true);
+ OutStreamer.EmitCFIDefCfaRegister(Reg);
+ } else {
+ unsigned Reg = AsmInfo.getDwarfRegNum(Src.getReg(), true);
+ OutStreamer.EmitCFIOffset(Reg, -Dst.getOffset());
+ }
+}
+
/// EmitFunctionBody - This method emits the body and trailer for a
/// function.
void AsmPrinter::EmitFunctionBody() {
@@ -660,6 +700,9 @@ void AsmPrinter::EmitFunctionBody() {
switch (II->getOpcode()) {
case TargetOpcode::PROLOG_LABEL:
+ emitPrologLabel(*II);
+ break;
+
case TargetOpcode::EH_LABEL:
case TargetOpcode::GC_LABEL:
OutStreamer.EmitLabel(II->getOperand(0).getMCSymbol());
OpenPOWER on IntegriCloud