diff options
author | Lewis Revill <lewis.revill@embecosm.com> | 2019-06-18 14:29:45 +0000 |
---|---|---|
committer | Lewis Revill <lewis.revill@embecosm.com> | 2019-06-18 14:29:45 +0000 |
commit | 74c83649547c270106ceaeb50ac9317ad17d0621 (patch) | |
tree | f08669308f3efbdda13773b0ee4a056e0f8bdfbe /llvm/lib/Target/RISCV/RISCVISelLowering.cpp | |
parent | 2fef12ccb1967b3a53a59511159d2b267298f708 (diff) | |
download | bcm5719-llvm-74c83649547c270106ceaeb50ac9317ad17d0621.tar.gz bcm5719-llvm-74c83649547c270106ceaeb50ac9317ad17d0621.zip |
[RISCV] Lower calls through PLT
This patch adds support for generating calls through the procedure
linkage table where required for a given ExternalSymbol or GlobalAddress
callee.
Differential Revision: https://reviews.llvm.org/D55304
llvm-svn: 363686
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 363f8150340..45217f6bd1f 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -1921,11 +1921,21 @@ SDValue RISCVTargetLowering::LowerCall(CallLoweringInfo &CLI, // TargetGlobalAddress/TargetExternalSymbol node so that legalize won't // split it and then direct call can be matched by PseudoCALL. if (GlobalAddressSDNode *S = dyn_cast<GlobalAddressSDNode>(Callee)) { - Callee = DAG.getTargetGlobalAddress(S->getGlobal(), DL, PtrVT, 0, - RISCVII::MO_CALL); + const GlobalValue *GV = S->getGlobal(); + + unsigned OpFlags = RISCVII::MO_CALL; + if (!getTargetMachine().shouldAssumeDSOLocal(*GV->getParent(), GV)) + OpFlags = RISCVII::MO_PLT; + + Callee = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, OpFlags); } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) { - Callee = - DAG.getTargetExternalSymbol(S->getSymbol(), PtrVT, RISCVII::MO_CALL); + unsigned OpFlags = RISCVII::MO_CALL; + + if (!getTargetMachine().shouldAssumeDSOLocal(*MF.getFunction().getParent(), + nullptr)) + OpFlags = RISCVII::MO_PLT; + + Callee = DAG.getTargetExternalSymbol(S->getSymbol(), PtrVT, OpFlags); } // The first call operand is the chain and the second is the target address. |