mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	adding a TargetMachine member to the base TargetAsmInfo class instead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58624 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			99 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===-- MipsTargetAsmInfo.cpp - Mips asm properties -------------*- C++ -*-===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// This file contains the declarations of the MipsTargetAsmInfo properties.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "MipsTargetAsmInfo.h"
 | 
						|
#include "MipsTargetMachine.h"
 | 
						|
#include "llvm/GlobalVariable.h"
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
 | 
						|
MipsTargetAsmInfo::MipsTargetAsmInfo(const MipsTargetMachine &TM):
 | 
						|
  ELFTargetAsmInfo(TM) {
 | 
						|
 | 
						|
  Subtarget = &TM.getSubtarget<MipsSubtarget>();
 | 
						|
 | 
						|
  AlignmentIsInBytes          = false;
 | 
						|
  COMMDirectiveTakesAlignment = true;
 | 
						|
  Data16bitsDirective         = "\t.half\t";
 | 
						|
  Data32bitsDirective         = "\t.word\t";
 | 
						|
  Data64bitsDirective         = NULL;
 | 
						|
  PrivateGlobalPrefix         = "$";
 | 
						|
  JumpTableDataSection        = "\t.rdata";
 | 
						|
  CommentString               = "#";
 | 
						|
  ZeroDirective               = "\t.space\t";
 | 
						|
  BSSSection                  = "\t.section\t.bss";
 | 
						|
  CStringSection              = ".rodata.str";
 | 
						|
 | 
						|
  if (!Subtarget->hasABICall()) {
 | 
						|
    JumpTableDirective = "\t.word\t";
 | 
						|
    SmallDataSection = getNamedSection("\t.sdata", SectionFlags::Writeable);
 | 
						|
    SmallBSSSection = getNamedSection("\t.sbss",
 | 
						|
                                      SectionFlags::Writeable |
 | 
						|
                                      SectionFlags::BSS);
 | 
						|
  } else
 | 
						|
    JumpTableDirective = "\t.gpword\t";
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
unsigned MipsTargetAsmInfo::
 | 
						|
SectionFlagsForGlobal(const GlobalValue *GV, const char* Name) const {
 | 
						|
  unsigned Flags = ELFTargetAsmInfo::SectionFlagsForGlobal(GV, Name);
 | 
						|
  // Mask out Small Section flag bit, Mips doesnt support 's' section symbol
 | 
						|
  // for its small sections.
 | 
						|
  return (Flags & (~SectionFlags::Small));
 | 
						|
}
 | 
						|
 | 
						|
SectionKind::Kind MipsTargetAsmInfo::
 | 
						|
SectionKindForGlobal(const GlobalValue *GV) const {
 | 
						|
  SectionKind::Kind K = ELFTargetAsmInfo::SectionKindForGlobal(GV);
 | 
						|
 | 
						|
  if (Subtarget->hasABICall())
 | 
						|
    return K;
 | 
						|
 | 
						|
  if (K != SectionKind::Data && K != SectionKind::BSS &&
 | 
						|
      K != SectionKind::RODataMergeConst)
 | 
						|
    return K;
 | 
						|
 | 
						|
  if (isa<GlobalVariable>(GV)) {
 | 
						|
    const TargetData *TD = TM.getTargetData();
 | 
						|
    unsigned Size = TD->getABITypeSize(GV->getType()->getElementType());
 | 
						|
    unsigned Threshold = Subtarget->getSSectionThreshold();
 | 
						|
 | 
						|
    if (Size > 0 && Size <= Threshold) {
 | 
						|
      if (K == SectionKind::BSS)
 | 
						|
        return SectionKind::SmallBSS;
 | 
						|
      else
 | 
						|
        return SectionKind::SmallData;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return K;
 | 
						|
}
 | 
						|
 | 
						|
const Section* MipsTargetAsmInfo::
 | 
						|
SelectSectionForGlobal(const GlobalValue *GV) const {
 | 
						|
  SectionKind::Kind K = SectionKindForGlobal(GV);
 | 
						|
  const GlobalVariable *GVA = dyn_cast<GlobalVariable>(GV);
 | 
						|
 | 
						|
  if (GVA && (!GVA->mayBeOverridden()))
 | 
						|
    switch (K) {
 | 
						|
      case SectionKind::SmallData:
 | 
						|
        return getSmallDataSection();
 | 
						|
      case SectionKind::SmallBSS:
 | 
						|
        return getSmallBSSSection();
 | 
						|
      default: break;
 | 
						|
    }
 | 
						|
 | 
						|
  return ELFTargetAsmInfo::SelectSectionForGlobal(GV);
 | 
						|
}
 |