MCExpr.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811
  1. //===- MCExpr.cpp - Assembly Level Expression Implementation --------------===//
  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. #include "llvm/MC/MCExpr.h"
  10. #include "llvm/ADT/Statistic.h"
  11. #include "llvm/ADT/StringSwitch.h"
  12. #include "llvm/MC/MCAsmInfo.h"
  13. #include "llvm/MC/MCAsmLayout.h"
  14. #include "llvm/MC/MCAssembler.h"
  15. #include "llvm/MC/MCContext.h"
  16. #include "llvm/MC/MCObjectWriter.h"
  17. #include "llvm/MC/MCSymbol.h"
  18. #include "llvm/MC/MCValue.h"
  19. #include "llvm/Support/Debug.h"
  20. #include "llvm/Support/ErrorHandling.h"
  21. #include "llvm/Support/raw_ostream.h"
  22. using namespace llvm;
  23. #define DEBUG_TYPE "mcexpr"
  24. namespace {
  25. namespace stats {
  26. STATISTIC(MCExprEvaluate, "Number of MCExpr evaluations");
  27. }
  28. }
  29. void MCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI) const {
  30. switch (getKind()) {
  31. case MCExpr::Target:
  32. return cast<MCTargetExpr>(this)->printImpl(OS, MAI);
  33. case MCExpr::Constant:
  34. OS << cast<MCConstantExpr>(*this).getValue();
  35. return;
  36. case MCExpr::SymbolRef: {
  37. const MCSymbolRefExpr &SRE = cast<MCSymbolRefExpr>(*this);
  38. const MCSymbol &Sym = SRE.getSymbol();
  39. // Parenthesize names that start with $ so that they don't look like
  40. // absolute names.
  41. bool UseParens = Sym.getName()[0] == '$';
  42. if (UseParens) {
  43. OS << '(';
  44. Sym.print(OS, MAI);
  45. OS << ')';
  46. } else
  47. Sym.print(OS, MAI);
  48. if (SRE.getKind() != MCSymbolRefExpr::VK_None)
  49. SRE.printVariantKind(OS);
  50. return;
  51. }
  52. case MCExpr::Unary: {
  53. const MCUnaryExpr &UE = cast<MCUnaryExpr>(*this);
  54. switch (UE.getOpcode()) {
  55. case MCUnaryExpr::LNot: OS << '!'; break;
  56. case MCUnaryExpr::Minus: OS << '-'; break;
  57. case MCUnaryExpr::Not: OS << '~'; break;
  58. case MCUnaryExpr::Plus: OS << '+'; break;
  59. }
  60. UE.getSubExpr()->print(OS, MAI);
  61. return;
  62. }
  63. case MCExpr::Binary: {
  64. const MCBinaryExpr &BE = cast<MCBinaryExpr>(*this);
  65. // Only print parens around the LHS if it is non-trivial.
  66. if (isa<MCConstantExpr>(BE.getLHS()) || isa<MCSymbolRefExpr>(BE.getLHS())) {
  67. BE.getLHS()->print(OS, MAI);
  68. } else {
  69. OS << '(';
  70. BE.getLHS()->print(OS, MAI);
  71. OS << ')';
  72. }
  73. switch (BE.getOpcode()) {
  74. case MCBinaryExpr::Add:
  75. // Print "X-42" instead of "X+-42".
  76. if (const MCConstantExpr *RHSC = dyn_cast<MCConstantExpr>(BE.getRHS())) {
  77. if (RHSC->getValue() < 0) {
  78. OS << RHSC->getValue();
  79. return;
  80. }
  81. }
  82. OS << '+';
  83. break;
  84. case MCBinaryExpr::AShr: OS << ">>"; break;
  85. case MCBinaryExpr::And: OS << '&'; break;
  86. case MCBinaryExpr::Div: OS << '/'; break;
  87. case MCBinaryExpr::EQ: OS << "=="; break;
  88. case MCBinaryExpr::GT: OS << '>'; break;
  89. case MCBinaryExpr::GTE: OS << ">="; break;
  90. case MCBinaryExpr::LAnd: OS << "&&"; break;
  91. case MCBinaryExpr::LOr: OS << "||"; break;
  92. case MCBinaryExpr::LShr: OS << ">>"; break;
  93. case MCBinaryExpr::LT: OS << '<'; break;
  94. case MCBinaryExpr::LTE: OS << "<="; break;
  95. case MCBinaryExpr::Mod: OS << '%'; break;
  96. case MCBinaryExpr::Mul: OS << '*'; break;
  97. case MCBinaryExpr::NE: OS << "!="; break;
  98. case MCBinaryExpr::Or: OS << '|'; break;
  99. case MCBinaryExpr::Shl: OS << "<<"; break;
  100. case MCBinaryExpr::Sub: OS << '-'; break;
  101. case MCBinaryExpr::Xor: OS << '^'; break;
  102. }
  103. // Only print parens around the LHS if it is non-trivial.
  104. if (isa<MCConstantExpr>(BE.getRHS()) || isa<MCSymbolRefExpr>(BE.getRHS())) {
  105. BE.getRHS()->print(OS, MAI);
  106. } else {
  107. OS << '(';
  108. BE.getRHS()->print(OS, MAI);
  109. OS << ')';
  110. }
  111. return;
  112. }
  113. }
  114. llvm_unreachable("Invalid expression kind!");
  115. }
  116. #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
  117. void MCExpr::dump() const {
  118. dbgs() << *this;
  119. dbgs() << '\n';
  120. }
  121. #endif
  122. /* *** */
  123. const MCBinaryExpr *MCBinaryExpr::create(Opcode Opc, const MCExpr *LHS,
  124. const MCExpr *RHS, MCContext &Ctx) {
  125. return new (Ctx) MCBinaryExpr(Opc, LHS, RHS);
  126. }
  127. const MCUnaryExpr *MCUnaryExpr::create(Opcode Opc, const MCExpr *Expr,
  128. MCContext &Ctx) {
  129. return new (Ctx) MCUnaryExpr(Opc, Expr);
  130. }
  131. const MCConstantExpr *MCConstantExpr::create(int64_t Value, MCContext &Ctx) {
  132. return new (Ctx) MCConstantExpr(Value);
  133. }
  134. /* *** */
  135. MCSymbolRefExpr::MCSymbolRefExpr(const MCSymbol *Symbol, VariantKind Kind,
  136. const MCAsmInfo *MAI)
  137. : MCExpr(MCExpr::SymbolRef), Kind(Kind),
  138. UseParensForSymbolVariant(MAI->useParensForSymbolVariant()),
  139. HasSubsectionsViaSymbols(MAI->hasSubsectionsViaSymbols()),
  140. Symbol(Symbol) {
  141. assert(Symbol);
  142. }
  143. const MCSymbolRefExpr *MCSymbolRefExpr::create(const MCSymbol *Sym,
  144. VariantKind Kind,
  145. MCContext &Ctx) {
  146. return new (Ctx) MCSymbolRefExpr(Sym, Kind, Ctx.getAsmInfo());
  147. }
  148. const MCSymbolRefExpr *MCSymbolRefExpr::create(StringRef Name, VariantKind Kind,
  149. MCContext &Ctx) {
  150. return create(Ctx.getOrCreateSymbol(Name), Kind, Ctx);
  151. }
  152. StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
  153. switch (Kind) {
  154. case VK_Invalid: return "<<invalid>>";
  155. case VK_None: return "<<none>>";
  156. case VK_GOT: return "GOT";
  157. case VK_GOTOFF: return "GOTOFF";
  158. case VK_GOTPCREL: return "GOTPCREL";
  159. case VK_GOTTPOFF: return "GOTTPOFF";
  160. case VK_INDNTPOFF: return "INDNTPOFF";
  161. case VK_NTPOFF: return "NTPOFF";
  162. case VK_GOTNTPOFF: return "GOTNTPOFF";
  163. case VK_PLT: return "PLT";
  164. case VK_TLSGD: return "TLSGD";
  165. case VK_TLSLD: return "TLSLD";
  166. case VK_TLSLDM: return "TLSLDM";
  167. case VK_TPOFF: return "TPOFF";
  168. case VK_DTPOFF: return "DTPOFF";
  169. case VK_TLVP: return "TLVP";
  170. case VK_TLVPPAGE: return "TLVPPAGE";
  171. case VK_TLVPPAGEOFF: return "TLVPPAGEOFF";
  172. case VK_PAGE: return "PAGE";
  173. case VK_PAGEOFF: return "PAGEOFF";
  174. case VK_GOTPAGE: return "GOTPAGE";
  175. case VK_GOTPAGEOFF: return "GOTPAGEOFF";
  176. case VK_SECREL: return "SECREL32";
  177. case VK_SIZE: return "SIZE";
  178. case VK_WEAKREF: return "WEAKREF";
  179. case VK_ARM_NONE: return "none";
  180. case VK_ARM_TARGET1: return "target1";
  181. case VK_ARM_TARGET2: return "target2";
  182. case VK_ARM_PREL31: return "prel31";
  183. case VK_ARM_SBREL: return "sbrel";
  184. case VK_ARM_TLSLDO: return "tlsldo";
  185. case VK_ARM_TLSCALL: return "tlscall";
  186. case VK_ARM_TLSDESC: return "tlsdesc";
  187. case VK_ARM_TLSDESCSEQ: return "tlsdescseq";
  188. case VK_PPC_LO: return "l";
  189. case VK_PPC_HI: return "h";
  190. case VK_PPC_HA: return "ha";
  191. case VK_PPC_HIGHER: return "higher";
  192. case VK_PPC_HIGHERA: return "highera";
  193. case VK_PPC_HIGHEST: return "highest";
  194. case VK_PPC_HIGHESTA: return "highesta";
  195. case VK_PPC_GOT_LO: return "got@l";
  196. case VK_PPC_GOT_HI: return "got@h";
  197. case VK_PPC_GOT_HA: return "got@ha";
  198. case VK_PPC_TOCBASE: return "tocbase";
  199. case VK_PPC_TOC: return "toc";
  200. case VK_PPC_TOC_LO: return "toc@l";
  201. case VK_PPC_TOC_HI: return "toc@h";
  202. case VK_PPC_TOC_HA: return "toc@ha";
  203. case VK_PPC_DTPMOD: return "dtpmod";
  204. case VK_PPC_TPREL: return "tprel";
  205. case VK_PPC_TPREL_LO: return "tprel@l";
  206. case VK_PPC_TPREL_HI: return "tprel@h";
  207. case VK_PPC_TPREL_HA: return "tprel@ha";
  208. case VK_PPC_TPREL_HIGHER: return "tprel@higher";
  209. case VK_PPC_TPREL_HIGHERA: return "tprel@highera";
  210. case VK_PPC_TPREL_HIGHEST: return "tprel@highest";
  211. case VK_PPC_TPREL_HIGHESTA: return "tprel@highesta";
  212. case VK_PPC_DTPREL: return "dtprel";
  213. case VK_PPC_DTPREL_LO: return "dtprel@l";
  214. case VK_PPC_DTPREL_HI: return "dtprel@h";
  215. case VK_PPC_DTPREL_HA: return "dtprel@ha";
  216. case VK_PPC_DTPREL_HIGHER: return "dtprel@higher";
  217. case VK_PPC_DTPREL_HIGHERA: return "dtprel@highera";
  218. case VK_PPC_DTPREL_HIGHEST: return "dtprel@highest";
  219. case VK_PPC_DTPREL_HIGHESTA: return "dtprel@highesta";
  220. case VK_PPC_GOT_TPREL: return "got@tprel";
  221. case VK_PPC_GOT_TPREL_LO: return "got@tprel@l";
  222. case VK_PPC_GOT_TPREL_HI: return "got@tprel@h";
  223. case VK_PPC_GOT_TPREL_HA: return "got@tprel@ha";
  224. case VK_PPC_GOT_DTPREL: return "got@dtprel";
  225. case VK_PPC_GOT_DTPREL_LO: return "got@dtprel@l";
  226. case VK_PPC_GOT_DTPREL_HI: return "got@dtprel@h";
  227. case VK_PPC_GOT_DTPREL_HA: return "got@dtprel@ha";
  228. case VK_PPC_TLS: return "tls";
  229. case VK_PPC_GOT_TLSGD: return "got@tlsgd";
  230. case VK_PPC_GOT_TLSGD_LO: return "got@tlsgd@l";
  231. case VK_PPC_GOT_TLSGD_HI: return "got@tlsgd@h";
  232. case VK_PPC_GOT_TLSGD_HA: return "got@tlsgd@ha";
  233. case VK_PPC_TLSGD: return "tlsgd";
  234. case VK_PPC_GOT_TLSLD: return "got@tlsld";
  235. case VK_PPC_GOT_TLSLD_LO: return "got@tlsld@l";
  236. case VK_PPC_GOT_TLSLD_HI: return "got@tlsld@h";
  237. case VK_PPC_GOT_TLSLD_HA: return "got@tlsld@ha";
  238. case VK_PPC_TLSLD: return "tlsld";
  239. case VK_PPC_LOCAL: return "local";
  240. case VK_Mips_GPREL: return "GPREL";
  241. case VK_Mips_GOT_CALL: return "GOT_CALL";
  242. case VK_Mips_GOT16: return "GOT16";
  243. case VK_Mips_GOT: return "GOT";
  244. case VK_Mips_ABS_HI: return "ABS_HI";
  245. case VK_Mips_ABS_LO: return "ABS_LO";
  246. case VK_Mips_TLSGD: return "TLSGD";
  247. case VK_Mips_TLSLDM: return "TLSLDM";
  248. case VK_Mips_DTPREL_HI: return "DTPREL_HI";
  249. case VK_Mips_DTPREL_LO: return "DTPREL_LO";
  250. case VK_Mips_GOTTPREL: return "GOTTPREL";
  251. case VK_Mips_TPREL_HI: return "TPREL_HI";
  252. case VK_Mips_TPREL_LO: return "TPREL_LO";
  253. case VK_Mips_GPOFF_HI: return "GPOFF_HI";
  254. case VK_Mips_GPOFF_LO: return "GPOFF_LO";
  255. case VK_Mips_GOT_DISP: return "GOT_DISP";
  256. case VK_Mips_GOT_PAGE: return "GOT_PAGE";
  257. case VK_Mips_GOT_OFST: return "GOT_OFST";
  258. case VK_Mips_HIGHER: return "HIGHER";
  259. case VK_Mips_HIGHEST: return "HIGHEST";
  260. case VK_Mips_GOT_HI16: return "GOT_HI16";
  261. case VK_Mips_GOT_LO16: return "GOT_LO16";
  262. case VK_Mips_CALL_HI16: return "CALL_HI16";
  263. case VK_Mips_CALL_LO16: return "CALL_LO16";
  264. case VK_Mips_PCREL_HI16: return "PCREL_HI16";
  265. case VK_Mips_PCREL_LO16: return "PCREL_LO16";
  266. case VK_COFF_IMGREL32: return "IMGREL";
  267. case VK_Hexagon_PCREL: return "PCREL";
  268. case VK_Hexagon_LO16: return "LO16";
  269. case VK_Hexagon_HI16: return "HI16";
  270. case VK_Hexagon_GPREL: return "GPREL";
  271. case VK_Hexagon_GD_GOT: return "GDGOT";
  272. case VK_Hexagon_LD_GOT: return "LDGOT";
  273. case VK_Hexagon_GD_PLT: return "GDPLT";
  274. case VK_Hexagon_LD_PLT: return "LDPLT";
  275. case VK_Hexagon_IE: return "IE";
  276. case VK_Hexagon_IE_GOT: return "IEGOT";
  277. case VK_TPREL: return "tprel";
  278. case VK_DTPREL: return "dtprel";
  279. }
  280. llvm_unreachable("Invalid variant kind");
  281. }
  282. MCSymbolRefExpr::VariantKind
  283. MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
  284. return StringSwitch<VariantKind>(Name.lower())
  285. .Case("got", VK_GOT)
  286. .Case("gotoff", VK_GOTOFF)
  287. .Case("gotpcrel", VK_GOTPCREL)
  288. .Case("got_prel", VK_GOTPCREL)
  289. .Case("gottpoff", VK_GOTTPOFF)
  290. .Case("indntpoff", VK_INDNTPOFF)
  291. .Case("ntpoff", VK_NTPOFF)
  292. .Case("gotntpoff", VK_GOTNTPOFF)
  293. .Case("plt", VK_PLT)
  294. .Case("tlsgd", VK_TLSGD)
  295. .Case("tlsld", VK_TLSLD)
  296. .Case("tlsldm", VK_TLSLDM)
  297. .Case("tpoff", VK_TPOFF)
  298. .Case("dtpoff", VK_DTPOFF)
  299. .Case("tlvp", VK_TLVP)
  300. .Case("tlvppage", VK_TLVPPAGE)
  301. .Case("tlvppageoff", VK_TLVPPAGEOFF)
  302. .Case("page", VK_PAGE)
  303. .Case("pageoff", VK_PAGEOFF)
  304. .Case("gotpage", VK_GOTPAGE)
  305. .Case("gotpageoff", VK_GOTPAGEOFF)
  306. .Case("imgrel", VK_COFF_IMGREL32)
  307. .Case("secrel32", VK_SECREL)
  308. .Case("size", VK_SIZE)
  309. .Case("l", VK_PPC_LO)
  310. .Case("h", VK_PPC_HI)
  311. .Case("ha", VK_PPC_HA)
  312. .Case("higher", VK_PPC_HIGHER)
  313. .Case("highera", VK_PPC_HIGHERA)
  314. .Case("highest", VK_PPC_HIGHEST)
  315. .Case("highesta", VK_PPC_HIGHESTA)
  316. .Case("got@l", VK_PPC_GOT_LO)
  317. .Case("got@h", VK_PPC_GOT_HI)
  318. .Case("got@ha", VK_PPC_GOT_HA)
  319. .Case("local", VK_PPC_LOCAL)
  320. .Case("tocbase", VK_PPC_TOCBASE)
  321. .Case("toc", VK_PPC_TOC)
  322. .Case("toc@l", VK_PPC_TOC_LO)
  323. .Case("toc@h", VK_PPC_TOC_HI)
  324. .Case("toc@ha", VK_PPC_TOC_HA)
  325. .Case("tls", VK_PPC_TLS)
  326. .Case("dtpmod", VK_PPC_DTPMOD)
  327. .Case("tprel", VK_PPC_TPREL)
  328. .Case("tprel@l", VK_PPC_TPREL_LO)
  329. .Case("tprel@h", VK_PPC_TPREL_HI)
  330. .Case("tprel@ha", VK_PPC_TPREL_HA)
  331. .Case("tprel@higher", VK_PPC_TPREL_HIGHER)
  332. .Case("tprel@highera", VK_PPC_TPREL_HIGHERA)
  333. .Case("tprel@highest", VK_PPC_TPREL_HIGHEST)
  334. .Case("tprel@highesta", VK_PPC_TPREL_HIGHESTA)
  335. .Case("dtprel", VK_PPC_DTPREL)
  336. .Case("dtprel@l", VK_PPC_DTPREL_LO)
  337. .Case("dtprel@h", VK_PPC_DTPREL_HI)
  338. .Case("dtprel@ha", VK_PPC_DTPREL_HA)
  339. .Case("dtprel@higher", VK_PPC_DTPREL_HIGHER)
  340. .Case("dtprel@highera", VK_PPC_DTPREL_HIGHERA)
  341. .Case("dtprel@highest", VK_PPC_DTPREL_HIGHEST)
  342. .Case("dtprel@highesta", VK_PPC_DTPREL_HIGHESTA)
  343. .Case("got@tprel", VK_PPC_GOT_TPREL)
  344. .Case("got@tprel@l", VK_PPC_GOT_TPREL_LO)
  345. .Case("got@tprel@h", VK_PPC_GOT_TPREL_HI)
  346. .Case("got@tprel@ha", VK_PPC_GOT_TPREL_HA)
  347. .Case("got@dtprel", VK_PPC_GOT_DTPREL)
  348. .Case("got@dtprel@l", VK_PPC_GOT_DTPREL_LO)
  349. .Case("got@dtprel@h", VK_PPC_GOT_DTPREL_HI)
  350. .Case("got@dtprel@ha", VK_PPC_GOT_DTPREL_HA)
  351. .Case("got@tlsgd", VK_PPC_GOT_TLSGD)
  352. .Case("got@tlsgd@l", VK_PPC_GOT_TLSGD_LO)
  353. .Case("got@tlsgd@h", VK_PPC_GOT_TLSGD_HI)
  354. .Case("got@tlsgd@ha", VK_PPC_GOT_TLSGD_HA)
  355. .Case("got@tlsld", VK_PPC_GOT_TLSLD)
  356. .Case("got@tlsld@l", VK_PPC_GOT_TLSLD_LO)
  357. .Case("got@tlsld@h", VK_PPC_GOT_TLSLD_HI)
  358. .Case("got@tlsld@ha", VK_PPC_GOT_TLSLD_HA)
  359. .Case("none", VK_ARM_NONE)
  360. .Case("target1", VK_ARM_TARGET1)
  361. .Case("target2", VK_ARM_TARGET2)
  362. .Case("prel31", VK_ARM_PREL31)
  363. .Case("sbrel", VK_ARM_SBREL)
  364. .Case("tlsldo", VK_ARM_TLSLDO)
  365. .Case("tlscall", VK_ARM_TLSCALL)
  366. .Case("tlsdesc", VK_ARM_TLSDESC)
  367. .Default(VK_Invalid);
  368. }
  369. void MCSymbolRefExpr::printVariantKind(raw_ostream &OS) const {
  370. if (UseParensForSymbolVariant)
  371. OS << '(' << MCSymbolRefExpr::getVariantKindName(getKind()) << ')';
  372. else
  373. OS << '@' << MCSymbolRefExpr::getVariantKindName(getKind());
  374. }
  375. /* *** */
  376. void MCTargetExpr::anchor() {}
  377. /* *** */
  378. bool MCExpr::evaluateAsAbsolute(int64_t &Res) const {
  379. return evaluateAsAbsolute(Res, nullptr, nullptr, nullptr);
  380. }
  381. bool MCExpr::evaluateAsAbsolute(int64_t &Res,
  382. const MCAsmLayout &Layout) const {
  383. return evaluateAsAbsolute(Res, &Layout.getAssembler(), &Layout, nullptr);
  384. }
  385. bool MCExpr::evaluateAsAbsolute(int64_t &Res,
  386. const MCAsmLayout &Layout,
  387. const SectionAddrMap &Addrs) const {
  388. return evaluateAsAbsolute(Res, &Layout.getAssembler(), &Layout, &Addrs);
  389. }
  390. bool MCExpr::evaluateAsAbsolute(int64_t &Res, const MCAssembler &Asm) const {
  391. return evaluateAsAbsolute(Res, &Asm, nullptr, nullptr);
  392. }
  393. bool MCExpr::evaluateKnownAbsolute(int64_t &Res,
  394. const MCAsmLayout &Layout) const {
  395. return evaluateAsAbsolute(Res, &Layout.getAssembler(), &Layout, nullptr,
  396. true);
  397. }
  398. bool MCExpr::evaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
  399. const MCAsmLayout *Layout,
  400. const SectionAddrMap *Addrs) const {
  401. // FIXME: The use if InSet = Addrs is a hack. Setting InSet causes us
  402. // absolutize differences across sections and that is what the MachO writer
  403. // uses Addrs for.
  404. return evaluateAsAbsolute(Res, Asm, Layout, Addrs, Addrs);
  405. }
  406. bool MCExpr::evaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
  407. const MCAsmLayout *Layout,
  408. const SectionAddrMap *Addrs, bool InSet) const {
  409. MCValue Value;
  410. // Fast path constants.
  411. if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(this)) {
  412. Res = CE->getValue();
  413. return true;
  414. }
  415. bool IsRelocatable =
  416. evaluateAsRelocatableImpl(Value, Asm, Layout, nullptr, Addrs, InSet);
  417. // Record the current value.
  418. Res = Value.getConstant();
  419. return IsRelocatable && Value.isAbsolute();
  420. }
  421. /// \brief Helper method for \see EvaluateSymbolAdd().
  422. static void AttemptToFoldSymbolOffsetDifference(
  423. const MCAssembler *Asm, const MCAsmLayout *Layout,
  424. const SectionAddrMap *Addrs, bool InSet, const MCSymbolRefExpr *&A,
  425. const MCSymbolRefExpr *&B, int64_t &Addend) {
  426. if (!A || !B)
  427. return;
  428. const MCSymbol &SA = A->getSymbol();
  429. const MCSymbol &SB = B->getSymbol();
  430. if (SA.isUndefined() || SB.isUndefined())
  431. return;
  432. if (!Asm->getWriter().isSymbolRefDifferenceFullyResolved(*Asm, A, B, InSet))
  433. return;
  434. if (SA.getFragment() == SB.getFragment()) {
  435. Addend += (SA.getOffset() - SB.getOffset());
  436. // Pointers to Thumb symbols need to have their low-bit set to allow
  437. // for interworking.
  438. if (Asm->isThumbFunc(&SA))
  439. Addend |= 1;
  440. // Clear the symbol expr pointers to indicate we have folded these
  441. // operands.
  442. A = B = nullptr;
  443. return;
  444. }
  445. if (!Layout)
  446. return;
  447. const MCSection &SecA = *SA.getFragment()->getParent();
  448. const MCSection &SecB = *SB.getFragment()->getParent();
  449. if ((&SecA != &SecB) && !Addrs)
  450. return;
  451. // Eagerly evaluate.
  452. Addend += Layout->getSymbolOffset(A->getSymbol()) -
  453. Layout->getSymbolOffset(B->getSymbol());
  454. if (Addrs && (&SecA != &SecB))
  455. Addend += (Addrs->lookup(&SecA) - Addrs->lookup(&SecB));
  456. // Pointers to Thumb symbols need to have their low-bit set to allow
  457. // for interworking.
  458. if (Asm->isThumbFunc(&SA))
  459. Addend |= 1;
  460. // Clear the symbol expr pointers to indicate we have folded these
  461. // operands.
  462. A = B = nullptr;
  463. }
  464. /// \brief Evaluate the result of an add between (conceptually) two MCValues.
  465. ///
  466. /// This routine conceptually attempts to construct an MCValue:
  467. /// Result = (Result_A - Result_B + Result_Cst)
  468. /// from two MCValue's LHS and RHS where
  469. /// Result = LHS + RHS
  470. /// and
  471. /// Result = (LHS_A - LHS_B + LHS_Cst) + (RHS_A - RHS_B + RHS_Cst).
  472. ///
  473. /// This routine attempts to aggresively fold the operands such that the result
  474. /// is representable in an MCValue, but may not always succeed.
  475. ///
  476. /// \returns True on success, false if the result is not representable in an
  477. /// MCValue.
  478. /// NOTE: It is really important to have both the Asm and Layout arguments.
  479. /// They might look redundant, but this function can be used before layout
  480. /// is done (see the object streamer for example) and having the Asm argument
  481. /// lets us avoid relaxations early.
  482. static bool
  483. EvaluateSymbolicAdd(const MCAssembler *Asm, const MCAsmLayout *Layout,
  484. const SectionAddrMap *Addrs, bool InSet, const MCValue &LHS,
  485. const MCSymbolRefExpr *RHS_A, const MCSymbolRefExpr *RHS_B,
  486. int64_t RHS_Cst, MCValue &Res) {
  487. // FIXME: This routine (and other evaluation parts) are *incredibly* sloppy
  488. // about dealing with modifiers. This will ultimately bite us, one day.
  489. const MCSymbolRefExpr *LHS_A = LHS.getSymA();
  490. const MCSymbolRefExpr *LHS_B = LHS.getSymB();
  491. int64_t LHS_Cst = LHS.getConstant();
  492. // Fold the result constant immediately.
  493. int64_t Result_Cst = LHS_Cst + RHS_Cst;
  494. assert((!Layout || Asm) &&
  495. "Must have an assembler object if layout is given!");
  496. // If we have a layout, we can fold resolved differences.
  497. if (Asm) {
  498. // First, fold out any differences which are fully resolved. By
  499. // reassociating terms in
  500. // Result = (LHS_A - LHS_B + LHS_Cst) + (RHS_A - RHS_B + RHS_Cst).
  501. // we have the four possible differences:
  502. // (LHS_A - LHS_B),
  503. // (LHS_A - RHS_B),
  504. // (RHS_A - LHS_B),
  505. // (RHS_A - RHS_B).
  506. // Since we are attempting to be as aggressive as possible about folding, we
  507. // attempt to evaluate each possible alternative.
  508. AttemptToFoldSymbolOffsetDifference(Asm, Layout, Addrs, InSet, LHS_A, LHS_B,
  509. Result_Cst);
  510. AttemptToFoldSymbolOffsetDifference(Asm, Layout, Addrs, InSet, LHS_A, RHS_B,
  511. Result_Cst);
  512. AttemptToFoldSymbolOffsetDifference(Asm, Layout, Addrs, InSet, RHS_A, LHS_B,
  513. Result_Cst);
  514. AttemptToFoldSymbolOffsetDifference(Asm, Layout, Addrs, InSet, RHS_A, RHS_B,
  515. Result_Cst);
  516. }
  517. // We can't represent the addition or subtraction of two symbols.
  518. if ((LHS_A && RHS_A) || (LHS_B && RHS_B))
  519. return false;
  520. // At this point, we have at most one additive symbol and one subtractive
  521. // symbol -- find them.
  522. const MCSymbolRefExpr *A = LHS_A ? LHS_A : RHS_A;
  523. const MCSymbolRefExpr *B = LHS_B ? LHS_B : RHS_B;
  524. // If we have a negated symbol, then we must have also have a non-negated
  525. // symbol in order to encode the expression.
  526. if (B && !A)
  527. return false;
  528. Res = MCValue::get(A, B, Result_Cst);
  529. return true;
  530. }
  531. bool MCExpr::evaluateAsRelocatable(MCValue &Res,
  532. const MCAsmLayout *Layout,
  533. const MCFixup *Fixup) const {
  534. MCAssembler *Assembler = Layout ? &Layout->getAssembler() : nullptr;
  535. return evaluateAsRelocatableImpl(Res, Assembler, Layout, Fixup, nullptr,
  536. false);
  537. }
  538. bool MCExpr::evaluateAsValue(MCValue &Res, const MCAsmLayout &Layout) const {
  539. MCAssembler *Assembler = &Layout.getAssembler();
  540. return evaluateAsRelocatableImpl(Res, Assembler, &Layout, nullptr, nullptr,
  541. true);
  542. }
  543. static bool canExpand(const MCSymbol &Sym, const MCAssembler *Asm, bool InSet) {
  544. const MCExpr *Expr = Sym.getVariableValue();
  545. const auto *Inner = dyn_cast<MCSymbolRefExpr>(Expr);
  546. if (Inner) {
  547. if (Inner->getKind() == MCSymbolRefExpr::VK_WEAKREF)
  548. return false;
  549. }
  550. if (InSet)
  551. return true;
  552. if (!Asm)
  553. return false;
  554. return !Asm->getWriter().isWeak(Sym);
  555. }
  556. bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
  557. const MCAsmLayout *Layout,
  558. const MCFixup *Fixup,
  559. const SectionAddrMap *Addrs,
  560. bool InSet) const {
  561. ++stats::MCExprEvaluate;
  562. switch (getKind()) {
  563. case Target:
  564. return cast<MCTargetExpr>(this)->evaluateAsRelocatableImpl(Res, Layout,
  565. Fixup);
  566. case Constant:
  567. Res = MCValue::get(cast<MCConstantExpr>(this)->getValue());
  568. return true;
  569. case SymbolRef: {
  570. const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(this);
  571. const MCSymbol &Sym = SRE->getSymbol();
  572. // Evaluate recursively if this is a variable.
  573. if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None &&
  574. canExpand(Sym, Asm, InSet)) {
  575. bool IsMachO = SRE->hasSubsectionsViaSymbols();
  576. if (Sym.getVariableValue()->evaluateAsRelocatableImpl(
  577. Res, Asm, Layout, Fixup, Addrs, InSet || IsMachO)) {
  578. if (!IsMachO)
  579. return true;
  580. const MCSymbolRefExpr *A = Res.getSymA();
  581. const MCSymbolRefExpr *B = Res.getSymB();
  582. // FIXME: This is small hack. Given
  583. // a = b + 4
  584. // .long a
  585. // the OS X assembler will completely drop the 4. We should probably
  586. // include it in the relocation or produce an error if that is not
  587. // possible.
  588. if (!A && !B)
  589. return true;
  590. }
  591. }
  592. Res = MCValue::get(SRE, nullptr, 0);
  593. return true;
  594. }
  595. case Unary: {
  596. const MCUnaryExpr *AUE = cast<MCUnaryExpr>(this);
  597. MCValue Value;
  598. if (!AUE->getSubExpr()->evaluateAsRelocatableImpl(Value, Asm, Layout, Fixup,
  599. Addrs, InSet))
  600. return false;
  601. switch (AUE->getOpcode()) {
  602. case MCUnaryExpr::LNot:
  603. if (!Value.isAbsolute())
  604. return false;
  605. Res = MCValue::get(!Value.getConstant());
  606. break;
  607. case MCUnaryExpr::Minus:
  608. /// -(a - b + const) ==> (b - a - const)
  609. if (Value.getSymA() && !Value.getSymB())
  610. return false;
  611. Res = MCValue::get(Value.getSymB(), Value.getSymA(),
  612. -Value.getConstant());
  613. break;
  614. case MCUnaryExpr::Not:
  615. if (!Value.isAbsolute())
  616. return false;
  617. Res = MCValue::get(~Value.getConstant());
  618. break;
  619. case MCUnaryExpr::Plus:
  620. Res = Value;
  621. break;
  622. }
  623. return true;
  624. }
  625. case Binary: {
  626. const MCBinaryExpr *ABE = cast<MCBinaryExpr>(this);
  627. MCValue LHSValue, RHSValue;
  628. if (!ABE->getLHS()->evaluateAsRelocatableImpl(LHSValue, Asm, Layout, Fixup,
  629. Addrs, InSet) ||
  630. !ABE->getRHS()->evaluateAsRelocatableImpl(RHSValue, Asm, Layout, Fixup,
  631. Addrs, InSet))
  632. return false;
  633. // We only support a few operations on non-constant expressions, handle
  634. // those first.
  635. if (!LHSValue.isAbsolute() || !RHSValue.isAbsolute()) {
  636. switch (ABE->getOpcode()) {
  637. default:
  638. return false;
  639. case MCBinaryExpr::Sub:
  640. // Negate RHS and add.
  641. return EvaluateSymbolicAdd(Asm, Layout, Addrs, InSet, LHSValue,
  642. RHSValue.getSymB(), RHSValue.getSymA(),
  643. -RHSValue.getConstant(), Res);
  644. case MCBinaryExpr::Add:
  645. return EvaluateSymbolicAdd(Asm, Layout, Addrs, InSet, LHSValue,
  646. RHSValue.getSymA(), RHSValue.getSymB(),
  647. RHSValue.getConstant(), Res);
  648. }
  649. }
  650. // FIXME: We need target hooks for the evaluation. It may be limited in
  651. // width, and gas defines the result of comparisons differently from
  652. // Apple as.
  653. int64_t LHS = LHSValue.getConstant(), RHS = RHSValue.getConstant();
  654. int64_t Result = 0;
  655. switch (ABE->getOpcode()) {
  656. case MCBinaryExpr::AShr: Result = LHS >> RHS; break;
  657. case MCBinaryExpr::Add: Result = LHS + RHS; break;
  658. case MCBinaryExpr::And: Result = LHS & RHS; break;
  659. case MCBinaryExpr::Div: Result = LHS / RHS; break;
  660. case MCBinaryExpr::EQ: Result = LHS == RHS; break;
  661. case MCBinaryExpr::GT: Result = LHS > RHS; break;
  662. case MCBinaryExpr::GTE: Result = LHS >= RHS; break;
  663. case MCBinaryExpr::LAnd: Result = LHS && RHS; break;
  664. case MCBinaryExpr::LOr: Result = LHS || RHS; break;
  665. case MCBinaryExpr::LShr: Result = uint64_t(LHS) >> uint64_t(RHS); break;
  666. case MCBinaryExpr::LT: Result = LHS < RHS; break;
  667. case MCBinaryExpr::LTE: Result = LHS <= RHS; break;
  668. case MCBinaryExpr::Mod: Result = LHS % RHS; break;
  669. case MCBinaryExpr::Mul: Result = LHS * RHS; break;
  670. case MCBinaryExpr::NE: Result = LHS != RHS; break;
  671. case MCBinaryExpr::Or: Result = LHS | RHS; break;
  672. case MCBinaryExpr::Shl: Result = uint64_t(LHS) << uint64_t(RHS); break;
  673. case MCBinaryExpr::Sub: Result = LHS - RHS; break;
  674. case MCBinaryExpr::Xor: Result = LHS ^ RHS; break;
  675. }
  676. Res = MCValue::get(Result);
  677. return true;
  678. }
  679. }
  680. llvm_unreachable("Invalid assembly expression kind!");
  681. }
  682. MCSection *MCExpr::findAssociatedSection() const {
  683. switch (getKind()) {
  684. case Target:
  685. // We never look through target specific expressions.
  686. return cast<MCTargetExpr>(this)->findAssociatedSection();
  687. case Constant:
  688. return MCSymbol::AbsolutePseudoSection;
  689. case SymbolRef: {
  690. const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(this);
  691. const MCSymbol &Sym = SRE->getSymbol();
  692. if (Sym.isDefined())
  693. return &Sym.getSection();
  694. return nullptr;
  695. }
  696. case Unary:
  697. return cast<MCUnaryExpr>(this)->getSubExpr()->findAssociatedSection();
  698. case Binary: {
  699. const MCBinaryExpr *BE = cast<MCBinaryExpr>(this);
  700. MCSection *LHS_S = BE->getLHS()->findAssociatedSection();
  701. MCSection *RHS_S = BE->getRHS()->findAssociatedSection();
  702. // If either section is absolute, return the other.
  703. if (LHS_S == MCSymbol::AbsolutePseudoSection)
  704. return RHS_S;
  705. if (RHS_S == MCSymbol::AbsolutePseudoSection)
  706. return LHS_S;
  707. // Not always correct, but probably the best we can do without more context.
  708. if (BE->getOpcode() == MCBinaryExpr::Sub)
  709. return MCSymbol::AbsolutePseudoSection;
  710. // Otherwise, return the first non-null section.
  711. return LHS_S ? LHS_S : RHS_S;
  712. }
  713. }
  714. llvm_unreachable("Invalid assembly expression kind!");
  715. }