From: Rafael Espindola Date: Mon, 27 Jun 2016 12:33:33 +0000 (+0000) Subject: Add an explanation on how mips is special in here. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=706f4ac5f604796faf70eb7103bb11dc3f624dc0;p=llvm Add an explanation on how mips is special in here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273868 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Mips/MipsISelLowering.cpp b/lib/Target/Mips/MipsISelLowering.cpp index 1e640e17379..ac2ed5028bd 100644 --- a/lib/Target/Mips/MipsISelLowering.cpp +++ b/lib/Target/Mips/MipsISelLowering.cpp @@ -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());