Skip to content

Commit

Permalink
Put each personality function in a section. This fixes the gnu ld war…
Browse files Browse the repository at this point in the history
…ning:

  error in foo.o; no .eh_frame_hdr table will be created.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129635 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
espindola committed Apr 16, 2011
1 parent c5eecbc commit 30deafc
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 8 deletions.
5 changes: 5 additions & 0 deletions include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,11 @@ class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);

virtual const MCSection *getEHFrameSection() const;
virtual MCSymbol *getPersonalityPICSymbol(StringRef Name) const;

virtual void emitPersonalityValue(MCStreamer &Streamer,
const TargetMachine &TM,
const MCSymbol *Sym) const;

const MCSection *getDataRelSection() const { return DataRelSection; }

Expand Down
4 changes: 4 additions & 0 deletions include/llvm/Target/TargetLoweringObjectFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,10 @@ class TargetLoweringObjectFile {
const MCSection *getStaticDtorSection() const { return StaticDtorSection; }
const MCSection *getLSDASection() const { return LSDASection; }
virtual const MCSection *getEHFrameSection() const = 0;
virtual MCSymbol *getPersonalityPICSymbol(StringRef Name) const;
virtual void emitPersonalityValue(MCStreamer &Streamer,
const TargetMachine &TM,
const MCSymbol *Sym) const;
const MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; }
const MCSection *getDwarfInfoSection() const { return DwarfInfoSection; }
const MCSection *getDwarfLineSection() const { return DwarfLineSection; }
Expand Down
11 changes: 3 additions & 8 deletions lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,19 +58,14 @@ void DwarfCFIException::EndModule() {
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
unsigned PerEncoding = TLOF.getPersonalityEncoding();

// 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));
const MCSymbol *Sym = Asm->Mang->getSymbol(Personalities[i]);
unsigned Size = Asm->TM.getTargetData()->getPointerSize();
Asm->OutStreamer.EmitSymbolValue(Sym, Size);
TLOF.emitPersonalityValue(Asm->OutStreamer, Asm->TM, Sym);
}
}

Expand Down Expand Up @@ -123,8 +118,8 @@ void DwarfCFIException::BeginFunction(const MachineFunction *MF) {
break;
}
case dwarf::DW_EH_PE_pcrel: {
Sym = Asm->GetTempSymbol("personality",
MMI->getPersonalityIndex());
MCContext &Context = Asm->OutStreamer.getContext();
Sym = TLOF.getPersonalityPICSymbol(Per->getName());
break;
}
}
Expand Down
33 changes: 33 additions & 0 deletions lib/CodeGen/TargetLoweringObjectFileImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCSectionCOFF.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/Mangler.h"
#include "llvm/Target/TargetData.h"
Expand Down Expand Up @@ -176,6 +177,38 @@ const MCSection *TargetLoweringObjectFileELF::getEHFrameSection() const {
SectionKind::getDataRel());
}

MCSymbol *
TargetLoweringObjectFileELF::getPersonalityPICSymbol(StringRef Name) const {
Twine FullName = StringRef("DW.ref.") + Name;
return getContext().GetOrCreateSymbol(FullName);
}

void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
const TargetMachine &TM,
const MCSymbol *Sym) const {
MCSymbol *Label = getPersonalityPICSymbol(Sym->getName());
Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
Twine SectionName = StringRef(".data.") + Label->getName();
SmallString<64> NameData;
SectionName.toVector(NameData);
unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
const MCSection *Sec = getContext().getELFSection(NameData,
ELF::SHT_PROGBITS,
Flags,
SectionKind::getDataRel(),
0, Label->getName());
Streamer.SwitchSection(Sec);
Streamer.EmitValueToAlignment(8);
Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
const MCExpr *E = MCConstantExpr::Create(8, getContext());
Streamer.EmitELFSize(Label, E);
Streamer.EmitLabel(Label);

unsigned Size = TM.getTargetData()->getPointerSize();
Streamer.EmitSymbolValue(Sym, Size);
}

static SectionKind
getELFKindForNamedSection(StringRef Name, SectionKind K) {
// FIXME: Why is this here? Codegen is should not be in the business
Expand Down
12 changes: 12 additions & 0 deletions lib/Target/TargetLoweringObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,18 @@ static bool IsNullTerminatedString(const Constant *C) {
return false;
}

MCSymbol *
TargetLoweringObjectFile::getPersonalityPICSymbol(StringRef Name) const {
assert(0 && "Not Available in this format.");
}

void TargetLoweringObjectFile::emitPersonalityValue(MCStreamer &Streamer,
const TargetMachine &TM,
const MCSymbol *Sym) const {
assert(0 && "Not Available in this format.");
}


/// getKindForGlobal - This is a top-level target-independent classifier for
/// a global variable. Given an global variable and information from TM, it
/// classifies the global in a variety of ways that make various target
Expand Down

0 comments on commit 30deafc

Please sign in to comment.