1d88c1a5aSDimitry Andric //===-- AMDGPUMachineFunctionInfo.cpp ---------------------------------------=// 2d88c1a5aSDimitry Andric // 3d88c1a5aSDimitry Andric // The LLVM Compiler Infrastructure 4d88c1a5aSDimitry Andric // 5d88c1a5aSDimitry Andric // This file is distributed under the University of Illinois Open Source 6d88c1a5aSDimitry Andric // License. See LICENSE.TXT for details. 7d88c1a5aSDimitry Andric // 8d88c1a5aSDimitry Andric //===----------------------------------------------------------------------===// 9d88c1a5aSDimitry Andric 108f0fd8f6SDimitry Andric #include "AMDGPUMachineFunction.h" 11d88c1a5aSDimitry Andric #include "AMDGPUSubtarget.h" 123ca95b02SDimitry Andric 138f0fd8f6SDimitry Andric using namespace llvm; 148f0fd8f6SDimitry Andric 158f0fd8f6SDimitry Andric AMDGPUMachineFunction::AMDGPUMachineFunction(const MachineFunction &MF) : 168f0fd8f6SDimitry Andric MachineFunctionInfo(), 17d88c1a5aSDimitry Andric LocalMemoryObjects(), 183ca95b02SDimitry Andric KernArgSize(0), 193ca95b02SDimitry Andric MaxKernArgAlign(0), 208f0fd8f6SDimitry Andric LDSSize(0), 217d523365SDimitry Andric ABIArgOffset(0), 222cab237bSDimitry Andric IsEntryFunction(AMDGPU::isEntryFunctionCC(MF.getFunction().getCallingConv())), 237a7e6055SDimitry Andric NoSignedZerosFPMath(MF.getTarget().Options.NoSignedZerosFPMath) { 24d88c1a5aSDimitry Andric // FIXME: Should initialize KernArgSize based on ExplicitKernelArgOffset, 25d88c1a5aSDimitry Andric // except reserved size is not correctly aligned. 263ca95b02SDimitry Andric } 278f0fd8f6SDimitry Andric 28d88c1a5aSDimitry Andric unsigned AMDGPUMachineFunction::allocateLDSGlobal(const DataLayout &DL, 29d88c1a5aSDimitry Andric const GlobalValue &GV) { 30d88c1a5aSDimitry Andric auto Entry = LocalMemoryObjects.insert(std::make_pair(&GV, 0)); 31d88c1a5aSDimitry Andric if (!Entry.second) 32d88c1a5aSDimitry Andric return Entry.first->second; 33d88c1a5aSDimitry Andric 34d88c1a5aSDimitry Andric unsigned Align = GV.getAlignment(); 35d88c1a5aSDimitry Andric if (Align == 0) 36d88c1a5aSDimitry Andric Align = DL.getABITypeAlignment(GV.getValueType()); 37d88c1a5aSDimitry Andric 38d88c1a5aSDimitry Andric /// TODO: We should sort these to minimize wasted space due to alignment 39d88c1a5aSDimitry Andric /// padding. Currently the padding is decided by the first encountered use 40d88c1a5aSDimitry Andric /// during lowering. 41d88c1a5aSDimitry Andric unsigned Offset = LDSSize = alignTo(LDSSize, Align); 42d88c1a5aSDimitry Andric 43d88c1a5aSDimitry Andric Entry.first->second = Offset; 44d88c1a5aSDimitry Andric LDSSize += DL.getTypeAllocSize(GV.getValueType()); 45d88c1a5aSDimitry Andric 46d88c1a5aSDimitry Andric return Offset; 478f0fd8f6SDimitry Andric } 48