|
@@ -32,7 +32,6 @@
|
|
#include "llvm/Target/TargetOptions.h"
|
|
#include "llvm/Target/TargetOptions.h"
|
|
#include "llvm/Target/TargetRegisterInfo.h"
|
|
#include "llvm/Target/TargetRegisterInfo.h"
|
|
#include "llvm/Support/Dwarf.h"
|
|
#include "llvm/Support/Dwarf.h"
|
|
-#include "llvm/Support/ErrorHandling.h"
|
|
|
|
#include "llvm/Support/FormattedStream.h"
|
|
#include "llvm/Support/FormattedStream.h"
|
|
#include "llvm/ADT/SmallString.h"
|
|
#include "llvm/ADT/SmallString.h"
|
|
#include "llvm/ADT/StringExtras.h"
|
|
#include "llvm/ADT/StringExtras.h"
|
|
@@ -61,16 +60,11 @@ void DwarfCFIException::EndModule() {
|
|
// Begin eh frame section.
|
|
// Begin eh frame section.
|
|
Asm->OutStreamer.SwitchSection(TLOF.getEHFrameSection());
|
|
Asm->OutStreamer.SwitchSection(TLOF.getEHFrameSection());
|
|
|
|
|
|
- if ((PerEncoding & 0x70) != dwarf::DW_EH_PE_pcrel)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
// Emit references to all used personality functions
|
|
// Emit references to all used personality functions
|
|
const std::vector<const Function*> &Personalities = MMI->getPersonalities();
|
|
const std::vector<const Function*> &Personalities = MMI->getPersonalities();
|
|
for (size_t i = 0, e = Personalities.size(); i != e; ++i) {
|
|
for (size_t i = 0, e = Personalities.size(); i != e; ++i) {
|
|
Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("personality", i));
|
|
Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("personality", i));
|
|
- const MCSymbol *Sym = Asm->Mang->getSymbol(Personalities[i]);
|
|
|
|
- unsigned Size = Asm->TM.getTargetData()->getPointerSize();
|
|
|
|
- Asm->OutStreamer.EmitSymbolValue(Sym, Size);
|
|
|
|
|
|
+ Asm->EmitReference(Personalities[i], PerEncoding);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -93,9 +87,17 @@ void DwarfCFIException::BeginFunction(const MachineFunction *MF) {
|
|
|
|
|
|
shouldEmitTableModule |= shouldEmitTable;
|
|
shouldEmitTableModule |= shouldEmitTable;
|
|
|
|
|
|
- if (shouldEmitMoves || shouldEmitTable)
|
|
|
|
|
|
+ if (shouldEmitMoves) {
|
|
|
|
+ const TargetFrameLowering *TFL = Asm->TM.getFrameLowering();
|
|
Asm->OutStreamer.EmitCFIStartProc();
|
|
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)
|
|
if (!shouldEmitTable)
|
|
return;
|
|
return;
|
|
|
|
|
|
@@ -110,25 +112,11 @@ void DwarfCFIException::BeginFunction(const MachineFunction *MF) {
|
|
|
|
|
|
// Indicate personality routine, if any.
|
|
// Indicate personality routine, if any.
|
|
unsigned PerEncoding = TLOF.getPersonalityEncoding();
|
|
unsigned PerEncoding = TLOF.getPersonalityEncoding();
|
|
- 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);
|
|
|
|
|
|
+ if (PerEncoding != dwarf::DW_EH_PE_omit &&
|
|
|
|
+ MMI->getPersonalities()[MMI->getPersonalityIndex()])
|
|
|
|
+ Asm->OutStreamer.EmitCFIPersonality(Asm->GetTempSymbol("personality",
|
|
|
|
+ MMI->getPersonalityIndex()),
|
|
|
|
+ PerEncoding);
|
|
}
|
|
}
|
|
|
|
|
|
/// EndFunction - Gather and emit post-function exception information.
|
|
/// EndFunction - Gather and emit post-function exception information.
|