Put each personality function in a section. This fixes the gnu ld warning:

  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
diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index f332d12..3e45cd8 100644
--- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -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"
@@ -176,6 +177,38 @@
                                     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