[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)
> 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);
> 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