Home | History | Annotate | Download | only in X86
      1 //===-- X86TargetObjectFile.cpp - X86 Object Info -------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "X86TargetObjectFile.h"
     11 #include "X86TargetMachine.h"
     12 #include "llvm/ADT/StringExtras.h"
     13 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
     14 #include "llvm/MC/MCContext.h"
     15 #include "llvm/MC/MCExpr.h"
     16 #include "llvm/MC/MCSectionELF.h"
     17 #include "llvm/MC/MCSectionMachO.h"
     18 #include "llvm/Target/Mangler.h"
     19 #include "llvm/Support/Dwarf.h"
     20 #include "llvm/Support/ELF.h"
     21 using namespace llvm;
     22 using namespace dwarf;
     23 
     24 const MCExpr *X86_64MachoTargetObjectFile::
     25 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
     26                                MachineModuleInfo *MMI, unsigned Encoding,
     27                                MCStreamer &Streamer) const {
     28 
     29   // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which
     30   // is an indirect pc-relative reference.
     31   if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) {
     32     const MCSymbol *Sym = Mang->getSymbol(GV);
     33     const MCExpr *Res =
     34       MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext());
     35     const MCExpr *Four = MCConstantExpr::Create(4, getContext());
     36     return MCBinaryExpr::CreateAdd(Res, Four, getContext());
     37   }
     38 
     39   return TargetLoweringObjectFileMachO::
     40     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
     41 }
     42 
     43 MCSymbol *X86_64MachoTargetObjectFile::
     44 getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
     45                         MachineModuleInfo *MMI) const {
     46   return Mang->getSymbol(GV);
     47 }
     48 
     49 void
     50 X86LinuxTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) {
     51   TargetLoweringObjectFileELF::Initialize(Ctx, TM);
     52   InitializeELF(TM.Options.UseInitArray);
     53 }
     54