forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- ARMELFWriterInfo.cpp - ELF Writer Info for the ARM backend --------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file implements ELF writer information for the ARM backend.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "ARMELFWriterInfo.h"
 | |
| #include "ARMRelocations.h"
 | |
| #include "llvm/Function.h"
 | |
| #include "llvm/Support/ErrorHandling.h"
 | |
| #include "llvm/Target/TargetData.h"
 | |
| #include "llvm/Target/TargetMachine.h"
 | |
| #include "llvm/Support/ELF.h"
 | |
| 
 | |
| using namespace llvm;
 | |
| 
 | |
| //===----------------------------------------------------------------------===//
 | |
| //  Implementation of the ARMELFWriterInfo class
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| ARMELFWriterInfo::ARMELFWriterInfo(TargetMachine &TM)
 | |
|   : TargetELFWriterInfo(TM.getTargetData()->getPointerSizeInBits() == 64,
 | |
|                         TM.getTargetData()->isLittleEndian()) {
 | |
| }
 | |
| 
 | |
| ARMELFWriterInfo::~ARMELFWriterInfo() {}
 | |
| 
 | |
| unsigned ARMELFWriterInfo::getRelocationType(unsigned MachineRelTy) const {
 | |
|   switch (MachineRelTy) {
 | |
|   case ARM::reloc_arm_absolute:
 | |
|   case ARM::reloc_arm_relative:
 | |
|   case ARM::reloc_arm_cp_entry:
 | |
|   case ARM::reloc_arm_vfp_cp_entry:
 | |
|   case ARM::reloc_arm_machine_cp_entry:
 | |
|   case ARM::reloc_arm_jt_base:
 | |
|   case ARM::reloc_arm_pic_jt:
 | |
|     assert(0 && "unsupported ARM relocation type"); break;
 | |
|     
 | |
|   case ARM::reloc_arm_branch: return ELF::R_ARM_CALL; break;
 | |
|   case ARM::reloc_arm_movt:   return ELF::R_ARM_MOVT_ABS; break;
 | |
|   case ARM::reloc_arm_movw:   return ELF::R_ARM_MOVW_ABS_NC; break;
 | |
|   default:
 | |
|     llvm_unreachable("unknown ARM relocation type"); break;
 | |
|   }
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| long int ARMELFWriterInfo::getDefaultAddendForRelTy(unsigned RelTy,
 | |
|                                                     long int Modifier) const {
 | |
|   assert(0 && "ARMELFWriterInfo::getDefaultAddendForRelTy() not implemented");
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| unsigned ARMELFWriterInfo::getRelocationTySize(unsigned RelTy) const {
 | |
|   assert(0 && "ARMELFWriterInfo::getRelocationTySize() not implemented");
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| bool ARMELFWriterInfo::isPCRelativeRel(unsigned RelTy) const {
 | |
|   assert(0 && "ARMELFWriterInfo::isPCRelativeRel() not implemented");
 | |
|   return 1;
 | |
| }
 | |
| 
 | |
| unsigned ARMELFWriterInfo::getAbsoluteLabelMachineRelTy() const {
 | |
|   assert(0 &&
 | |
|          "ARMELFWriterInfo::getAbsoluteLabelMachineRelTy() not implemented");
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| long int ARMELFWriterInfo::computeRelocation(unsigned SymOffset,
 | |
|                                              unsigned RelOffset,
 | |
|                                              unsigned RelTy) const {
 | |
|   assert(0 &&
 | |
|          "ARMELFWriterInfo::getAbsoluteLabelMachineRelTy() not implemented");
 | |
|   return 0;
 | |
| }
 |