Skip to content

Missing register aliases for AVR for compatibility with gcc-avr's inline assembly #51557

Closed
@maribu

Description

@maribu
Bugzilla Link 52215
Version 12.0
OS other

Extended Description

E.g. the avr-libc but also other AVR code written for gcc-avr heavily uses the following aliases:

tmp_reg
SREG
zero_reg
SP_H
SP_L

also the aliases RAMPZ and EIND are occasionally used.

See [1] for their definitions.

This is the first time I looked into the LLVM source code, so I might be talking nonsense here. I tried to fix this by amending lib/Target/AVR/AVRRegisterInfo.td like this:

-def R0 : AVRReg<0, "r0">, DwarfRegNum<[0]>;
-def R1 : AVRReg<1, "r1">, DwarfRegNum<[1]>;
+def R0 : AVRReg<0, "r0", [], ["tmp_reg"]>, DwarfRegNum<[0]>;
+def R1 : AVRReg<1, "r1", [], ["zero_reg"]>, DwarfRegNum<[1]>;

etc. - but to no avail.

I also tried to just emit assignments for the alias via void AVRAsmPrinter::emitStartOfAsmFile(Module &M), but this didn't work for me either.

I think that adding the aliases should be relatively trivial for someone with same basic understanding of the LLVM code - which I sadly lack.

Also note that according to [1] the AVRtiny family has a different mapping (e.g. tmp_reg usually is r0, but on AVRtiny it is r16).

https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgcc/config/avr/lib1funcs.S;h=ac101b49f03e340e93e16283eb47146ef47290c2;hb=HEAD

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions