]> granicus.if.org Git - llvm/commitdiff
Add an explanation on how mips is special in here.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 27 Jun 2016 12:33:33 +0000 (12:33 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 27 Jun 2016 12:33:33 +0000 (12:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273868 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsISelLowering.cpp

index 1e640e173791cf9aa2adaba89d883b71075706c9..ac2ed5028bd2a2f27bbbfd9ac5cc7e911c97b94e 100644 (file)
@@ -1764,6 +1764,17 @@ SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
     return getAddrNonPIC(N, SDLoc(N), Ty, DAG);
   }
 
+  // Every other architecture would use shouldAssumeDSOLocal in here, but
+  // mips is special.
+  // * In PIC code mips requires got loads oven for local statics!
+  // * To save on got entries, for local statics the got entry contains the
+  //   page and an additional add instruction takes care of the low bits.
+  // * It is legal to access a hidden symbol with a non hidden undefined,
+  //   so one cannot guarantee that all access to a hidden symbol will know
+  //   it is hidden.
+  // * Mips linkers don't support creating a page and a full got entry for
+  //   the same symbol.
+  // * Given all that, we have to use a full got entry for hidden symbols :-(
   if (GV->hasLocalLinkage())
     return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64());