AMDGPUMachineFunction.cpp revision 321369
1//===-- AMDGPUMachineFunctionInfo.cpp ---------------------------------------=//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "AMDGPUMachineFunction.h"
11#include "AMDGPUSubtarget.h"
12
13using namespace llvm;
14
15AMDGPUMachineFunction::AMDGPUMachineFunction(const MachineFunction &MF) :
16  MachineFunctionInfo(),
17  LocalMemoryObjects(),
18  KernArgSize(0),
19  MaxKernArgAlign(0),
20  LDSSize(0),
21  ABIArgOffset(0),
22  IsEntryFunction(AMDGPU::isEntryFunctionCC(MF.getFunction()->getCallingConv())),
23  NoSignedZerosFPMath(MF.getTarget().Options.NoSignedZerosFPMath) {
24  // FIXME: Should initialize KernArgSize based on ExplicitKernelArgOffset,
25  // except reserved size is not correctly aligned.
26}
27
28unsigned AMDGPUMachineFunction::allocateLDSGlobal(const DataLayout &DL,
29                                                  const GlobalValue &GV) {
30  auto Entry = LocalMemoryObjects.insert(std::make_pair(&GV, 0));
31  if (!Entry.second)
32    return Entry.first->second;
33
34  unsigned Align = GV.getAlignment();
35  if (Align == 0)
36    Align = DL.getABITypeAlignment(GV.getValueType());
37
38  /// TODO: We should sort these to minimize wasted space due to alignment
39  /// padding. Currently the padding is decided by the first encountered use
40  /// during lowering.
41  unsigned Offset = LDSSize = alignTo(LDSSize, Align);
42
43  Entry.first->second = Offset;
44  LDSSize += DL.getTypeAllocSize(GV.getValueType());
45
46  return Offset;
47}
48