diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2010-03-16 16:51:38 +0000 | 
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2010-03-16 16:51:38 +0000 | 
| commit | c69102774f9739c81ae1285ed9ae62405071c63c (patch) | |
| tree | 458dd25677a43aef6390ecadb4423817f00e08b0 /lib/Target/TargetLoweringObjectFile.cpp | |
| parent | ea5b2dd11c0526581803e7eb58224a2eabf191e6 (diff) | |
Notes
Diffstat (limited to 'lib/Target/TargetLoweringObjectFile.cpp')
| -rw-r--r-- | lib/Target/TargetLoweringObjectFile.cpp | 44 | 
1 files changed, 19 insertions, 25 deletions
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 8c12039516b59..a093e2db8b2e7 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -19,6 +19,7 @@  #include "llvm/GlobalVariable.h"  #include "llvm/MC/MCContext.h"  #include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCStreamer.h"  #include "llvm/MC/MCSymbol.h"  #include "llvm/Target/Mangler.h"  #include "llvm/Target/TargetData.h" @@ -290,45 +291,38 @@ TargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {    return DataSection;  } -/// getSymbolForDwarfGlobalReference - Return an MCExpr to use for a +/// getExprForDwarfGlobalReference - Return an MCExpr to use for a  /// reference to the specified global variable from exception  /// handling information.  const MCExpr *TargetLoweringObjectFile:: -getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, -                             MachineModuleInfo *MMI, unsigned Encoding) const { -  // FIXME: Use GetGlobalValueSymbol. -  SmallString<128> Name; -  Mang->getNameWithPrefix(Name, GV, false); -  const MCSymbol *Sym; -   -  if (GV->hasPrivateLinkage()) -    Sym = getContext().GetOrCreateTemporarySymbol(Name.str()); -  else -    Sym = getContext().GetOrCreateSymbol(Name.str()); - -  return getSymbolForDwarfReference(Sym, MMI, Encoding); +getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, +                               MachineModuleInfo *MMI, unsigned Encoding, +                               MCStreamer &Streamer) const { +  const MCSymbol *Sym = Mang->getSymbol(GV); +  return getExprForDwarfReference(Sym, Mang, MMI, Encoding, Streamer);  }  const MCExpr *TargetLoweringObjectFile:: -getSymbolForDwarfReference(const MCSymbol *Sym, MachineModuleInfo *MMI, -                           unsigned Encoding) const { +getExprForDwarfReference(const MCSymbol *Sym, Mangler *Mang, +                         MachineModuleInfo *MMI, unsigned Encoding, +                         MCStreamer &Streamer) const {    const MCExpr *Res = MCSymbolRefExpr::Create(Sym, getContext());    switch (Encoding & 0xF0) {    default:      llvm_report_error("We do not support this DWARF encoding yet!"); -    break;    case dwarf::DW_EH_PE_absptr:      // Do nothing special -    break; -  case dwarf::DW_EH_PE_pcrel: -    // FIXME: PCSymbol -    const MCExpr *PC = MCSymbolRefExpr::Create(".", getContext()); -    Res = MCBinaryExpr::CreateSub(Res, PC, getContext()); -    break; +    return Res; +  case dwarf::DW_EH_PE_pcrel: { +    // Emit a label to the streamer for the current position.  This gives us +    // .-foo addressing. +    MCSymbol *PCSym = getContext().GetOrCreateTemporarySymbol(); +    Streamer.EmitLabel(PCSym); +    const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, getContext()); +    return MCBinaryExpr::CreateSub(Res, PC, getContext()); +  }    } - -  return Res;  }  unsigned TargetLoweringObjectFile::getPersonalityEncoding() const {  | 
