Skip to content

Commit 3cb7133

Browse files
petrochenkovcuviper
authored andcommittedDec 19, 2023
[M68k] Fix ODR violation in GISel code
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 adding virtual methods for compatibility).
1 parent 2c4de6c commit 3cb7133

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

@@ -118,7 +139,7 @@ bool M68kCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
118139
CCAssignFn *AssignFn =
119140
TLI.getCCAssignFn(F.getCallingConv(), false, F.isVarArg());
120141
IncomingValueAssigner ArgAssigner(AssignFn);
121-
FormalArgHandler ArgHandler(MIRBuilder, MRI);
142+
M68kFormalArgHandler ArgHandler(MIRBuilder, MRI);
122143
return determineAndHandleAssignments(ArgHandler, ArgAssigner, SplitArgs,
123144
MIRBuilder, F.getCallingConv(),
124145
F.isVarArg());

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

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

8467
#endif // LLVM_LIB_TARGET_M68K_GLSEL_M68KCALLLOWERING_H

0 commit comments

Comments
 (0)
Please sign in to comment.