@@ -762,12 +762,13 @@ static SDValue getTargetNode(JumpTableSDNode *N, SDLoc DL, EVT Ty,
762
762
763
763
template <class NodeTy >
764
764
SDValue LoongArchTargetLowering::getAddr (NodeTy *N, SelectionDAG &DAG,
765
+ CodeModel::Model M,
765
766
bool IsLocal) const {
766
767
SDLoc DL (N);
767
768
EVT Ty = getPointerTy (DAG.getDataLayout ());
768
769
SDValue Addr = getTargetNode (N, DL, Ty, DAG, 0 );
769
770
770
- switch (DAG. getTarget (). getCodeModel () ) {
771
+ switch (M ) {
771
772
default :
772
773
report_fatal_error (" Unsupported code model" );
773
774
@@ -808,24 +809,35 @@ SDValue LoongArchTargetLowering::getAddr(NodeTy *N, SelectionDAG &DAG,
808
809
809
810
SDValue LoongArchTargetLowering::lowerBlockAddress (SDValue Op,
810
811
SelectionDAG &DAG) const {
811
- return getAddr (cast<BlockAddressSDNode>(Op), DAG);
812
+ return getAddr (cast<BlockAddressSDNode>(Op), DAG,
813
+ DAG.getTarget ().getCodeModel ());
812
814
}
813
815
814
816
SDValue LoongArchTargetLowering::lowerJumpTable (SDValue Op,
815
817
SelectionDAG &DAG) const {
816
- return getAddr (cast<JumpTableSDNode>(Op), DAG);
818
+ return getAddr (cast<JumpTableSDNode>(Op), DAG,
819
+ DAG.getTarget ().getCodeModel ());
817
820
}
818
821
819
822
SDValue LoongArchTargetLowering::lowerConstantPool (SDValue Op,
820
823
SelectionDAG &DAG) const {
821
- return getAddr (cast<ConstantPoolSDNode>(Op), DAG);
824
+ return getAddr (cast<ConstantPoolSDNode>(Op), DAG,
825
+ DAG.getTarget ().getCodeModel ());
822
826
}
823
827
824
828
SDValue LoongArchTargetLowering::lowerGlobalAddress (SDValue Op,
825
829
SelectionDAG &DAG) const {
826
830
GlobalAddressSDNode *N = cast<GlobalAddressSDNode>(Op);
827
831
assert (N->getOffset () == 0 && " unexpected offset in global node" );
828
- return getAddr (N, DAG, N->getGlobal ()->isDSOLocal ());
832
+ auto CM = DAG.getTarget ().getCodeModel ();
833
+ const GlobalValue *GV = N->getGlobal ();
834
+
835
+ if (GV->isDSOLocal () && isa<GlobalVariable>(GV)) {
836
+ if (auto GCM = dyn_cast<GlobalVariable>(GV)->getCodeModel ())
837
+ CM = *GCM;
838
+ }
839
+
840
+ return getAddr (N, DAG, CM, GV->isDSOLocal ());
829
841
}
830
842
831
843
SDValue LoongArchTargetLowering::getStaticTLSAddr (GlobalAddressSDNode *N,
0 commit comments