@@ -112,167 +112,164 @@ static unsigned getFixupKindNumBytes(unsigned Kind) {
112112}
113113
114114namespace {
115- class SparcAsmBackend : public MCAsmBackend {
116- protected:
117- bool Is64Bit;
118- bool IsV8Plus;
119-
120- public:
121- SparcAsmBackend(const MCSubtargetInfo &STI)
122- : MCAsmBackend(STI.getTargetTriple().isLittleEndian()
123- ? llvm::endianness::little
124- : llvm::endianness::big),
125- Is64Bit(STI.getTargetTriple().isArch64Bit()),
126- IsV8Plus(STI.hasFeature(Sparc::FeatureV8Plus)) {}
127-
128-
129- std::optional<MCFixupKind> getFixupKind(StringRef Name) const override {
130- unsigned Type;
131- Type = llvm::StringSwitch<unsigned>(Name)
115+ class SparcAsmBackend : public MCAsmBackend {
116+ protected:
117+ bool Is64Bit;
118+ bool IsV8Plus;
119+
120+ public:
121+ SparcAsmBackend(const MCSubtargetInfo &STI)
122+ : MCAsmBackend(STI.getTargetTriple().isLittleEndian()
123+ ? llvm::endianness::little
124+ : llvm::endianness::big),
125+ Is64Bit(STI.getTargetTriple().isArch64Bit()),
126+ IsV8Plus(STI.hasFeature(Sparc::FeatureV8Plus)) {}
127+
128+ std::optional<MCFixupKind> getFixupKind(StringRef Name) const override;
129+ MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const override;
130+ void applyFixup(const MCFragment &, const MCFixup &, const MCValue &Target,
131+ MutableArrayRef<char> Data, uint64_t Value,
132+ bool IsResolved) override;
133+
134+ bool writeNopData(raw_ostream &OS, uint64_t Count,
135+ const MCSubtargetInfo *STI) const override {
136+
137+ // If the count is not 4-byte aligned, we must be writing data into the
138+ // text section (otherwise we have unaligned instructions, and thus have
139+ // far bigger problems), so just write zeros instead.
140+ OS.write_zeros(Count % 4);
141+
142+ uint64_t NumNops = Count / 4;
143+ for (uint64_t i = 0; i != NumNops; ++i)
144+ support::endian::write<uint32_t>(OS, 0x01000000, Endian);
145+
146+ return true;
147+ }
148+ };
149+
150+ class ELFSparcAsmBackend : public SparcAsmBackend {
151+ Triple::OSType OSType;
152+
153+ public:
154+ ELFSparcAsmBackend(const MCSubtargetInfo &STI, Triple::OSType OSType)
155+ : SparcAsmBackend(STI), OSType(OSType) {}
156+
157+ std::unique_ptr<MCObjectTargetWriter>
158+ createObjectTargetWriter() const override {
159+ uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(OSType);
160+ return createSparcELFObjectWriter(Is64Bit, IsV8Plus, OSABI);
161+ }
162+ };
163+ } // end anonymous namespace
164+
165+ std::optional<MCFixupKind> SparcAsmBackend::getFixupKind(StringRef Name) const {
166+ unsigned Type;
167+ Type = llvm::StringSwitch<unsigned>(Name)
132168#define ELF_RELOC(X, Y) .Case(#X, Y)
133169#include "llvm/BinaryFormat/ELFRelocs/Sparc.def"
134170#undef ELF_RELOC
135- .Case("BFD_RELOC_NONE", ELF::R_SPARC_NONE)
136- .Case("BFD_RELOC_8", ELF::R_SPARC_8)
137- .Case("BFD_RELOC_16", ELF::R_SPARC_16)
138- .Case("BFD_RELOC_32", ELF::R_SPARC_32)
139- .Case("BFD_RELOC_64", ELF::R_SPARC_64)
140- .Default(-1u);
141- if (Type == -1u)
142- return std::nullopt;
143- return static_cast<MCFixupKind>(FirstLiteralRelocationKind + Type);
144- }
145-
146- MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const override {
147- // clang-format off
148- const static MCFixupKindInfo InfosBE[Sparc::NumTargetFixupKinds] = {
149- // name offset bits flags
150- { "fixup_sparc_call30", 2, 30, MCFixupKindInfo::FKF_IsPCRel },
151- { "fixup_sparc_13", 19, 13, 0 },
152- };
153-
154- const static MCFixupKindInfo InfosLE[Sparc::NumTargetFixupKinds] = {
155- // name offset bits flags
156- { "fixup_sparc_call30", 0, 30, MCFixupKindInfo::FKF_IsPCRel },
157- { "fixup_sparc_13", 0, 13, 0 },
158- };
159- // clang-format on
160-
161- if (!mc::isRelocation(Kind)) {
162- if (Kind < FirstTargetFixupKind)
163- return MCAsmBackend::getFixupKindInfo(Kind);
164- assert(unsigned(Kind - FirstTargetFixupKind) <
165- Sparc::NumTargetFixupKinds &&
166- "Invalid kind!");
167- if (Endian == llvm::endianness::little)
168- return InfosLE[Kind - FirstTargetFixupKind];
169-
170- return InfosBE[Kind - FirstTargetFixupKind];
171- }
172-
173- MCFixupKindInfo Info{};
174- switch (uint16_t(Kind)) {
175- case ELF::R_SPARC_PC10:
176- Info = {"", 22, 10, MCFixupKindInfo::FKF_IsPCRel};
177- break;
178- case ELF::R_SPARC_PC22:
179- Info = {"", 10, 22, MCFixupKindInfo::FKF_IsPCRel};
180- break;
181- case ELF::R_SPARC_WDISP10:
182- Info = {"", 0, 32, MCFixupKindInfo::FKF_IsPCRel};
183- break;
184- case ELF::R_SPARC_WDISP16:
185- Info = {"", 0, 32, MCFixupKindInfo::FKF_IsPCRel};
186- break;
187- case ELF::R_SPARC_WDISP19:
188- Info = {"", 13, 19, MCFixupKindInfo::FKF_IsPCRel};
189- break;
190- case ELF::R_SPARC_WDISP22:
191- Info = {"", 10, 22, MCFixupKindInfo::FKF_IsPCRel};
192- break;
193-
194- case ELF::R_SPARC_HI22:
195- Info = {"", 10, 22, 0};
196- break;
197- case ELF::R_SPARC_LO10:
198- Info = {"", 22, 10, 0};
199- break;
200- case ELF::R_SPARC_HH22:
201- Info = {"", 10, 22, 0};
202- break;
203- case ELF::R_SPARC_HM10:
204- Info = {"", 22, 10, 0};
205- break;
206- case ELF::R_SPARC_LM22:
207- Info = {"", 10, 22, 0};
208- break;
209- case ELF::R_SPARC_HIX22:
210- Info = {"", 10, 22, 0};
211- break;
212- case ELF::R_SPARC_LOX10:
213- Info = {"", 19, 13, 0};
214- break;
215- }
216- if (Endian == llvm::endianness::little)
217- Info.TargetOffset = 32 - Info.TargetOffset - Info.TargetSize;
218- return Info;
219- }
220-
221- void relaxInstruction(MCInst &Inst,
222- const MCSubtargetInfo &STI) const override {
223- // FIXME.
224- llvm_unreachable("relaxInstruction() unimplemented");
225- }
226-
227- bool writeNopData(raw_ostream &OS, uint64_t Count,
228- const MCSubtargetInfo *STI) const override {
229-
230- // If the count is not 4-byte aligned, we must be writing data into the
231- // text section (otherwise we have unaligned instructions, and thus have
232- // far bigger problems), so just write zeros instead.
233- OS.write_zeros(Count % 4);
234-
235- uint64_t NumNops = Count / 4;
236- for (uint64_t i = 0; i != NumNops; ++i)
237- support::endian::write<uint32_t>(OS, 0x01000000, Endian);
238-
239- return true;
240- }
171+ .Case("BFD_RELOC_NONE", ELF::R_SPARC_NONE)
172+ .Case("BFD_RELOC_8", ELF::R_SPARC_8)
173+ .Case("BFD_RELOC_16", ELF::R_SPARC_16)
174+ .Case("BFD_RELOC_32", ELF::R_SPARC_32)
175+ .Case("BFD_RELOC_64", ELF::R_SPARC_64)
176+ .Default(-1u);
177+ if (Type == -1u)
178+ return std::nullopt;
179+ return static_cast<MCFixupKind>(FirstLiteralRelocationKind + Type);
180+ }
181+
182+ MCFixupKindInfo SparcAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
183+ // clang-format off
184+ const static MCFixupKindInfo InfosBE[Sparc::NumTargetFixupKinds] = {
185+ // name offset bits flags
186+ { "fixup_sparc_call30", 2, 30, MCFixupKindInfo::FKF_IsPCRel },
187+ { "fixup_sparc_13", 19, 13, 0 },
241188 };
242189
243- class ELFSparcAsmBackend : public SparcAsmBackend {
244- Triple::OSType OSType;
245- public:
246- ELFSparcAsmBackend(const MCSubtargetInfo &STI, Triple::OSType OSType)
247- : SparcAsmBackend(STI), OSType(OSType) {}
248-
249- void applyFixup(const MCFragment &, const MCFixup &Fixup,
250- const MCValue &Target, MutableArrayRef<char> Data,
251- uint64_t Value, bool IsResolved) override {
252- if (!IsResolved)
253- return;
254- Value = adjustFixupValue(Fixup.getKind(), Value);
255-
256- unsigned NumBytes = getFixupKindNumBytes(Fixup.getKind());
257- unsigned Offset = Fixup.getOffset();
258- // For each byte of the fragment that the fixup touches, mask in the bits
259- // from the fixup value. The Value has been "split up" into the
260- // appropriate bitfields above.
261- for (unsigned i = 0; i != NumBytes; ++i) {
262- unsigned Idx =
263- Endian == llvm::endianness::little ? i : (NumBytes - 1) - i;
264- Data[Offset + Idx] |= uint8_t((Value >> (i * 8)) & 0xff);
265- }
266- }
267-
268- std::unique_ptr<MCObjectTargetWriter>
269- createObjectTargetWriter() const override {
270- uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(OSType);
271- return createSparcELFObjectWriter(Is64Bit, IsV8Plus, OSABI);
272- }
190+ const static MCFixupKindInfo InfosLE[Sparc::NumTargetFixupKinds] = {
191+ // name offset bits flags
192+ { "fixup_sparc_call30", 0, 30, MCFixupKindInfo::FKF_IsPCRel },
193+ { "fixup_sparc_13", 0, 13, 0 },
273194 };
195+ // clang-format on
274196
275- } // end anonymous namespace
197+ if (!mc::isRelocation(Kind)) {
198+ if (Kind < FirstTargetFixupKind)
199+ return MCAsmBackend::getFixupKindInfo(Kind);
200+ assert(unsigned(Kind - FirstTargetFixupKind) < Sparc::NumTargetFixupKinds &&
201+ "Invalid kind!");
202+ if (Endian == llvm::endianness::little)
203+ return InfosLE[Kind - FirstTargetFixupKind];
204+
205+ return InfosBE[Kind - FirstTargetFixupKind];
206+ }
207+
208+ MCFixupKindInfo Info{};
209+ switch (uint16_t(Kind)) {
210+ case ELF::R_SPARC_PC10:
211+ Info = {"", 22, 10, MCFixupKindInfo::FKF_IsPCRel};
212+ break;
213+ case ELF::R_SPARC_PC22:
214+ Info = {"", 10, 22, MCFixupKindInfo::FKF_IsPCRel};
215+ break;
216+ case ELF::R_SPARC_WDISP10:
217+ Info = {"", 0, 32, MCFixupKindInfo::FKF_IsPCRel};
218+ break;
219+ case ELF::R_SPARC_WDISP16:
220+ Info = {"", 0, 32, MCFixupKindInfo::FKF_IsPCRel};
221+ break;
222+ case ELF::R_SPARC_WDISP19:
223+ Info = {"", 13, 19, MCFixupKindInfo::FKF_IsPCRel};
224+ break;
225+ case ELF::R_SPARC_WDISP22:
226+ Info = {"", 10, 22, MCFixupKindInfo::FKF_IsPCRel};
227+ break;
228+
229+ case ELF::R_SPARC_HI22:
230+ Info = {"", 10, 22, 0};
231+ break;
232+ case ELF::R_SPARC_LO10:
233+ Info = {"", 22, 10, 0};
234+ break;
235+ case ELF::R_SPARC_HH22:
236+ Info = {"", 10, 22, 0};
237+ break;
238+ case ELF::R_SPARC_HM10:
239+ Info = {"", 22, 10, 0};
240+ break;
241+ case ELF::R_SPARC_LM22:
242+ Info = {"", 10, 22, 0};
243+ break;
244+ case ELF::R_SPARC_HIX22:
245+ Info = {"", 10, 22, 0};
246+ break;
247+ case ELF::R_SPARC_LOX10:
248+ Info = {"", 19, 13, 0};
249+ break;
250+ }
251+ if (Endian == llvm::endianness::little)
252+ Info.TargetOffset = 32 - Info.TargetOffset - Info.TargetSize;
253+ return Info;
254+ }
255+
256+ void SparcAsmBackend::applyFixup(const MCFragment &, const MCFixup &Fixup,
257+ const MCValue &Target,
258+ MutableArrayRef<char> Data, uint64_t Value,
259+ bool IsResolved) {
260+ if (!IsResolved)
261+ return;
262+ Value = adjustFixupValue(Fixup.getKind(), Value);
263+
264+ unsigned NumBytes = getFixupKindNumBytes(Fixup.getKind());
265+ unsigned Offset = Fixup.getOffset();
266+ // For each byte of the fragment that the fixup touches, mask in the
267+ // bits from the fixup value.
268+ for (unsigned i = 0; i != NumBytes; ++i) {
269+ unsigned Idx = Endian == llvm::endianness::little ? i : (NumBytes - 1) - i;
270+ Data[Offset + Idx] |= uint8_t((Value >> (i * 8)) & 0xff);
271+ }
272+ }
276273
277274MCAsmBackend *llvm::createSparcAsmBackend(const Target &T,
278275 const MCSubtargetInfo &STI,
0 commit comments