HexagonTargetObjectFile.cpp revision 234285
1234285Sdim//===-- HexagonTargetObjectFile.cpp - Hexagon asm properties --------------===// 2234285Sdim// 3234285Sdim// The LLVM Compiler Infrastructure 4234285Sdim// 5234285Sdim// This file is distributed under the University of Illinois Open Source 6234285Sdim// License. See LICENSE.TXT for details. 7234285Sdim// 8234285Sdim//===----------------------------------------------------------------------===// 9234285Sdim// 10234285Sdim// This file contains the declarations of the HexagonTargetAsmInfo properties. 11234285Sdim// 12234285Sdim//===----------------------------------------------------------------------===// 13234285Sdim 14234285Sdim#include "HexagonTargetObjectFile.h" 15234285Sdim#include "HexagonSubtarget.h" 16234285Sdim#include "HexagonTargetMachine.h" 17234285Sdim#include "llvm/Function.h" 18234285Sdim#include "llvm/GlobalVariable.h" 19234285Sdim#include "llvm/Target/TargetData.h" 20234285Sdim#include "llvm/DerivedTypes.h" 21234285Sdim#include "llvm/MC/MCContext.h" 22234285Sdim#include "llvm/Support/ELF.h" 23234285Sdim#include "llvm/Support/CommandLine.h" 24234285Sdim 25234285Sdimusing namespace llvm; 26234285Sdim 27234285Sdimstatic cl::opt<int> SmallDataThreshold("hexagon-small-data-threshold", 28234285Sdim cl::init(8), cl::Hidden); 29234285Sdim 30234285Sdimvoid HexagonTargetObjectFile::Initialize(MCContext &Ctx, 31234285Sdim const TargetMachine &TM) { 32234285Sdim TargetLoweringObjectFileELF::Initialize(Ctx, TM); 33234285Sdim 34234285Sdim 35234285Sdim SmallDataSection = 36234285Sdim getContext().getELFSection(".sdata", ELF::SHT_PROGBITS, 37234285Sdim ELF::SHF_WRITE | ELF::SHF_ALLOC, 38234285Sdim SectionKind::getDataRel()); 39234285Sdim SmallBSSSection = 40234285Sdim getContext().getELFSection(".sbss", ELF::SHT_NOBITS, 41234285Sdim ELF::SHF_WRITE | ELF::SHF_ALLOC, 42234285Sdim SectionKind::getBSS()); 43234285Sdim} 44234285Sdim 45234285Sdim// sdata/sbss support taken largely from the MIPS Backend. 46234285Sdimstatic bool IsInSmallSection(uint64_t Size) { 47234285Sdim return Size > 0 && Size <= (uint64_t)SmallDataThreshold; 48234285Sdim} 49234285Sdim/// IsGlobalInSmallSection - Return true if this global value should be 50234285Sdim/// placed into small data/bss section. 51234285Sdimbool HexagonTargetObjectFile::IsGlobalInSmallSection(const GlobalValue *GV, 52234285Sdim const TargetMachine &TM) const { 53234285Sdim // If the primary definition of this global value is outside the current 54234285Sdim // translation unit or the global value is available for inspection but not 55234285Sdim // emission, then do nothing. 56234285Sdim if (GV->isDeclaration() || GV->hasAvailableExternallyLinkage()) 57234285Sdim return false; 58234285Sdim 59234285Sdim // Otherwise, Check if GV should be in sdata/sbss, when normally it would end 60234285Sdim // up in getKindForGlobal(GV, TM). 61234285Sdim return IsGlobalInSmallSection(GV, TM, getKindForGlobal(GV, TM)); 62234285Sdim} 63234285Sdim 64234285Sdim/// IsGlobalInSmallSection - Return true if this global value should be 65234285Sdim/// placed into small data/bss section. 66234285Sdimbool HexagonTargetObjectFile:: 67234285SdimIsGlobalInSmallSection(const GlobalValue *GV, const TargetMachine &TM, 68234285Sdim SectionKind Kind) const { 69234285Sdim // Only global variables, not functions. 70234285Sdim const GlobalVariable *GVA = dyn_cast<GlobalVariable>(GV); 71234285Sdim if (!GVA) 72234285Sdim return false; 73234285Sdim 74234285Sdim if (Kind.isBSS() || Kind.isDataNoRel() || Kind.isCommon()) { 75234285Sdim Type *Ty = GV->getType()->getElementType(); 76234285Sdim return IsInSmallSection(TM.getTargetData()->getTypeAllocSize(Ty)); 77234285Sdim } 78234285Sdim 79234285Sdim return false; 80234285Sdim} 81234285Sdim 82234285Sdimconst MCSection *HexagonTargetObjectFile:: 83234285SdimSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 84234285Sdim Mangler *Mang, const TargetMachine &TM) const { 85234285Sdim 86234285Sdim // Handle Small Section classification here. 87234285Sdim if (Kind.isBSS() && IsGlobalInSmallSection(GV, TM, Kind)) 88234285Sdim return SmallBSSSection; 89234285Sdim if (Kind.isDataNoRel() && IsGlobalInSmallSection(GV, TM, Kind)) 90234285Sdim return SmallDataSection; 91234285Sdim 92234285Sdim // Otherwise, we work the same as ELF. 93234285Sdim return TargetLoweringObjectFileELF::SelectSectionForGlobal(GV, Kind, Mang,TM); 94234285Sdim} 95