1515#include " AMDGPUMCResourceInfo.h"
1616#include " Utils/AMDGPUBaseInfo.h"
1717#include " llvm/ADT/StringRef.h"
18+ #include " llvm/MC/MCAsmInfo.h"
1819#include " llvm/MC/MCContext.h"
1920#include " llvm/MC/MCSymbol.h"
2021#include " llvm/Target/TargetMachine.h"
2122
2223using namespace llvm ;
2324
2425MCSymbol *MCResourceInfo::getSymbol (StringRef FuncName, ResourceInfoKind RIK,
25- MCContext &OutContext) {
26- auto GOCS = [FuncName, &OutContext](StringRef Suffix) {
27- return OutContext.getOrCreateSymbol (FuncName + Twine (Suffix));
26+ MCContext &OutContext, bool IsLocal) {
27+ auto GOCS = [FuncName, &OutContext, IsLocal](StringRef Suffix) {
28+ StringRef Prefix =
29+ IsLocal ? OutContext.getAsmInfo ()->getPrivateGlobalPrefix () : " " ;
30+ return OutContext.getOrCreateSymbol (Twine (Prefix) + FuncName +
31+ Twine (Suffix));
2832 };
2933 switch (RIK) {
3034 case RIK_NumVGPR:
@@ -51,8 +55,8 @@ MCSymbol *MCResourceInfo::getSymbol(StringRef FuncName, ResourceInfoKind RIK,
5155
5256const MCExpr *MCResourceInfo::getSymRefExpr (StringRef FuncName,
5357 ResourceInfoKind RIK,
54- MCContext &Ctx) {
55- return MCSymbolRefExpr::create (getSymbol (FuncName, RIK, Ctx), Ctx);
58+ MCContext &Ctx, bool IsLocal ) {
59+ return MCSymbolRefExpr::create (getSymbol (FuncName, RIK, Ctx, IsLocal ), Ctx);
5660}
5761
5862void MCResourceInfo::assignMaxRegs (MCContext &OutContext) {
@@ -96,11 +100,12 @@ void MCResourceInfo::assignResourceInfoExpr(
96100 const MachineFunction &MF, const SmallVectorImpl<const Function *> &Callees,
97101 MCContext &OutContext) {
98102 const TargetMachine &TM = MF.getTarget ();
103+ bool IsLocal = MF.getFunction ().hasLocalLinkage ();
99104 MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
100105 const MCConstantExpr *LocalConstExpr =
101106 MCConstantExpr::create (LocalValue, OutContext);
102107 const MCExpr *SymVal = LocalConstExpr;
103- MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext);
108+ MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext, IsLocal );
104109 if (!Callees.empty ()) {
105110 SmallVector<const MCExpr *, 8 > ArgExprs;
106111 SmallPtrSet<const Function *, 8 > Seen;
@@ -110,9 +115,10 @@ void MCResourceInfo::assignResourceInfoExpr(
110115 if (!Seen.insert (Callee).second )
111116 continue ;
112117
118+ bool IsCalleeLocal = Callee->hasLocalLinkage ();
113119 MCSymbol *CalleeFnSym = TM.getSymbol (&Callee->getFunction ());
114120 MCSymbol *CalleeValSym =
115- getSymbol (CalleeFnSym->getName (), RIK, OutContext);
121+ getSymbol (CalleeFnSym->getName (), RIK, OutContext, IsCalleeLocal );
116122
117123 // Avoid constructing recursive definitions by detecting whether `Sym` is
118124 // found transitively within any of its `CalleeValSym`.
@@ -155,6 +161,7 @@ void MCResourceInfo::gatherResourceInfo(
155161 MCSymbol *MaxVGPRSym = getMaxVGPRSymbol (OutContext);
156162 MCSymbol *MaxAGPRSym = getMaxAGPRSymbol (OutContext);
157163 MCSymbol *MaxSGPRSym = getMaxSGPRSymbol (OutContext);
164+ bool IsLocal = MF.getFunction ().hasLocalLinkage ();
158165
159166 if (!AMDGPU::isEntryFunctionCC (MF.getFunction ().getCallingConv ())) {
160167 addMaxVGPRCandidate (FRI.NumVGPR );
@@ -172,7 +179,8 @@ void MCResourceInfo::gatherResourceInfo(
172179 FRI.Callees , OutContext);
173180 } else {
174181 const MCExpr *SymRef = MCSymbolRefExpr::create (MaxSym, OutContext);
175- MCSymbol *LocalNumSym = getSymbol (FnSym->getName (), RIK, OutContext);
182+ MCSymbol *LocalNumSym =
183+ getSymbol (FnSym->getName (), RIK, OutContext, IsLocal);
176184 const MCExpr *MaxWithLocal = AMDGPUMCExpr::createMax (
177185 {MCConstantExpr::create (numRegs, OutContext), SymRef}, OutContext);
178186 LocalNumSym->setVariableValue (MaxWithLocal);
@@ -187,7 +195,8 @@ void MCResourceInfo::gatherResourceInfo(
187195 // The expression for private segment size should be: FRI.PrivateSegmentSize
188196 // + max(FRI.Callees, FRI.CalleeSegmentSize)
189197 SmallVector<const MCExpr *, 8 > ArgExprs;
190- MCSymbol *Sym = getSymbol (FnSym->getName (), RIK_PrivateSegSize, OutContext);
198+ MCSymbol *Sym =
199+ getSymbol (FnSym->getName (), RIK_PrivateSegSize, OutContext, IsLocal);
191200 if (FRI.CalleeSegmentSize )
192201 ArgExprs.push_back (
193202 MCConstantExpr::create (FRI.CalleeSegmentSize , OutContext));
@@ -198,9 +207,11 @@ void MCResourceInfo::gatherResourceInfo(
198207 if (!Seen.insert (Callee).second )
199208 continue ;
200209 if (!Callee->isDeclaration ()) {
210+ bool IsCalleeLocal = Callee->hasLocalLinkage ();
201211 MCSymbol *CalleeFnSym = TM.getSymbol (&Callee->getFunction ());
202212 MCSymbol *CalleeValSym =
203- getSymbol (CalleeFnSym->getName (), RIK_PrivateSegSize, OutContext);
213+ getSymbol (CalleeFnSym->getName (), RIK_PrivateSegSize, OutContext,
214+ IsCalleeLocal);
204215
205216 // Avoid constructing recursive definitions by detecting whether `Sym`
206217 // is found transitively within any of its `CalleeValSym`.
@@ -223,7 +234,7 @@ void MCResourceInfo::gatherResourceInfo(
223234 }
224235
225236 auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {
226- MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext);
237+ MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext, IsLocal );
227238 Sym->setVariableValue (MCConstantExpr::create (LocalValue, OutContext));
228239 };
229240
@@ -255,21 +266,23 @@ const MCExpr *MCResourceInfo::createTotalNumVGPRs(const MachineFunction &MF,
255266 MCContext &Ctx) {
256267 const TargetMachine &TM = MF.getTarget ();
257268 MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
269+ bool IsLocal = MF.getFunction ().hasLocalLinkage ();
258270 return AMDGPUMCExpr::createTotalNumVGPR (
259- getSymRefExpr (FnSym->getName (), RIK_NumAGPR, Ctx),
260- getSymRefExpr (FnSym->getName (), RIK_NumVGPR, Ctx), Ctx);
271+ getSymRefExpr (FnSym->getName (), RIK_NumAGPR, Ctx, IsLocal ),
272+ getSymRefExpr (FnSym->getName (), RIK_NumVGPR, Ctx, IsLocal ), Ctx);
261273}
262274
263275const MCExpr *MCResourceInfo::createTotalNumSGPRs (const MachineFunction &MF,
264276 bool hasXnack,
265277 MCContext &Ctx) {
266278 const TargetMachine &TM = MF.getTarget ();
267279 MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
280+ bool IsLocal = MF.getFunction ().hasLocalLinkage ();
268281 return MCBinaryExpr::createAdd (
269- getSymRefExpr (FnSym->getName (), RIK_NumSGPR, Ctx),
282+ getSymRefExpr (FnSym->getName (), RIK_NumSGPR, Ctx, IsLocal ),
270283 AMDGPUMCExpr::createExtraSGPRs (
271- getSymRefExpr (FnSym->getName (), RIK_UsesVCC, Ctx),
272- getSymRefExpr (FnSym->getName (), RIK_UsesFlatScratch, Ctx), hasXnack ,
273- Ctx),
284+ getSymRefExpr (FnSym->getName (), RIK_UsesVCC, Ctx, IsLocal ),
285+ getSymRefExpr (FnSym->getName (), RIK_UsesFlatScratch, Ctx, IsLocal) ,
286+ hasXnack, Ctx),
274287 Ctx);
275288}
0 commit comments