Skip to content

Commit 8cb8428

Browse files
authored
[M68k] Fix ODR violation in GISel code (#72797)
It prevents LLVM from being linked with LLD at least on Windows, with errors like this: ``` = note: ld.lld: error: duplicate symbol: vtable for llvm::FormalArgHandler >>> defined at librustc_llvm-a81737dd65a7c126.rlib(M68kCallLowering.cpp.obj) >>> defined at librustc_llvm-a81737dd65a7c126.rlib(PPCCallLowering.cpp.obj) ``` Binutils linker also complains about this, but only with warnings. `FormalArgHandler` has a base class `M68kIncomingValueHandler` which doesn't have a virtual method `markPhysRegUsed` like `IncomingValueHandler`s for all other targets including PPC, so it results in a conflict. The simplest fix is to rename the `FormalArgHandler` structure (rather than to add virtual methods for compatibility). cc rust-lang/rust#107668
1 parent 2047ab0 commit 8cb8428

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

llvm/lib/Target/M68k/GISel/M68kCallLowering.cpp

+22-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,27 @@
2525

2626
using namespace llvm;
2727

28+
namespace {
29+
30+
struct M68kFormalArgHandler : public M68kIncomingValueHandler {
31+
M68kFormalArgHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI)
32+
: M68kIncomingValueHandler(MIRBuilder, MRI) {}
33+
};
34+
35+
struct CallReturnHandler : public M68kIncomingValueHandler {
36+
CallReturnHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
37+
MachineInstrBuilder &MIB)
38+
: M68kIncomingValueHandler(MIRBuilder, MRI), MIB(MIB) {}
39+
40+
private:
41+
void assignValueToReg(Register ValVReg, Register PhysReg,
42+
const CCValAssign &VA) override;
43+
44+
MachineInstrBuilder &MIB;
45+
};
46+
47+
} // end anonymous namespace
48+
2849
M68kCallLowering::M68kCallLowering(const M68kTargetLowering &TLI)
2950
: CallLowering(&TLI) {}
3051

@@ -119,7 +140,7 @@ bool M68kCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
119140
CCAssignFn *AssignFn =
120141
TLI.getCCAssignFn(F.getCallingConv(), false, F.isVarArg());
121142
IncomingValueAssigner ArgAssigner(AssignFn);
122-
FormalArgHandler ArgHandler(MIRBuilder, MRI);
143+
M68kFormalArgHandler ArgHandler(MIRBuilder, MRI);
123144
return determineAndHandleAssignments(ArgHandler, ArgAssigner, SplitArgs,
124145
MIRBuilder, F.getCallingConv(),
125146
F.isVarArg());

llvm/lib/Target/M68k/GISel/M68kCallLowering.h

-17
Original file line numberDiff line numberDiff line change
@@ -63,23 +63,6 @@ struct M68kIncomingValueHandler : public CallLowering::IncomingValueHandler {
6363
MachinePointerInfo &MPO,
6464
ISD::ArgFlagsTy Flags) override;
6565
};
66-
67-
struct FormalArgHandler : public M68kIncomingValueHandler {
68-
FormalArgHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI)
69-
: M68kIncomingValueHandler(MIRBuilder, MRI) {}
70-
};
71-
72-
struct CallReturnHandler : public M68kIncomingValueHandler {
73-
CallReturnHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
74-
MachineInstrBuilder &MIB)
75-
: M68kIncomingValueHandler(MIRBuilder, MRI), MIB(MIB) {}
76-
77-
private:
78-
void assignValueToReg(Register ValVReg, Register PhysReg,
79-
const CCValAssign &VA) override;
80-
81-
MachineInstrBuilder &MIB;
82-
};
8366
} // end namespace llvm
8467

8568
#endif // LLVM_LIB_TARGET_M68K_GLSEL_M68KCALLLOWERING_H

0 commit comments

Comments
 (0)