[PATCH] [RFC][PATCH] Minor opt to access pointers to globals via pcrel GOT entries

Bruno Cardoso Lopes bruno.cardoso at gmail.com
Wed Jan 28 09:25:40 PST 2015

Comment at: lib/CodeGen/AsmPrinter/AsmPrinter.cpp:2070
@@ +2069,3 @@
+  // where X is the symbol base of the current emission
+  const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(*ME);
+  if (!BE || BE->getOpcode() != MCBinaryExpr::Sub)
rafael wrote:
> You should just use EvaluateAsRelocatable. It will put the expression in the form Sym_A - Sym_B + C for you.
Cool, this makes it a *lot* easier, thanks!

Comment at: lib/CodeGen/AsmPrinter/AsmPrinter.cpp:2121
@@ +2120,3 @@
+  if (NumUses)
+    AP.GlobalGOTEquivs[ProxySym] = std::make_pair(GV, --NumUses);
+  else
rafael wrote:
> Why do you need the count?
> You only really need to remember that there was at least one user that could not be replaced with the got and therefore the GOT-like GlobalVariable still has to be printed.
If I do like you suggest, we'd have to still check all MCExpr and its operands for any presence of a global equivalent symbol, even when we know really early that the MCExpr isn't a fit. The case where EvaluateAsRelocatable returns true should be easier to check, but otherwise we'll still need to parse MCExpr once again searching for a GV reference. I believe the current solution is a better approach.



More information about the llvm-commits mailing list