summaryrefslogtreecommitdiff
path: root/lib/CodeGen/AsmPrinter/DwarfCFIException.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
commitf0adba9a7ec8a3031876575a6ffb7db5f1b6f855 (patch)
treef07cda2065b28f6cb3847c060743daced66a0a37 /lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
parent7a2bdde0a0eebcd2125055e0eacaca040f0b766c (diff)
downloadllvm-f0adba9a7ec8a3031876575a6ffb7db5f1b6f855.tar.gz
llvm-f0adba9a7ec8a3031876575a6ffb7db5f1b6f855.tar.bz2
llvm-f0adba9a7ec8a3031876575a6ffb7db5f1b6f855.tar.xz
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129571 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter/DwarfCFIException.cpp')
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfCFIException.cpp44
1 files changed, 28 insertions, 16 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp b/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
index 68be2eed8f..8e4cf467b4 100644
--- a/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
@@ -32,6 +32,7 @@
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Support/Dwarf.h"
+#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
@@ -60,11 +61,16 @@ void DwarfCFIException::EndModule() {
// Begin eh frame section.
Asm->OutStreamer.SwitchSection(TLOF.getEHFrameSection());
+ if ((PerEncoding & 0x70) != dwarf::DW_EH_PE_pcrel)
+ return;
+
// Emit references to all used personality functions
const std::vector<const Function*> &Personalities = MMI->getPersonalities();
for (size_t i = 0, e = Personalities.size(); i != e; ++i) {
Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("personality", i));
- Asm->EmitReference(Personalities[i], PerEncoding);
+ const MCSymbol *Sym = Asm->Mang->getSymbol(Personalities[i]);
+ unsigned Size = Asm->TM.getTargetData()->getPointerSize();
+ Asm->OutStreamer.EmitSymbolValue(Sym, Size);
}
}
@@ -77,7 +83,7 @@ void DwarfCFIException::BeginFunction(const MachineFunction *MF) {
shouldEmitTable = !MMI->getLandingPads().empty();
// See if we need frame move info.
- shouldEmitMoves =
+ shouldEmitMoves = MMI->hasDebugInfo() ||
!Asm->MF->getFunction()->doesNotThrow() || UnwindTablesMandatory;
if (shouldEmitMoves || shouldEmitTable)
@@ -87,17 +93,9 @@ void DwarfCFIException::BeginFunction(const MachineFunction *MF) {
shouldEmitTableModule |= shouldEmitTable;
- if (shouldEmitMoves) {
- const TargetFrameLowering *TFL = Asm->TM.getFrameLowering();
+ if (shouldEmitMoves || shouldEmitTable)
Asm->OutStreamer.EmitCFIStartProc();
- // Indicate locations of general callee saved registers in frame.
- std::vector<MachineMove> Moves;
- TFL->getInitialFrameState(Moves);
- Asm->EmitCFIFrameMoves(Moves);
- Asm->EmitCFIFrameMoves(MMI->getFrameMoves());
- }
-
if (!shouldEmitTable)
return;
@@ -112,11 +110,25 @@ void DwarfCFIException::BeginFunction(const MachineFunction *MF) {
// Indicate personality routine, if any.
unsigned PerEncoding = TLOF.getPersonalityEncoding();
- if (PerEncoding != dwarf::DW_EH_PE_omit &&
- MMI->getPersonalities()[MMI->getPersonalityIndex()])
- Asm->OutStreamer.EmitCFIPersonality(Asm->GetTempSymbol("personality",
- MMI->getPersonalityIndex()),
- PerEncoding);
+ const Function *Per = MMI->getPersonalities()[MMI->getPersonalityIndex()];
+ if (PerEncoding == dwarf::DW_EH_PE_omit || !Per)
+ return;
+
+ const MCSymbol *Sym;
+ switch (PerEncoding & 0x70) {
+ default:
+ report_fatal_error("We do not support this DWARF encoding yet!");
+ case dwarf::DW_EH_PE_absptr: {
+ Sym = Asm->Mang->getSymbol(Per);
+ break;
+ }
+ case dwarf::DW_EH_PE_pcrel: {
+ Sym = Asm->GetTempSymbol("personality",
+ MMI->getPersonalityIndex());
+ break;
+ }
+ }
+ Asm->OutStreamer.EmitCFIPersonality(Sym, PerEncoding);
}
/// EndFunction - Gather and emit post-function exception information.