1- // ==- X86SuppressEGPRAndNDDForReloc .cpp - Suppress EGPR/NDD for relocations -=//
1+ // ===- X86SuppressAPXForReloc .cpp - Suppress APX features for relocations -== =//
22//
33// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44// See https://llvm.org/LICENSE.txt for license information.
77// ===----------------------------------------------------------------------===//
88// / \file
99// /
10- // / This pass is added to suppress EGPR and NDD for relocations. It's used
10+ // / This pass is added to suppress APX features for relocations. It's used
1111// / together with disabling emitting APX relocation types for backward
1212// / compatibility with old version of linker (like before LD 2.43). It can avoid
1313// / the instructions updated incorrectly by old version of linker if the
14- // / instructions are with APX EGPR/NDD features + the relocations other than APX
15- // / ones (like GOTTPOFF).
14+ // / instructions are with APX EGPR/NDD/NF features + the relocations other than
15+ // / APX ones (like GOTTPOFF).
1616// /
1717// ===----------------------------------------------------------------------===//
1818
2323#include " X86Subtarget.h"
2424
2525#include " llvm/CodeGen/MachineFunctionPass.h"
26+ #include " llvm/CodeGen/MachineOperand.h"
2627#include " llvm/CodeGen/MachineRegisterInfo.h"
28+ #include " llvm/CodeGen/Passes.h"
29+ #include " llvm/InitializePasses.h"
2730#include " llvm/Target/TargetMachine.h"
2831
2932using namespace llvm ;
3033
31- #define DEBUG_TYPE " x86-suppress-egpr-and-ndd -for-relocation"
34+ #define DEBUG_TYPE " x86-suppress-apx -for-relocation"
3235
33- static cl::opt<bool > X86SuppressEGPRAndNDDForReloc (
36+ static cl::opt<bool > X86SuppressAPXForReloc (
3437 DEBUG_TYPE,
35- cl::desc (" Suppress EGPR and NDD for instructions with relocations on "
36- " x86-64 ELF" ),
38+ cl::desc (" Suppress APX features ( EGPR, NDD and NF) for instructions with "
39+ " relocations on x86-64 ELF" ),
3740 cl::init(true ));
3841
3942namespace {
40- class X86SuppressEGPRAndNDDForRelocPass : public MachineFunctionPass {
43+ class X86SuppressAPXForRelocationPass : public MachineFunctionPass {
4144public:
42- X86SuppressEGPRAndNDDForRelocPass () : MachineFunctionPass(ID) {}
45+ X86SuppressAPXForRelocationPass () : MachineFunctionPass(ID) {}
4346
4447 StringRef getPassName () const override {
45- return " X86 Suppress EGPR and NDD for relocation" ;
48+ return " X86 Suppress APX features for relocation" ;
4649 }
4750
4851 bool runOnMachineFunction (MachineFunction &MF) override ;
4952
50- private:
5153 static char ID;
5254};
5355} // namespace
5456
55- char X86SuppressEGPRAndNDDForRelocPass ::ID = 0 ;
57+ char X86SuppressAPXForRelocationPass ::ID = 0 ;
5658
57- FunctionPass *llvm::createX86SuppressEGPRAndNDDForRelocPass () {
58- return new X86SuppressEGPRAndNDDForRelocPass ();
59+ INITIALIZE_PASS_BEGIN (X86SuppressAPXForRelocationPass, DEBUG_TYPE,
60+ " X86 Suppress APX features for relocation" , false , false )
61+ INITIALIZE_PASS_END(X86SuppressAPXForRelocationPass, DEBUG_TYPE,
62+ " X86 Suppress APX features for relocation" , false , false )
63+
64+ FunctionPass *llvm::createX86SuppressAPXForRelocationPass() {
65+ return new X86SuppressAPXForRelocationPass ();
5966}
6067
61- static void suppressEGPRRegClass (MachineFunction &MF, MachineInstr &MI) {
68+ static void suppressEGPRRegClass (MachineFunction &MF, MachineInstr &MI,
69+ unsigned int OpNum) {
6270 MachineRegisterInfo *MRI = &MF.getRegInfo ();
63- auto Reg = MI.getOperand (0 ).getReg ();
71+ auto Reg = MI.getOperand (OpNum ).getReg ();
6472 if (!Reg.isVirtual ()) {
6573 assert (!X86II::isApxExtendedReg (Reg) && " APX EGPR is used unexpectedly." );
6674 return ;
@@ -71,10 +79,10 @@ static void suppressEGPRRegClass(MachineFunction &MF, MachineInstr &MI) {
7179 MRI->setRegClass (Reg, NewRC);
7280}
7381
74- bool X86SuppressEGPRAndNDDForRelocPass ::runOnMachineFunction (
82+ bool X86SuppressAPXForRelocationPass ::runOnMachineFunction (
7583 MachineFunction &MF) {
7684 if (MF.getTarget ().Options .MCOptions .X86APXRelaxRelocations ||
77- !X86SuppressEGPRAndNDDForReloc )
85+ !X86SuppressAPXForReloc )
7886 return false ;
7987 const X86Subtarget &ST = MF.getSubtarget <X86Subtarget>();
8088 if (!ST.hasEGPR () && !ST.hasNDD () && !ST.hasNF ())
@@ -113,28 +121,48 @@ bool X86SuppressEGPRAndNDDForRelocPass::runOnMachineFunction(
113121 case X86::XOR64rm: {
114122 for (auto &MO : MI.operands ()) {
115123 if (MO.getTargetFlags () == X86II::MO_GOTTPOFF ||
116- MO.getTargetFlags () == X86II::MO_GOTPCREL)
117- suppressEGPRRegClass (MF, MI);
124+ MO.getTargetFlags () == X86II::MO_GOTPCREL) {
125+ suppressEGPRRegClass (MF, MI, 0 );
126+ break ;
127+ }
118128 }
119129 break ;
120130 }
121131 case X86::MOV64rm: {
122- if (MI.getOperand (4 ).getTargetFlags () == X86II::MO_GOTTPOFF)
123- suppressEGPRRegClass (MF, MI);
132+ for (auto &MO : MI.operands ()) {
133+ if (MO.getTargetFlags () == X86II::MO_GOTTPOFF) {
134+ suppressEGPRRegClass (MF, MI, 0 );
135+ break ;
136+ }
137+ }
124138 break ;
125139 }
126140 case X86::ADD64rm_NF:
127141 case X86::ADD64rm_ND:
128- case X86::ADD64mr_ND:
129- case X86::ADD64mr_NF_ND:
130142 case X86::ADD64rm_NF_ND: {
131- // TODO: implement this if there is a case of NDD/NF instructions with
132- // GOTTPOFF relocation (update the instructions to ADD64rm/ADD64mr and
133- // suppress EGPR)
134- for (auto &MO : MI.operands ())
143+ for (auto &MO : MI.operands ()) {
144+ if (MO.getTargetFlags () == X86II::MO_GOTTPOFF) {
145+ suppressEGPRRegClass (MF, MI, 0 );
146+ const MCInstrDesc &NewDesc = ST.getInstrInfo ()->get (X86::ADD64rm);
147+ MI.setDesc (NewDesc);
148+ if (Opcode == X86::ADD64rm_ND || Opcode == X86::ADD64rm_NF_ND) {
149+ MI.tieOperands (0 , 1 );
150+ MI.getOperand (1 ).setIsKill (false );
151+ suppressEGPRRegClass (MF, MI, 1 );
152+ }
153+ break ;
154+ }
155+ }
156+ break ;
157+ }
158+ case X86::ADD64mr_ND:
159+ case X86::ADD64mr_NF_ND: {
160+ for ([[maybe_unused]] auto &MO : MI.operands ()) {
135161 assert ((MO.getTargetFlags () != X86II::MO_GOTTPOFF) &&
136- " Suppressing NDD/NF instructions with relocation is "
162+ " Suppressing this instruction with relocation is "
137163 " unimplemented!" );
164+ break ;
165+ }
138166 break ;
139167 }
140168 }
0 commit comments