1 //===- MCExpr.cpp - Assembly Level Expression Implementation --------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/MC/MCExpr.h" 10 #include "llvm/ADT/Statistic.h" 11 #include "llvm/ADT/StringExtras.h" 12 #include "llvm/ADT/StringSwitch.h" 13 #include "llvm/Config/llvm-config.h" 14 #include "llvm/MC/MCAsmBackend.h" 15 #include "llvm/MC/MCAsmInfo.h" 16 #include "llvm/MC/MCAsmLayout.h" 17 #include "llvm/MC/MCAssembler.h" 18 #include "llvm/MC/MCContext.h" 19 #include "llvm/MC/MCObjectWriter.h" 20 #include "llvm/MC/MCSymbol.h" 21 #include "llvm/MC/MCValue.h" 22 #include "llvm/Support/Casting.h" 23 #include "llvm/Support/Compiler.h" 24 #include "llvm/Support/Debug.h" 25 #include "llvm/Support/ErrorHandling.h" 26 #include "llvm/Support/raw_ostream.h" 27 #include <cassert> 28 #include <cstdint> 29 30 using namespace llvm; 31 32 #define DEBUG_TYPE "mcexpr" 33 34 namespace { 35 namespace stats { 36 37 STATISTIC(MCExprEvaluate, "Number of MCExpr evaluations"); 38 39 } // end namespace stats 40 } // end anonymous namespace 41 42 void MCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens) const { 43 switch (getKind()) { 44 case MCExpr::Target: 45 return cast<MCTargetExpr>(this)->printImpl(OS, MAI); 46 case MCExpr::Constant: { 47 auto Value = cast<MCConstantExpr>(*this).getValue(); 48 auto PrintInHex = cast<MCConstantExpr>(*this).useHexFormat(); 49 auto SizeInBytes = cast<MCConstantExpr>(*this).getSizeInBytes(); 50 if (Value < 0 && MAI && !MAI->supportsSignedData()) 51 PrintInHex = true; 52 if (PrintInHex) 53 switch (SizeInBytes) { 54 default: 55 OS << "0x" << Twine::utohexstr(Value); 56 break; 57 case 1: 58 OS << format("0x%02" PRIx64, Value); 59 break; 60 case 2: 61 OS << format("0x%04" PRIx64, Value); 62 break; 63 case 4: 64 OS << format("0x%08" PRIx64, Value); 65 break; 66 case 8: 67 OS << format("0x%016" PRIx64, Value); 68 break; 69 } 70 else 71 OS << Value; 72 return; 73 } 74 case MCExpr::SymbolRef: { 75 const MCSymbolRefExpr &SRE = cast<MCSymbolRefExpr>(*this); 76 const MCSymbol &Sym = SRE.getSymbol(); 77 // Parenthesize names that start with $ so that they don't look like 78 // absolute names. 79 bool UseParens = 80 !InParens && !Sym.getName().empty() && Sym.getName()[0] == '$'; 81 if (UseParens) { 82 OS << '('; 83 Sym.print(OS, MAI); 84 OS << ')'; 85 } else 86 Sym.print(OS, MAI); 87 88 if (SRE.getKind() != MCSymbolRefExpr::VK_None) 89 SRE.printVariantKind(OS); 90 91 return; 92 } 93 94 case MCExpr::Unary: { 95 const MCUnaryExpr &UE = cast<MCUnaryExpr>(*this); 96 switch (UE.getOpcode()) { 97 case MCUnaryExpr::LNot: OS << '!'; break; 98 case MCUnaryExpr::Minus: OS << '-'; break; 99 case MCUnaryExpr::Not: OS << '~'; break; 100 case MCUnaryExpr::Plus: OS << '+'; break; 101 } 102 bool Binary = UE.getSubExpr()->getKind() == MCExpr::Binary; 103 if (Binary) OS << "("; 104 UE.getSubExpr()->print(OS, MAI); 105 if (Binary) OS << ")"; 106 return; 107 } 108 109 case MCExpr::Binary: { 110 const MCBinaryExpr &BE = cast<MCBinaryExpr>(*this); 111 112 // Only print parens around the LHS if it is non-trivial. 113 if (isa<MCConstantExpr>(BE.getLHS()) || isa<MCSymbolRefExpr>(BE.getLHS())) { 114 BE.getLHS()->print(OS, MAI); 115 } else { 116 OS << '('; 117 BE.getLHS()->print(OS, MAI); 118 OS << ')'; 119 } 120 121 switch (BE.getOpcode()) { 122 case MCBinaryExpr::Add: 123 // Print "X-42" instead of "X+-42". 124 if (const MCConstantExpr *RHSC = dyn_cast<MCConstantExpr>(BE.getRHS())) { 125 if (RHSC->getValue() < 0) { 126 OS << RHSC->getValue(); 127 return; 128 } 129 } 130 131 OS << '+'; 132 break; 133 case MCBinaryExpr::AShr: OS << ">>"; break; 134 case MCBinaryExpr::And: OS << '&'; break; 135 case MCBinaryExpr::Div: OS << '/'; break; 136 case MCBinaryExpr::EQ: OS << "=="; break; 137 case MCBinaryExpr::GT: OS << '>'; break; 138 case MCBinaryExpr::GTE: OS << ">="; break; 139 case MCBinaryExpr::LAnd: OS << "&&"; break; 140 case MCBinaryExpr::LOr: OS << "||"; break; 141 case MCBinaryExpr::LShr: OS << ">>"; break; 142 case MCBinaryExpr::LT: OS << '<'; break; 143 case MCBinaryExpr::LTE: OS << "<="; break; 144 case MCBinaryExpr::Mod: OS << '%'; break; 145 case MCBinaryExpr::Mul: OS << '*'; break; 146 case MCBinaryExpr::NE: OS << "!="; break; 147 case MCBinaryExpr::Or: OS << '|'; break; 148 case MCBinaryExpr::OrNot: OS << '!'; break; 149 case MCBinaryExpr::Shl: OS << "<<"; break; 150 case MCBinaryExpr::Sub: OS << '-'; break; 151 case MCBinaryExpr::Xor: OS << '^'; break; 152 } 153 154 // Only print parens around the LHS if it is non-trivial. 155 if (isa<MCConstantExpr>(BE.getRHS()) || isa<MCSymbolRefExpr>(BE.getRHS())) { 156 BE.getRHS()->print(OS, MAI); 157 } else { 158 OS << '('; 159 BE.getRHS()->print(OS, MAI); 160 OS << ')'; 161 } 162 return; 163 } 164 } 165 166 llvm_unreachable("Invalid expression kind!"); 167 } 168 169 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 170 LLVM_DUMP_METHOD void MCExpr::dump() const { 171 dbgs() << *this; 172 dbgs() << '\n'; 173 } 174 #endif 175 176 /* *** */ 177 178 const MCBinaryExpr *MCBinaryExpr::create(Opcode Opc, const MCExpr *LHS, 179 const MCExpr *RHS, MCContext &Ctx, 180 SMLoc Loc) { 181 return new (Ctx) MCBinaryExpr(Opc, LHS, RHS, Loc); 182 } 183 184 const MCUnaryExpr *MCUnaryExpr::create(Opcode Opc, const MCExpr *Expr, 185 MCContext &Ctx, SMLoc Loc) { 186 return new (Ctx) MCUnaryExpr(Opc, Expr, Loc); 187 } 188 189 const MCConstantExpr *MCConstantExpr::create(int64_t Value, MCContext &Ctx, 190 bool PrintInHex, 191 unsigned SizeInBytes) { 192 return new (Ctx) MCConstantExpr(Value, PrintInHex, SizeInBytes); 193 } 194 195 /* *** */ 196 197 MCSymbolRefExpr::MCSymbolRefExpr(const MCSymbol *Symbol, VariantKind Kind, 198 const MCAsmInfo *MAI, SMLoc Loc) 199 : MCExpr(MCExpr::SymbolRef, Loc, 200 encodeSubclassData(Kind, MAI->useParensForSymbolVariant(), 201 MAI->hasSubsectionsViaSymbols())), 202 Symbol(Symbol) { 203 assert(Symbol); 204 } 205 206 const MCSymbolRefExpr *MCSymbolRefExpr::create(const MCSymbol *Sym, 207 VariantKind Kind, 208 MCContext &Ctx, SMLoc Loc) { 209 return new (Ctx) MCSymbolRefExpr(Sym, Kind, Ctx.getAsmInfo(), Loc); 210 } 211 212 const MCSymbolRefExpr *MCSymbolRefExpr::create(StringRef Name, VariantKind Kind, 213 MCContext &Ctx) { 214 return create(Ctx.getOrCreateSymbol(Name), Kind, Ctx); 215 } 216 217 StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) { 218 switch (Kind) { 219 case VK_Invalid: return "<<invalid>>"; 220 case VK_None: return "<<none>>"; 221 222 case VK_DTPOFF: return "DTPOFF"; 223 case VK_DTPREL: return "DTPREL"; 224 case VK_GOT: return "GOT"; 225 case VK_GOTOFF: return "GOTOFF"; 226 case VK_GOTREL: return "GOTREL"; 227 case VK_PCREL: return "PCREL"; 228 case VK_GOTPCREL: return "GOTPCREL"; 229 case VK_GOTTPOFF: return "GOTTPOFF"; 230 case VK_INDNTPOFF: return "INDNTPOFF"; 231 case VK_NTPOFF: return "NTPOFF"; 232 case VK_GOTNTPOFF: return "GOTNTPOFF"; 233 case VK_PLT: return "PLT"; 234 case VK_TLSGD: return "TLSGD"; 235 case VK_TLSLD: return "TLSLD"; 236 case VK_TLSLDM: return "TLSLDM"; 237 case VK_TPOFF: return "TPOFF"; 238 case VK_TPREL: return "TPREL"; 239 case VK_TLSCALL: return "tlscall"; 240 case VK_TLSDESC: return "tlsdesc"; 241 case VK_TLVP: return "TLVP"; 242 case VK_TLVPPAGE: return "TLVPPAGE"; 243 case VK_TLVPPAGEOFF: return "TLVPPAGEOFF"; 244 case VK_PAGE: return "PAGE"; 245 case VK_PAGEOFF: return "PAGEOFF"; 246 case VK_GOTPAGE: return "GOTPAGE"; 247 case VK_GOTPAGEOFF: return "GOTPAGEOFF"; 248 case VK_SECREL: return "SECREL32"; 249 case VK_SIZE: return "SIZE"; 250 case VK_WEAKREF: return "WEAKREF"; 251 case VK_X86_ABS8: return "ABS8"; 252 case VK_ARM_NONE: return "none"; 253 case VK_ARM_GOT_PREL: return "GOT_PREL"; 254 case VK_ARM_TARGET1: return "target1"; 255 case VK_ARM_TARGET2: return "target2"; 256 case VK_ARM_PREL31: return "prel31"; 257 case VK_ARM_SBREL: return "sbrel"; 258 case VK_ARM_TLSLDO: return "tlsldo"; 259 case VK_ARM_TLSDESCSEQ: return "tlsdescseq"; 260 case VK_AVR_NONE: return "none"; 261 case VK_AVR_LO8: return "lo8"; 262 case VK_AVR_HI8: return "hi8"; 263 case VK_AVR_HLO8: return "hlo8"; 264 case VK_AVR_DIFF8: return "diff8"; 265 case VK_AVR_DIFF16: return "diff16"; 266 case VK_AVR_DIFF32: return "diff32"; 267 case VK_PPC_LO: return "l"; 268 case VK_PPC_HI: return "h"; 269 case VK_PPC_HA: return "ha"; 270 case VK_PPC_HIGH: return "high"; 271 case VK_PPC_HIGHA: return "higha"; 272 case VK_PPC_HIGHER: return "higher"; 273 case VK_PPC_HIGHERA: return "highera"; 274 case VK_PPC_HIGHEST: return "highest"; 275 case VK_PPC_HIGHESTA: return "highesta"; 276 case VK_PPC_GOT_LO: return "got@l"; 277 case VK_PPC_GOT_HI: return "got@h"; 278 case VK_PPC_GOT_HA: return "got@ha"; 279 case VK_PPC_TOCBASE: return "tocbase"; 280 case VK_PPC_TOC: return "toc"; 281 case VK_PPC_TOC_LO: return "toc@l"; 282 case VK_PPC_TOC_HI: return "toc@h"; 283 case VK_PPC_TOC_HA: return "toc@ha"; 284 case VK_PPC_U: return "u"; 285 case VK_PPC_L: return "l"; 286 case VK_PPC_DTPMOD: return "dtpmod"; 287 case VK_PPC_TPREL_LO: return "tprel@l"; 288 case VK_PPC_TPREL_HI: return "tprel@h"; 289 case VK_PPC_TPREL_HA: return "tprel@ha"; 290 case VK_PPC_TPREL_HIGH: return "tprel@high"; 291 case VK_PPC_TPREL_HIGHA: return "tprel@higha"; 292 case VK_PPC_TPREL_HIGHER: return "tprel@higher"; 293 case VK_PPC_TPREL_HIGHERA: return "tprel@highera"; 294 case VK_PPC_TPREL_HIGHEST: return "tprel@highest"; 295 case VK_PPC_TPREL_HIGHESTA: return "tprel@highesta"; 296 case VK_PPC_DTPREL_LO: return "dtprel@l"; 297 case VK_PPC_DTPREL_HI: return "dtprel@h"; 298 case VK_PPC_DTPREL_HA: return "dtprel@ha"; 299 case VK_PPC_DTPREL_HIGH: return "dtprel@high"; 300 case VK_PPC_DTPREL_HIGHA: return "dtprel@higha"; 301 case VK_PPC_DTPREL_HIGHER: return "dtprel@higher"; 302 case VK_PPC_DTPREL_HIGHERA: return "dtprel@highera"; 303 case VK_PPC_DTPREL_HIGHEST: return "dtprel@highest"; 304 case VK_PPC_DTPREL_HIGHESTA: return "dtprel@highesta"; 305 case VK_PPC_GOT_TPREL: return "got@tprel"; 306 case VK_PPC_GOT_TPREL_LO: return "got@tprel@l"; 307 case VK_PPC_GOT_TPREL_HI: return "got@tprel@h"; 308 case VK_PPC_GOT_TPREL_HA: return "got@tprel@ha"; 309 case VK_PPC_GOT_DTPREL: return "got@dtprel"; 310 case VK_PPC_GOT_DTPREL_LO: return "got@dtprel@l"; 311 case VK_PPC_GOT_DTPREL_HI: return "got@dtprel@h"; 312 case VK_PPC_GOT_DTPREL_HA: return "got@dtprel@ha"; 313 case VK_PPC_TLS: return "tls"; 314 case VK_PPC_GOT_TLSGD: return "got@tlsgd"; 315 case VK_PPC_GOT_TLSGD_LO: return "got@tlsgd@l"; 316 case VK_PPC_GOT_TLSGD_HI: return "got@tlsgd@h"; 317 case VK_PPC_GOT_TLSGD_HA: return "got@tlsgd@ha"; 318 case VK_PPC_TLSGD: return "tlsgd"; 319 case VK_PPC_GOT_TLSLD: return "got@tlsld"; 320 case VK_PPC_GOT_TLSLD_LO: return "got@tlsld@l"; 321 case VK_PPC_GOT_TLSLD_HI: return "got@tlsld@h"; 322 case VK_PPC_GOT_TLSLD_HA: return "got@tlsld@ha"; 323 case VK_PPC_GOT_PCREL: 324 return "got@pcrel"; 325 case VK_PPC_GOT_TLSGD_PCREL: 326 return "got@tlsgd@pcrel"; 327 case VK_PPC_GOT_TPREL_PCREL: 328 return "got@tprel@pcrel"; 329 case VK_PPC_TLS_PCREL: 330 return "tls@pcrel"; 331 case VK_PPC_TLSLD: return "tlsld"; 332 case VK_PPC_LOCAL: return "local"; 333 case VK_PPC_NOTOC: return "notoc"; 334 case VK_PPC_PCREL_OPT: return "<<invalid>>"; 335 case VK_COFF_IMGREL32: return "IMGREL"; 336 case VK_Hexagon_LO16: return "LO16"; 337 case VK_Hexagon_HI16: return "HI16"; 338 case VK_Hexagon_GPREL: return "GPREL"; 339 case VK_Hexagon_GD_GOT: return "GDGOT"; 340 case VK_Hexagon_LD_GOT: return "LDGOT"; 341 case VK_Hexagon_GD_PLT: return "GDPLT"; 342 case VK_Hexagon_LD_PLT: return "LDPLT"; 343 case VK_Hexagon_IE: return "IE"; 344 case VK_Hexagon_IE_GOT: return "IEGOT"; 345 case VK_WASM_TYPEINDEX: return "TYPEINDEX"; 346 case VK_WASM_MBREL: return "MBREL"; 347 case VK_WASM_TBREL: return "TBREL"; 348 case VK_AMDGPU_GOTPCREL32_LO: return "gotpcrel32@lo"; 349 case VK_AMDGPU_GOTPCREL32_HI: return "gotpcrel32@hi"; 350 case VK_AMDGPU_REL32_LO: return "rel32@lo"; 351 case VK_AMDGPU_REL32_HI: return "rel32@hi"; 352 case VK_AMDGPU_REL64: return "rel64"; 353 case VK_AMDGPU_ABS32_LO: return "abs32@lo"; 354 case VK_AMDGPU_ABS32_HI: return "abs32@hi"; 355 case VK_VE_HI32: return "hi"; 356 case VK_VE_LO32: return "lo"; 357 case VK_VE_PC_HI32: return "pc_hi"; 358 case VK_VE_PC_LO32: return "pc_lo"; 359 case VK_VE_GOT_HI32: return "got_hi"; 360 case VK_VE_GOT_LO32: return "got_lo"; 361 case VK_VE_GOTOFF_HI32: return "gotoff_hi"; 362 case VK_VE_GOTOFF_LO32: return "gotoff_lo"; 363 case VK_VE_PLT_HI32: return "plt_hi"; 364 case VK_VE_PLT_LO32: return "plt_lo"; 365 case VK_VE_TLS_GD_HI32: return "tls_gd_hi"; 366 case VK_VE_TLS_GD_LO32: return "tls_gd_lo"; 367 case VK_VE_TPOFF_HI32: return "tpoff_hi"; 368 case VK_VE_TPOFF_LO32: return "tpoff_lo"; 369 } 370 llvm_unreachable("Invalid variant kind"); 371 } 372 373 MCSymbolRefExpr::VariantKind 374 MCSymbolRefExpr::getVariantKindForName(StringRef Name) { 375 return StringSwitch<VariantKind>(Name.lower()) 376 .Case("dtprel", VK_DTPREL) 377 .Case("dtpoff", VK_DTPOFF) 378 .Case("got", VK_GOT) 379 .Case("gotoff", VK_GOTOFF) 380 .Case("gotrel", VK_GOTREL) 381 .Case("pcrel", VK_PCREL) 382 .Case("gotpcrel", VK_GOTPCREL) 383 .Case("gottpoff", VK_GOTTPOFF) 384 .Case("indntpoff", VK_INDNTPOFF) 385 .Case("ntpoff", VK_NTPOFF) 386 .Case("gotntpoff", VK_GOTNTPOFF) 387 .Case("plt", VK_PLT) 388 .Case("tlscall", VK_TLSCALL) 389 .Case("tlsdesc", VK_TLSDESC) 390 .Case("tlsgd", VK_TLSGD) 391 .Case("tlsld", VK_TLSLD) 392 .Case("tlsldm", VK_TLSLDM) 393 .Case("tpoff", VK_TPOFF) 394 .Case("tprel", VK_TPREL) 395 .Case("tlvp", VK_TLVP) 396 .Case("tlvppage", VK_TLVPPAGE) 397 .Case("tlvppageoff", VK_TLVPPAGEOFF) 398 .Case("page", VK_PAGE) 399 .Case("pageoff", VK_PAGEOFF) 400 .Case("gotpage", VK_GOTPAGE) 401 .Case("gotpageoff", VK_GOTPAGEOFF) 402 .Case("imgrel", VK_COFF_IMGREL32) 403 .Case("secrel32", VK_SECREL) 404 .Case("size", VK_SIZE) 405 .Case("abs8", VK_X86_ABS8) 406 .Case("l", VK_PPC_LO) 407 .Case("h", VK_PPC_HI) 408 .Case("ha", VK_PPC_HA) 409 .Case("high", VK_PPC_HIGH) 410 .Case("higha", VK_PPC_HIGHA) 411 .Case("higher", VK_PPC_HIGHER) 412 .Case("highera", VK_PPC_HIGHERA) 413 .Case("highest", VK_PPC_HIGHEST) 414 .Case("highesta", VK_PPC_HIGHESTA) 415 .Case("got@l", VK_PPC_GOT_LO) 416 .Case("got@h", VK_PPC_GOT_HI) 417 .Case("got@ha", VK_PPC_GOT_HA) 418 .Case("local", VK_PPC_LOCAL) 419 .Case("tocbase", VK_PPC_TOCBASE) 420 .Case("toc", VK_PPC_TOC) 421 .Case("toc@l", VK_PPC_TOC_LO) 422 .Case("toc@h", VK_PPC_TOC_HI) 423 .Case("toc@ha", VK_PPC_TOC_HA) 424 .Case("u", VK_PPC_U) 425 .Case("l", VK_PPC_L) 426 .Case("tls", VK_PPC_TLS) 427 .Case("dtpmod", VK_PPC_DTPMOD) 428 .Case("tprel@l", VK_PPC_TPREL_LO) 429 .Case("tprel@h", VK_PPC_TPREL_HI) 430 .Case("tprel@ha", VK_PPC_TPREL_HA) 431 .Case("tprel@high", VK_PPC_TPREL_HIGH) 432 .Case("tprel@higha", VK_PPC_TPREL_HIGHA) 433 .Case("tprel@higher", VK_PPC_TPREL_HIGHER) 434 .Case("tprel@highera", VK_PPC_TPREL_HIGHERA) 435 .Case("tprel@highest", VK_PPC_TPREL_HIGHEST) 436 .Case("tprel@highesta", VK_PPC_TPREL_HIGHESTA) 437 .Case("dtprel@l", VK_PPC_DTPREL_LO) 438 .Case("dtprel@h", VK_PPC_DTPREL_HI) 439 .Case("dtprel@ha", VK_PPC_DTPREL_HA) 440 .Case("dtprel@high", VK_PPC_DTPREL_HIGH) 441 .Case("dtprel@higha", VK_PPC_DTPREL_HIGHA) 442 .Case("dtprel@higher", VK_PPC_DTPREL_HIGHER) 443 .Case("dtprel@highera", VK_PPC_DTPREL_HIGHERA) 444 .Case("dtprel@highest", VK_PPC_DTPREL_HIGHEST) 445 .Case("dtprel@highesta", VK_PPC_DTPREL_HIGHESTA) 446 .Case("got@tprel", VK_PPC_GOT_TPREL) 447 .Case("got@tprel@l", VK_PPC_GOT_TPREL_LO) 448 .Case("got@tprel@h", VK_PPC_GOT_TPREL_HI) 449 .Case("got@tprel@ha", VK_PPC_GOT_TPREL_HA) 450 .Case("got@dtprel", VK_PPC_GOT_DTPREL) 451 .Case("got@dtprel@l", VK_PPC_GOT_DTPREL_LO) 452 .Case("got@dtprel@h", VK_PPC_GOT_DTPREL_HI) 453 .Case("got@dtprel@ha", VK_PPC_GOT_DTPREL_HA) 454 .Case("got@tlsgd", VK_PPC_GOT_TLSGD) 455 .Case("got@tlsgd@l", VK_PPC_GOT_TLSGD_LO) 456 .Case("got@tlsgd@h", VK_PPC_GOT_TLSGD_HI) 457 .Case("got@tlsgd@ha", VK_PPC_GOT_TLSGD_HA) 458 .Case("got@tlsld", VK_PPC_GOT_TLSLD) 459 .Case("got@tlsld@l", VK_PPC_GOT_TLSLD_LO) 460 .Case("got@tlsld@h", VK_PPC_GOT_TLSLD_HI) 461 .Case("got@tlsld@ha", VK_PPC_GOT_TLSLD_HA) 462 .Case("got@pcrel", VK_PPC_GOT_PCREL) 463 .Case("got@tlsgd@pcrel", VK_PPC_GOT_TLSGD_PCREL) 464 .Case("got@tprel@pcrel", VK_PPC_GOT_TPREL_PCREL) 465 .Case("tls@pcrel", VK_PPC_TLS_PCREL) 466 .Case("notoc", VK_PPC_NOTOC) 467 .Case("gdgot", VK_Hexagon_GD_GOT) 468 .Case("gdplt", VK_Hexagon_GD_PLT) 469 .Case("iegot", VK_Hexagon_IE_GOT) 470 .Case("ie", VK_Hexagon_IE) 471 .Case("ldgot", VK_Hexagon_LD_GOT) 472 .Case("ldplt", VK_Hexagon_LD_PLT) 473 .Case("none", VK_ARM_NONE) 474 .Case("got_prel", VK_ARM_GOT_PREL) 475 .Case("target1", VK_ARM_TARGET1) 476 .Case("target2", VK_ARM_TARGET2) 477 .Case("prel31", VK_ARM_PREL31) 478 .Case("sbrel", VK_ARM_SBREL) 479 .Case("tlsldo", VK_ARM_TLSLDO) 480 .Case("lo8", VK_AVR_LO8) 481 .Case("hi8", VK_AVR_HI8) 482 .Case("hlo8", VK_AVR_HLO8) 483 .Case("typeindex", VK_WASM_TYPEINDEX) 484 .Case("tbrel", VK_WASM_TBREL) 485 .Case("mbrel", VK_WASM_MBREL) 486 .Case("gotpcrel32@lo", VK_AMDGPU_GOTPCREL32_LO) 487 .Case("gotpcrel32@hi", VK_AMDGPU_GOTPCREL32_HI) 488 .Case("rel32@lo", VK_AMDGPU_REL32_LO) 489 .Case("rel32@hi", VK_AMDGPU_REL32_HI) 490 .Case("rel64", VK_AMDGPU_REL64) 491 .Case("abs32@lo", VK_AMDGPU_ABS32_LO) 492 .Case("abs32@hi", VK_AMDGPU_ABS32_HI) 493 .Case("hi", VK_VE_HI32) 494 .Case("lo", VK_VE_LO32) 495 .Case("pc_hi", VK_VE_PC_HI32) 496 .Case("pc_lo", VK_VE_PC_LO32) 497 .Case("got_hi", VK_VE_GOT_HI32) 498 .Case("got_lo", VK_VE_GOT_LO32) 499 .Case("gotoff_hi", VK_VE_GOTOFF_HI32) 500 .Case("gotoff_lo", VK_VE_GOTOFF_LO32) 501 .Case("plt_hi", VK_VE_PLT_HI32) 502 .Case("plt_lo", VK_VE_PLT_LO32) 503 .Case("tls_gd_hi", VK_VE_TLS_GD_HI32) 504 .Case("tls_gd_lo", VK_VE_TLS_GD_LO32) 505 .Case("tpoff_hi", VK_VE_TPOFF_HI32) 506 .Case("tpoff_lo", VK_VE_TPOFF_LO32) 507 .Default(VK_Invalid); 508 } 509 510 void MCSymbolRefExpr::printVariantKind(raw_ostream &OS) const { 511 if (useParensForSymbolVariant()) 512 OS << '(' << MCSymbolRefExpr::getVariantKindName(getKind()) << ')'; 513 else 514 OS << '@' << MCSymbolRefExpr::getVariantKindName(getKind()); 515 } 516 517 /* *** */ 518 519 void MCTargetExpr::anchor() {} 520 521 /* *** */ 522 523 bool MCExpr::evaluateAsAbsolute(int64_t &Res) const { 524 return evaluateAsAbsolute(Res, nullptr, nullptr, nullptr, false); 525 } 526 527 bool MCExpr::evaluateAsAbsolute(int64_t &Res, 528 const MCAsmLayout &Layout) const { 529 return evaluateAsAbsolute(Res, &Layout.getAssembler(), &Layout, nullptr, false); 530 } 531 532 bool MCExpr::evaluateAsAbsolute(int64_t &Res, 533 const MCAsmLayout &Layout, 534 const SectionAddrMap &Addrs) const { 535 // Setting InSet causes us to absolutize differences across sections and that 536 // is what the MachO writer uses Addrs for. 537 return evaluateAsAbsolute(Res, &Layout.getAssembler(), &Layout, &Addrs, true); 538 } 539 540 bool MCExpr::evaluateAsAbsolute(int64_t &Res, const MCAssembler &Asm) const { 541 return evaluateAsAbsolute(Res, &Asm, nullptr, nullptr, false); 542 } 543 544 bool MCExpr::evaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm) const { 545 return evaluateAsAbsolute(Res, Asm, nullptr, nullptr, false); 546 } 547 548 bool MCExpr::evaluateKnownAbsolute(int64_t &Res, 549 const MCAsmLayout &Layout) const { 550 return evaluateAsAbsolute(Res, &Layout.getAssembler(), &Layout, nullptr, 551 true); 552 } 553 554 bool MCExpr::evaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm, 555 const MCAsmLayout *Layout, 556 const SectionAddrMap *Addrs, bool InSet) const { 557 MCValue Value; 558 559 // Fast path constants. 560 if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(this)) { 561 Res = CE->getValue(); 562 return true; 563 } 564 565 bool IsRelocatable = 566 evaluateAsRelocatableImpl(Value, Asm, Layout, nullptr, Addrs, InSet); 567 568 // Record the current value. 569 Res = Value.getConstant(); 570 571 return IsRelocatable && Value.isAbsolute(); 572 } 573 574 /// Helper method for \see EvaluateSymbolAdd(). 575 static void AttemptToFoldSymbolOffsetDifference( 576 const MCAssembler *Asm, const MCAsmLayout *Layout, 577 const SectionAddrMap *Addrs, bool InSet, const MCSymbolRefExpr *&A, 578 const MCSymbolRefExpr *&B, int64_t &Addend) { 579 if (!A || !B) 580 return; 581 582 const MCSymbol &SA = A->getSymbol(); 583 const MCSymbol &SB = B->getSymbol(); 584 585 if (SA.isUndefined() || SB.isUndefined()) 586 return; 587 588 if (!Asm->getWriter().isSymbolRefDifferenceFullyResolved(*Asm, A, B, InSet)) 589 return; 590 591 MCFragment *FA = SA.getFragment(); 592 MCFragment *FB = SB.getFragment(); 593 if (FA == FB && !SA.isVariable() && !SA.isUnset() && !SB.isVariable() && 594 !SB.isUnset()) { 595 Addend += (SA.getOffset() - SB.getOffset()); 596 597 // Pointers to Thumb symbols need to have their low-bit set to allow 598 // for interworking. 599 if (Asm->isThumbFunc(&SA)) 600 Addend |= 1; 601 602 // If symbol is labeled as micromips, we set low-bit to ensure 603 // correct offset in .gcc_except_table 604 if (Asm->getBackend().isMicroMips(&SA)) 605 Addend |= 1; 606 607 // Clear the symbol expr pointers to indicate we have folded these 608 // operands. 609 A = B = nullptr; 610 return; 611 } 612 613 if (!Layout) 614 return; 615 616 const MCSection &SecA = *FA->getParent(); 617 const MCSection &SecB = *FB->getParent(); 618 619 if ((&SecA != &SecB) && !Addrs) 620 return; 621 622 // One of the symbol involved is part of a fragment being laid out. Quit now 623 // to avoid a self loop. 624 if (!Layout->canGetFragmentOffset(FA) || !Layout->canGetFragmentOffset(FB)) 625 return; 626 627 // Eagerly evaluate. 628 Addend += Layout->getSymbolOffset(A->getSymbol()) - 629 Layout->getSymbolOffset(B->getSymbol()); 630 if (Addrs && (&SecA != &SecB)) 631 Addend += (Addrs->lookup(&SecA) - Addrs->lookup(&SecB)); 632 633 // Pointers to Thumb symbols need to have their low-bit set to allow 634 // for interworking. 635 if (Asm->isThumbFunc(&SA)) 636 Addend |= 1; 637 638 // If symbol is labeled as micromips, we set low-bit to ensure 639 // correct offset in .gcc_except_table 640 if (Asm->getBackend().isMicroMips(&SA)) 641 Addend |= 1; 642 643 // Clear the symbol expr pointers to indicate we have folded these 644 // operands. 645 A = B = nullptr; 646 } 647 648 static bool canFold(const MCAssembler *Asm, const MCSymbolRefExpr *A, 649 const MCSymbolRefExpr *B, bool InSet) { 650 if (InSet) 651 return true; 652 653 if (!Asm->getBackend().requiresDiffExpressionRelocations()) 654 return true; 655 656 const MCSymbol &CheckSym = A ? A->getSymbol() : B->getSymbol(); 657 if (!CheckSym.isInSection()) 658 return true; 659 660 if (!CheckSym.getSection().hasInstructions()) 661 return true; 662 663 return false; 664 } 665 666 /// Evaluate the result of an add between (conceptually) two MCValues. 667 /// 668 /// This routine conceptually attempts to construct an MCValue: 669 /// Result = (Result_A - Result_B + Result_Cst) 670 /// from two MCValue's LHS and RHS where 671 /// Result = LHS + RHS 672 /// and 673 /// Result = (LHS_A - LHS_B + LHS_Cst) + (RHS_A - RHS_B + RHS_Cst). 674 /// 675 /// This routine attempts to aggressively fold the operands such that the result 676 /// is representable in an MCValue, but may not always succeed. 677 /// 678 /// \returns True on success, false if the result is not representable in an 679 /// MCValue. 680 681 /// NOTE: It is really important to have both the Asm and Layout arguments. 682 /// They might look redundant, but this function can be used before layout 683 /// is done (see the object streamer for example) and having the Asm argument 684 /// lets us avoid relaxations early. 685 static bool 686 EvaluateSymbolicAdd(const MCAssembler *Asm, const MCAsmLayout *Layout, 687 const SectionAddrMap *Addrs, bool InSet, const MCValue &LHS, 688 const MCSymbolRefExpr *RHS_A, const MCSymbolRefExpr *RHS_B, 689 int64_t RHS_Cst, MCValue &Res) { 690 // FIXME: This routine (and other evaluation parts) are *incredibly* sloppy 691 // about dealing with modifiers. This will ultimately bite us, one day. 692 const MCSymbolRefExpr *LHS_A = LHS.getSymA(); 693 const MCSymbolRefExpr *LHS_B = LHS.getSymB(); 694 int64_t LHS_Cst = LHS.getConstant(); 695 696 // Fold the result constant immediately. 697 int64_t Result_Cst = LHS_Cst + RHS_Cst; 698 699 assert((!Layout || Asm) && 700 "Must have an assembler object if layout is given!"); 701 702 // If we have a layout, we can fold resolved differences. Do not do this if 703 // the backend requires this to be emitted as individual relocations, unless 704 // the InSet flag is set to get the current difference anyway (used for 705 // example to calculate symbol sizes). 706 if (Asm && canFold(Asm, LHS_A, LHS_B, InSet)) { 707 // First, fold out any differences which are fully resolved. By 708 // reassociating terms in 709 // Result = (LHS_A - LHS_B + LHS_Cst) + (RHS_A - RHS_B + RHS_Cst). 710 // we have the four possible differences: 711 // (LHS_A - LHS_B), 712 // (LHS_A - RHS_B), 713 // (RHS_A - LHS_B), 714 // (RHS_A - RHS_B). 715 // Since we are attempting to be as aggressive as possible about folding, we 716 // attempt to evaluate each possible alternative. 717 AttemptToFoldSymbolOffsetDifference(Asm, Layout, Addrs, InSet, LHS_A, LHS_B, 718 Result_Cst); 719 AttemptToFoldSymbolOffsetDifference(Asm, Layout, Addrs, InSet, LHS_A, RHS_B, 720 Result_Cst); 721 AttemptToFoldSymbolOffsetDifference(Asm, Layout, Addrs, InSet, RHS_A, LHS_B, 722 Result_Cst); 723 AttemptToFoldSymbolOffsetDifference(Asm, Layout, Addrs, InSet, RHS_A, RHS_B, 724 Result_Cst); 725 } 726 727 // We can't represent the addition or subtraction of two symbols. 728 if ((LHS_A && RHS_A) || (LHS_B && RHS_B)) 729 return false; 730 731 // At this point, we have at most one additive symbol and one subtractive 732 // symbol -- find them. 733 const MCSymbolRefExpr *A = LHS_A ? LHS_A : RHS_A; 734 const MCSymbolRefExpr *B = LHS_B ? LHS_B : RHS_B; 735 736 Res = MCValue::get(A, B, Result_Cst); 737 return true; 738 } 739 740 bool MCExpr::evaluateAsRelocatable(MCValue &Res, 741 const MCAsmLayout *Layout, 742 const MCFixup *Fixup) const { 743 MCAssembler *Assembler = Layout ? &Layout->getAssembler() : nullptr; 744 return evaluateAsRelocatableImpl(Res, Assembler, Layout, Fixup, nullptr, 745 false); 746 } 747 748 bool MCExpr::evaluateAsValue(MCValue &Res, const MCAsmLayout &Layout) const { 749 MCAssembler *Assembler = &Layout.getAssembler(); 750 return evaluateAsRelocatableImpl(Res, Assembler, &Layout, nullptr, nullptr, 751 true); 752 } 753 754 static bool canExpand(const MCSymbol &Sym, bool InSet) { 755 const MCExpr *Expr = Sym.getVariableValue(); 756 const auto *Inner = dyn_cast<MCSymbolRefExpr>(Expr); 757 if (Inner) { 758 if (Inner->getKind() == MCSymbolRefExpr::VK_WEAKREF) 759 return false; 760 } 761 762 if (InSet) 763 return true; 764 return !Sym.isInSection(); 765 } 766 767 bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, 768 const MCAsmLayout *Layout, 769 const MCFixup *Fixup, 770 const SectionAddrMap *Addrs, 771 bool InSet) const { 772 ++stats::MCExprEvaluate; 773 774 switch (getKind()) { 775 case Target: 776 return cast<MCTargetExpr>(this)->evaluateAsRelocatableImpl(Res, Layout, 777 Fixup); 778 779 case Constant: 780 Res = MCValue::get(cast<MCConstantExpr>(this)->getValue()); 781 return true; 782 783 case SymbolRef: { 784 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(this); 785 const MCSymbol &Sym = SRE->getSymbol(); 786 787 // Evaluate recursively if this is a variable. 788 if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None && 789 canExpand(Sym, InSet)) { 790 bool IsMachO = SRE->hasSubsectionsViaSymbols(); 791 if (Sym.getVariableValue()->evaluateAsRelocatableImpl( 792 Res, Asm, Layout, Fixup, Addrs, InSet || IsMachO)) { 793 if (!IsMachO) 794 return true; 795 796 const MCSymbolRefExpr *A = Res.getSymA(); 797 const MCSymbolRefExpr *B = Res.getSymB(); 798 // FIXME: This is small hack. Given 799 // a = b + 4 800 // .long a 801 // the OS X assembler will completely drop the 4. We should probably 802 // include it in the relocation or produce an error if that is not 803 // possible. 804 // Allow constant expressions. 805 if (!A && !B) 806 return true; 807 // Allows aliases with zero offset. 808 if (Res.getConstant() == 0 && (!A || !B)) 809 return true; 810 } 811 } 812 813 Res = MCValue::get(SRE, nullptr, 0); 814 return true; 815 } 816 817 case Unary: { 818 const MCUnaryExpr *AUE = cast<MCUnaryExpr>(this); 819 MCValue Value; 820 821 if (!AUE->getSubExpr()->evaluateAsRelocatableImpl(Value, Asm, Layout, Fixup, 822 Addrs, InSet)) 823 return false; 824 825 switch (AUE->getOpcode()) { 826 case MCUnaryExpr::LNot: 827 if (!Value.isAbsolute()) 828 return false; 829 Res = MCValue::get(!Value.getConstant()); 830 break; 831 case MCUnaryExpr::Minus: 832 /// -(a - b + const) ==> (b - a - const) 833 if (Value.getSymA() && !Value.getSymB()) 834 return false; 835 836 // The cast avoids undefined behavior if the constant is INT64_MIN. 837 Res = MCValue::get(Value.getSymB(), Value.getSymA(), 838 -(uint64_t)Value.getConstant()); 839 break; 840 case MCUnaryExpr::Not: 841 if (!Value.isAbsolute()) 842 return false; 843 Res = MCValue::get(~Value.getConstant()); 844 break; 845 case MCUnaryExpr::Plus: 846 Res = Value; 847 break; 848 } 849 850 return true; 851 } 852 853 case Binary: { 854 const MCBinaryExpr *ABE = cast<MCBinaryExpr>(this); 855 MCValue LHSValue, RHSValue; 856 857 if (!ABE->getLHS()->evaluateAsRelocatableImpl(LHSValue, Asm, Layout, Fixup, 858 Addrs, InSet) || 859 !ABE->getRHS()->evaluateAsRelocatableImpl(RHSValue, Asm, Layout, Fixup, 860 Addrs, InSet)) { 861 // Check if both are Target Expressions, see if we can compare them. 862 if (const MCTargetExpr *L = dyn_cast<MCTargetExpr>(ABE->getLHS())) 863 if (const MCTargetExpr *R = cast<MCTargetExpr>(ABE->getRHS())) { 864 switch (ABE->getOpcode()) { 865 case MCBinaryExpr::EQ: 866 Res = MCValue::get((L->isEqualTo(R)) ? -1 : 0); 867 return true; 868 case MCBinaryExpr::NE: 869 Res = MCValue::get((R->isEqualTo(R)) ? 0 : -1); 870 return true; 871 default: break; 872 } 873 } 874 return false; 875 } 876 877 // We only support a few operations on non-constant expressions, handle 878 // those first. 879 if (!LHSValue.isAbsolute() || !RHSValue.isAbsolute()) { 880 switch (ABE->getOpcode()) { 881 default: 882 return false; 883 case MCBinaryExpr::Sub: 884 // Negate RHS and add. 885 // The cast avoids undefined behavior if the constant is INT64_MIN. 886 return EvaluateSymbolicAdd(Asm, Layout, Addrs, InSet, LHSValue, 887 RHSValue.getSymB(), RHSValue.getSymA(), 888 -(uint64_t)RHSValue.getConstant(), Res); 889 890 case MCBinaryExpr::Add: 891 return EvaluateSymbolicAdd(Asm, Layout, Addrs, InSet, LHSValue, 892 RHSValue.getSymA(), RHSValue.getSymB(), 893 RHSValue.getConstant(), Res); 894 } 895 } 896 897 // FIXME: We need target hooks for the evaluation. It may be limited in 898 // width, and gas defines the result of comparisons differently from 899 // Apple as. 900 int64_t LHS = LHSValue.getConstant(), RHS = RHSValue.getConstant(); 901 int64_t Result = 0; 902 auto Op = ABE->getOpcode(); 903 switch (Op) { 904 case MCBinaryExpr::AShr: Result = LHS >> RHS; break; 905 case MCBinaryExpr::Add: Result = LHS + RHS; break; 906 case MCBinaryExpr::And: Result = LHS & RHS; break; 907 case MCBinaryExpr::Div: 908 case MCBinaryExpr::Mod: 909 // Handle division by zero. gas just emits a warning and keeps going, 910 // we try to be stricter. 911 // FIXME: Currently the caller of this function has no way to understand 912 // we're bailing out because of 'division by zero'. Therefore, it will 913 // emit a 'expected relocatable expression' error. It would be nice to 914 // change this code to emit a better diagnostic. 915 if (RHS == 0) 916 return false; 917 if (ABE->getOpcode() == MCBinaryExpr::Div) 918 Result = LHS / RHS; 919 else 920 Result = LHS % RHS; 921 break; 922 case MCBinaryExpr::EQ: Result = LHS == RHS; break; 923 case MCBinaryExpr::GT: Result = LHS > RHS; break; 924 case MCBinaryExpr::GTE: Result = LHS >= RHS; break; 925 case MCBinaryExpr::LAnd: Result = LHS && RHS; break; 926 case MCBinaryExpr::LOr: Result = LHS || RHS; break; 927 case MCBinaryExpr::LShr: Result = uint64_t(LHS) >> uint64_t(RHS); break; 928 case MCBinaryExpr::LT: Result = LHS < RHS; break; 929 case MCBinaryExpr::LTE: Result = LHS <= RHS; break; 930 case MCBinaryExpr::Mul: Result = LHS * RHS; break; 931 case MCBinaryExpr::NE: Result = LHS != RHS; break; 932 case MCBinaryExpr::Or: Result = LHS | RHS; break; 933 case MCBinaryExpr::OrNot: Result = LHS | ~RHS; break; 934 case MCBinaryExpr::Shl: Result = uint64_t(LHS) << uint64_t(RHS); break; 935 case MCBinaryExpr::Sub: Result = LHS - RHS; break; 936 case MCBinaryExpr::Xor: Result = LHS ^ RHS; break; 937 } 938 939 switch (Op) { 940 default: 941 Res = MCValue::get(Result); 942 break; 943 case MCBinaryExpr::EQ: 944 case MCBinaryExpr::GT: 945 case MCBinaryExpr::GTE: 946 case MCBinaryExpr::LT: 947 case MCBinaryExpr::LTE: 948 case MCBinaryExpr::NE: 949 // A comparison operator returns a -1 if true and 0 if false. 950 Res = MCValue::get(Result ? -1 : 0); 951 break; 952 } 953 954 return true; 955 } 956 } 957 958 llvm_unreachable("Invalid assembly expression kind!"); 959 } 960 961 MCFragment *MCExpr::findAssociatedFragment() const { 962 switch (getKind()) { 963 case Target: 964 // We never look through target specific expressions. 965 return cast<MCTargetExpr>(this)->findAssociatedFragment(); 966 967 case Constant: 968 return MCSymbol::AbsolutePseudoFragment; 969 970 case SymbolRef: { 971 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(this); 972 const MCSymbol &Sym = SRE->getSymbol(); 973 return Sym.getFragment(); 974 } 975 976 case Unary: 977 return cast<MCUnaryExpr>(this)->getSubExpr()->findAssociatedFragment(); 978 979 case Binary: { 980 const MCBinaryExpr *BE = cast<MCBinaryExpr>(this); 981 MCFragment *LHS_F = BE->getLHS()->findAssociatedFragment(); 982 MCFragment *RHS_F = BE->getRHS()->findAssociatedFragment(); 983 984 // If either is absolute, return the other. 985 if (LHS_F == MCSymbol::AbsolutePseudoFragment) 986 return RHS_F; 987 if (RHS_F == MCSymbol::AbsolutePseudoFragment) 988 return LHS_F; 989 990 // Not always correct, but probably the best we can do without more context. 991 if (BE->getOpcode() == MCBinaryExpr::Sub) 992 return MCSymbol::AbsolutePseudoFragment; 993 994 // Otherwise, return the first non-null fragment. 995 return LHS_F ? LHS_F : RHS_F; 996 } 997 } 998 999 llvm_unreachable("Invalid assembly expression kind!"); 1000 } 1001