23
23
using namespace llvm ;
24
24
25
25
MCSymbol *MCResourceInfo::getSymbol (StringRef FuncName, ResourceInfoKind RIK,
26
- MCContext &OutContext) {
27
- auto GOCS = [FuncName, &OutContext](StringRef Suffix) {
28
- return OutContext.getOrCreateSymbol (
29
- Twine (OutContext.getAsmInfo ()->getPrivateGlobalPrefix ()) + FuncName +
30
- 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));
31
32
};
32
33
switch (RIK) {
33
34
case RIK_NumVGPR:
@@ -54,8 +55,8 @@ MCSymbol *MCResourceInfo::getSymbol(StringRef FuncName, ResourceInfoKind RIK,
54
55
55
56
const MCExpr *MCResourceInfo::getSymRefExpr (StringRef FuncName,
56
57
ResourceInfoKind RIK,
57
- MCContext &Ctx) {
58
- return MCSymbolRefExpr::create (getSymbol (FuncName, RIK, Ctx), Ctx);
58
+ MCContext &Ctx, bool isLocal ) {
59
+ return MCSymbolRefExpr::create (getSymbol (FuncName, RIK, Ctx, isLocal ), Ctx);
59
60
}
60
61
61
62
void MCResourceInfo::assignMaxRegs (MCContext &OutContext) {
@@ -83,33 +84,28 @@ void MCResourceInfo::finalize(MCContext &OutContext) {
83
84
}
84
85
85
86
MCSymbol *MCResourceInfo::getMaxVGPRSymbol (MCContext &OutContext) {
86
- StringRef PrivatePrefix = OutContext.getAsmInfo ()->getPrivateGlobalPrefix ();
87
- return OutContext.getOrCreateSymbol (Twine (PrivatePrefix) +
88
- " amdgpu.max_num_vgpr" );
87
+ return OutContext.getOrCreateSymbol (" amdgpu.max_num_vgpr" );
89
88
}
90
89
91
90
MCSymbol *MCResourceInfo::getMaxAGPRSymbol (MCContext &OutContext) {
92
- StringRef PrivatePrefix = OutContext.getAsmInfo ()->getPrivateGlobalPrefix ();
93
- return OutContext.getOrCreateSymbol (Twine (PrivatePrefix) +
94
- " amdgpu.max_num_agpr" );
91
+ return OutContext.getOrCreateSymbol (" amdgpu.max_num_agpr" );
95
92
}
96
93
97
94
MCSymbol *MCResourceInfo::getMaxSGPRSymbol (MCContext &OutContext) {
98
- StringRef PrivatePrefix = OutContext.getAsmInfo ()->getPrivateGlobalPrefix ();
99
- return OutContext.getOrCreateSymbol (Twine (PrivatePrefix) +
100
- " amdgpu.max_num_sgpr" );
95
+ return OutContext.getOrCreateSymbol (" amdgpu.max_num_sgpr" );
101
96
}
102
97
103
98
void MCResourceInfo::assignResourceInfoExpr (
104
99
int64_t LocalValue, ResourceInfoKind RIK, AMDGPUMCExpr::VariantKind Kind,
105
100
const MachineFunction &MF, const SmallVectorImpl<const Function *> &Callees,
106
101
MCContext &OutContext) {
107
102
const TargetMachine &TM = MF.getTarget ();
103
+ bool isLocal = MF.getFunction ().hasLocalLinkage ();
108
104
MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
109
105
const MCConstantExpr *LocalConstExpr =
110
106
MCConstantExpr::create (LocalValue, OutContext);
111
107
const MCExpr *SymVal = LocalConstExpr;
112
- MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext);
108
+ MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext, isLocal );
113
109
if (!Callees.empty ()) {
114
110
SmallVector<const MCExpr *, 8 > ArgExprs;
115
111
SmallPtrSet<const Function *, 8 > Seen;
@@ -119,9 +115,10 @@ void MCResourceInfo::assignResourceInfoExpr(
119
115
if (!Seen.insert (Callee).second )
120
116
continue ;
121
117
118
+ bool isCalleeLocal = Callee->hasLocalLinkage ();
122
119
MCSymbol *CalleeFnSym = TM.getSymbol (&Callee->getFunction ());
123
120
MCSymbol *CalleeValSym =
124
- getSymbol (CalleeFnSym->getName (), RIK, OutContext);
121
+ getSymbol (CalleeFnSym->getName (), RIK, OutContext, isCalleeLocal );
125
122
126
123
// Avoid constructing recursive definitions by detecting whether `Sym` is
127
124
// found transitively within any of its `CalleeValSym`.
@@ -164,6 +161,7 @@ void MCResourceInfo::gatherResourceInfo(
164
161
MCSymbol *MaxVGPRSym = getMaxVGPRSymbol (OutContext);
165
162
MCSymbol *MaxAGPRSym = getMaxAGPRSymbol (OutContext);
166
163
MCSymbol *MaxSGPRSym = getMaxSGPRSymbol (OutContext);
164
+ bool isLocal = MF.getFunction ().hasLocalLinkage ();
167
165
168
166
if (!AMDGPU::isEntryFunctionCC (MF.getFunction ().getCallingConv ())) {
169
167
addMaxVGPRCandidate (FRI.NumVGPR );
@@ -181,7 +179,8 @@ void MCResourceInfo::gatherResourceInfo(
181
179
FRI.Callees , OutContext);
182
180
} else {
183
181
const MCExpr *SymRef = MCSymbolRefExpr::create (MaxSym, OutContext);
184
- MCSymbol *LocalNumSym = getSymbol (FnSym->getName (), RIK, OutContext);
182
+ MCSymbol *LocalNumSym =
183
+ getSymbol (FnSym->getName (), RIK, OutContext, isLocal);
185
184
const MCExpr *MaxWithLocal = AMDGPUMCExpr::createMax (
186
185
{MCConstantExpr::create (numRegs, OutContext), SymRef}, OutContext);
187
186
LocalNumSym->setVariableValue (MaxWithLocal);
@@ -196,7 +195,8 @@ void MCResourceInfo::gatherResourceInfo(
196
195
// The expression for private segment size should be: FRI.PrivateSegmentSize
197
196
// + max(FRI.Callees, FRI.CalleeSegmentSize)
198
197
SmallVector<const MCExpr *, 8 > ArgExprs;
199
- MCSymbol *Sym = getSymbol (FnSym->getName (), RIK_PrivateSegSize, OutContext);
198
+ MCSymbol *Sym =
199
+ getSymbol (FnSym->getName (), RIK_PrivateSegSize, OutContext, isLocal);
200
200
if (FRI.CalleeSegmentSize )
201
201
ArgExprs.push_back (
202
202
MCConstantExpr::create (FRI.CalleeSegmentSize , OutContext));
@@ -207,9 +207,11 @@ void MCResourceInfo::gatherResourceInfo(
207
207
if (!Seen.insert (Callee).second )
208
208
continue ;
209
209
if (!Callee->isDeclaration ()) {
210
+ bool isCalleeLocal = Callee->hasLocalLinkage ();
210
211
MCSymbol *CalleeFnSym = TM.getSymbol (&Callee->getFunction ());
211
212
MCSymbol *CalleeValSym =
212
- getSymbol (CalleeFnSym->getName (), RIK_PrivateSegSize, OutContext);
213
+ getSymbol (CalleeFnSym->getName (), RIK_PrivateSegSize, OutContext,
214
+ isCalleeLocal);
213
215
214
216
// Avoid constructing recursive definitions by detecting whether `Sym`
215
217
// is found transitively within any of its `CalleeValSym`.
@@ -232,7 +234,7 @@ void MCResourceInfo::gatherResourceInfo(
232
234
}
233
235
234
236
auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {
235
- MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext);
237
+ MCSymbol *Sym = getSymbol (FnSym->getName (), RIK, OutContext, isLocal );
236
238
Sym->setVariableValue (MCConstantExpr::create (LocalValue, OutContext));
237
239
};
238
240
@@ -264,21 +266,23 @@ const MCExpr *MCResourceInfo::createTotalNumVGPRs(const MachineFunction &MF,
264
266
MCContext &Ctx) {
265
267
const TargetMachine &TM = MF.getTarget ();
266
268
MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
269
+ bool isLocal = MF.getFunction ().hasLocalLinkage ();
267
270
return AMDGPUMCExpr::createTotalNumVGPR (
268
- getSymRefExpr (FnSym->getName (), RIK_NumAGPR, Ctx),
269
- getSymRefExpr (FnSym->getName (), RIK_NumVGPR, Ctx), Ctx);
271
+ getSymRefExpr (FnSym->getName (), RIK_NumAGPR, Ctx, isLocal ),
272
+ getSymRefExpr (FnSym->getName (), RIK_NumVGPR, Ctx, isLocal ), Ctx);
270
273
}
271
274
272
275
const MCExpr *MCResourceInfo::createTotalNumSGPRs (const MachineFunction &MF,
273
276
bool hasXnack,
274
277
MCContext &Ctx) {
275
278
const TargetMachine &TM = MF.getTarget ();
276
279
MCSymbol *FnSym = TM.getSymbol (&MF.getFunction ());
280
+ bool isLocal = MF.getFunction ().hasLocalLinkage ();
277
281
return MCBinaryExpr::createAdd (
278
- getSymRefExpr (FnSym->getName (), RIK_NumSGPR, Ctx),
282
+ getSymRefExpr (FnSym->getName (), RIK_NumSGPR, Ctx, isLocal ),
279
283
AMDGPUMCExpr::createExtraSGPRs (
280
- getSymRefExpr (FnSym->getName (), RIK_UsesVCC, Ctx),
281
- getSymRefExpr (FnSym->getName (), RIK_UsesFlatScratch, Ctx), hasXnack ,
282
- Ctx),
284
+ getSymRefExpr (FnSym->getName (), RIK_UsesVCC, Ctx, isLocal ),
285
+ getSymRefExpr (FnSym->getName (), RIK_UsesFlatScratch, Ctx, isLocal) ,
286
+ hasXnack, Ctx),
283
287
Ctx);
284
288
}
0 commit comments