@@ -86,10 +86,12 @@ void MCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens) const {
86
86
87
87
const MCSymbolRefExpr::VariantKind Kind = SRE.getKind ();
88
88
if (Kind != MCSymbolRefExpr::VK_None) {
89
- if (MAI->useParensForSymbolVariant ()) // ARM
89
+ if (MAI && MAI ->useParensForSymbolVariant ()) // ARM
90
90
OS << ' (' << MAI->getVariantKindName (Kind) << ' )' ;
91
- else
91
+ else if (MAI)
92
92
OS << ' @' << MAI->getVariantKindName (Kind);
93
+ else
94
+ OS << ' @' << MCSymbolRefExpr::getVariantKindName (Kind);
93
95
}
94
96
95
97
return ;
@@ -246,6 +248,84 @@ const MCSymbolRefExpr *MCSymbolRefExpr::create(StringRef Name, VariantKind Kind,
246
248
return create (Ctx.getOrCreateSymbol (Name), Kind, Ctx);
247
249
}
248
250
251
+ // TODO: Move target-specific Kinds to lib/Target/*/MCTargetDesc/*AsmInfo.cpp.
252
+ StringRef MCSymbolRefExpr::getVariantKindName (VariantKind Kind) {
253
+ switch (Kind) {
254
+ // clang-format off
255
+ case VK_Invalid: default : return " <<invalid>>" ;
256
+ case VK_None: return " <<none>>" ;
257
+
258
+ case VK_DTPOFF: return " DTPOFF" ;
259
+ case VK_DTPREL: return " DTPREL" ;
260
+ case VK_GOT: return " GOT" ;
261
+ case VK_GOTENT: return " GOTENT" ;
262
+ case VK_GOTOFF: return " GOTOFF" ;
263
+ case VK_GOTREL: return " GOTREL" ;
264
+ case VK_PCREL: return " PCREL" ;
265
+ case VK_GOTPCREL: return " GOTPCREL" ;
266
+ case VK_GOTTPOFF: return " GOTTPOFF" ;
267
+ case VK_INDNTPOFF: return " INDNTPOFF" ;
268
+ case VK_NTPOFF: return " NTPOFF" ;
269
+ case VK_GOTNTPOFF: return " GOTNTPOFF" ;
270
+ case VK_PLT: return " PLT" ;
271
+ case VK_TLSGD: return " TLSGD" ;
272
+ case VK_TLSLD: return " TLSLD" ;
273
+ case VK_TLSLDM: return " TLSLDM" ;
274
+ case VK_TPOFF: return " TPOFF" ;
275
+ case VK_TPREL: return " TPREL" ;
276
+ case VK_TLSCALL: return " tlscall" ;
277
+ case VK_TLSDESC: return " tlsdesc" ;
278
+ case VK_TLVP: return " TLVP" ;
279
+ case VK_TLVPPAGE: return " TLVPPAGE" ;
280
+ case VK_TLVPPAGEOFF: return " TLVPPAGEOFF" ;
281
+ case VK_PAGE: return " PAGE" ;
282
+ case VK_PAGEOFF: return " PAGEOFF" ;
283
+ case VK_GOTPAGE: return " GOTPAGE" ;
284
+ case VK_GOTPAGEOFF: return " GOTPAGEOFF" ;
285
+ case VK_SECREL: return " SECREL32" ;
286
+ case VK_WEAKREF: return " WEAKREF" ;
287
+ case VK_COFF_IMGREL32: return " IMGREL" ;
288
+ // clang-format on
289
+ }
290
+ llvm_unreachable (" Invalid variant kind" );
291
+ }
292
+
293
+ // FIXME: All variant kinds are target-specific. Move them to
294
+ // *AsmParser::getVariantKindForName and remove this function.
295
+ MCSymbolRefExpr::VariantKind
296
+ MCSymbolRefExpr::getVariantKindForName (StringRef Name) {
297
+ return StringSwitch<VariantKind>(Name.lower ())
298
+ .Case (" dtprel" , VK_DTPREL)
299
+ .Case (" dtpoff" , VK_DTPOFF)
300
+ .Case (" got" , VK_GOT)
301
+ .Case (" gotent" , VK_GOTENT)
302
+ .Case (" gotoff" , VK_GOTOFF)
303
+ .Case (" gotrel" , VK_GOTREL)
304
+ .Case (" pcrel" , VK_PCREL)
305
+ .Case (" gotpcrel" , VK_GOTPCREL)
306
+ .Case (" gottpoff" , VK_GOTTPOFF)
307
+ .Case (" indntpoff" , VK_INDNTPOFF)
308
+ .Case (" ntpoff" , VK_NTPOFF)
309
+ .Case (" plt" , VK_PLT)
310
+ .Case (" tlscall" , VK_TLSCALL)
311
+ .Case (" tlsdesc" , VK_TLSDESC)
312
+ .Case (" tlsgd" , VK_TLSGD)
313
+ .Case (" tlsld" , VK_TLSLD)
314
+ .Case (" tlsldm" , VK_TLSLDM)
315
+ .Case (" tpoff" , VK_TPOFF)
316
+ .Case (" tprel" , VK_TPREL)
317
+ .Case (" tlvp" , VK_TLVP)
318
+ .Case (" tlvppage" , VK_TLVPPAGE)
319
+ .Case (" tlvppageoff" , VK_TLVPPAGEOFF)
320
+ .Case (" page" , VK_PAGE)
321
+ .Case (" pageoff" , VK_PAGEOFF)
322
+ .Case (" gotpage" , VK_GOTPAGE)
323
+ .Case (" gotpageoff" , VK_GOTPAGEOFF)
324
+ .Case (" imgrel" , VK_COFF_IMGREL32)
325
+ .Case (" secrel32" , VK_SECREL)
326
+ .Default (VK_Invalid);
327
+ }
328
+
249
329
/* *** */
250
330
251
331
void MCTargetExpr::anchor () {}
0 commit comments