You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			81 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===-- AArch64TargetObjectFile.cpp - AArch64 Object Info -----------------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "AArch64TargetObjectFile.h"
 | |
| #include "AArch64TargetMachine.h"
 | |
| #include "llvm/BinaryFormat/Dwarf.h"
 | |
| #include "llvm/IR/Mangler.h"
 | |
| #include "llvm/MC/MCContext.h"
 | |
| #include "llvm/MC/MCExpr.h"
 | |
| #include "llvm/MC/MCStreamer.h"
 | |
| #include "llvm/MC/MCValue.h"
 | |
| using namespace llvm;
 | |
| using namespace dwarf;
 | |
| 
 | |
| void AArch64_ELFTargetObjectFile::Initialize(MCContext &Ctx,
 | |
|                                              const TargetMachine &TM) {
 | |
|   TargetLoweringObjectFileELF::Initialize(Ctx, TM);
 | |
|   InitializeELF(TM.Options.UseInitArray);
 | |
| }
 | |
| 
 | |
| AArch64_MachoTargetObjectFile::AArch64_MachoTargetObjectFile()
 | |
|   : TargetLoweringObjectFileMachO() {
 | |
|   SupportGOTPCRelWithOffset = false;
 | |
| }
 | |
| 
 | |
| const MCExpr *AArch64_MachoTargetObjectFile::getTTypeGlobalReference(
 | |
|     const GlobalValue *GV, unsigned Encoding, 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);
 | |
|     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, TM, MMI, Streamer);
 | |
| }
 | |
| 
 | |
| MCSymbol *AArch64_MachoTargetObjectFile::getCFIPersonalitySymbol(
 | |
|     const GlobalValue *GV, const TargetMachine &TM,
 | |
|     MachineModuleInfo *MMI) const {
 | |
|   return TM.getSymbol(GV);
 | |
| }
 | |
| 
 | |
| const MCExpr *AArch64_MachoTargetObjectFile::getIndirectSymViaGOTPCRel(
 | |
|     const MCSymbol *Sym, const MCValue &MV, int64_t Offset,
 | |
|     MachineModuleInfo *MMI, MCStreamer &Streamer) const {
 | |
|   assert((Offset+MV.getConstant() == 0) &&
 | |
|          "Arch64 does not support GOT PC rel with extra offset");
 | |
|   // On ARM64 Darwin, we can reference symbols with foo@GOT-., which
 | |
|   // is an indirect pc-relative reference.
 | |
|   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());
 | |
| }
 | |
| 
 | |
| void AArch64_MachoTargetObjectFile::getNameWithPrefix(
 | |
|     SmallVectorImpl<char> &OutName, const GlobalValue *GV,
 | |
|     const TargetMachine &TM) const {
 | |
|   // AArch64 does not use section-relative relocations so any global symbol must
 | |
|   // be accessed via at least a linker-private symbol.
 | |
|   getMangler().getNameWithPrefix(OutName, GV, /* CannotUsePrivateLabel */ true);
 | |
| }
 |