diff options
Diffstat (limited to 'contrib/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp | 49 | 
1 files changed, 35 insertions, 14 deletions
diff --git a/contrib/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp b/contrib/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp index f8f21198a4f9..4069038dffe7 100644 --- a/contrib/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp +++ b/contrib/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp @@ -6,26 +6,47 @@  // License. See LICENSE.TXT for details.  //  //===----------------------------------------------------------------------===// -// -// This file deals with any AArch64 specific requirements on object files. -// -//===----------------------------------------------------------------------===// -  #include "AArch64TargetObjectFile.h" - +#include "AArch64TargetMachine.h" +#include "llvm/IR/Mangler.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCStreamer.h" +#include "llvm/Support/Dwarf.h"  using namespace llvm; +using namespace dwarf; -void -AArch64LinuxTargetObjectFile::Initialize(MCContext &Ctx, -                                         const TargetMachine &TM) { +void AArch64_ELFTargetObjectFile::Initialize(MCContext &Ctx, +                                             const TargetMachine &TM) {    TargetLoweringObjectFileELF::Initialize(Ctx, TM);    InitializeELF(TM.Options.UseInitArray);  } -void -AArch64ElfTargetObjectFile::Initialize(MCContext &Ctx, -                                       const TargetMachine &TM) { -  TargetLoweringObjectFileELF::Initialize(Ctx, TM); -  InitializeELF(TM.Options.UseInitArray); +const MCExpr *AArch64_MachoTargetObjectFile::getTTypeGlobalReference( +    const GlobalValue *GV, unsigned Encoding, Mangler &Mang, +    const TargetMachine &TM, MachineModuleInfo *MMI, +    MCStreamer &Streamer) const { +  // On Darwin, we can reference dwarf symbols with foo@GOT-., which +  // is an indirect pc-relative reference. The default implementation +  // won't reference using the GOT, so we need this target-specific +  // version. +  if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) { +    const MCSymbol *Sym = TM.getSymbol(GV, Mang); +    const MCExpr *Res = +        MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOT, getContext()); +    MCSymbol *PCSym = getContext().CreateTempSymbol(); +    Streamer.EmitLabel(PCSym); +    const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, getContext()); +    return MCBinaryExpr::CreateSub(Res, PC, getContext()); +  } + +  return TargetLoweringObjectFileMachO::getTTypeGlobalReference( +      GV, Encoding, Mang, TM, MMI, Streamer); +} + +MCSymbol *AArch64_MachoTargetObjectFile::getCFIPersonalitySymbol( +    const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM, +    MachineModuleInfo *MMI) const { +  return TM.getSymbol(GV, Mang);  }  | 
