Skip to content

[AVR] Emit relocation record for local branch #145291

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 1 addition & 13 deletions llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -520,19 +520,7 @@ bool AVRAsmBackend::forceRelocation(const MCFragment &F, const MCFixup &Fixup,
return false;

case AVR::fixup_7_pcrel:
case AVR::fixup_13_pcrel: {
uint64_t Offset = Target.getConstant();
uint64_t Size = AVRAsmBackend::getFixupKindInfo(Fixup.getKind()).TargetSize;

// If the jump is too large to encode it, fall back to a relocation.
//
// Note that trying to actually link that relocation *would* fail, but the
// hopes are that the module we're currently compiling won't be actually
// linked to the final binary.
return !adjust::adjustRelativeBranch(Size, Fixup, Offset,
getContext().getSubtargetInfo());
}

case AVR::fixup_13_pcrel:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As previous discussion with @Patryk27 eariler this year, such change is so aggressive, which I have to consider more than just fix the -mrelax issue.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fwiw, I think this ^ is what GCC does as well, would be nice to have if only for better compatibility 👀

case AVR::fixup_call:
return true;
}
Expand Down
12 changes: 8 additions & 4 deletions llvm/test/CodeGen/AVR/branch-relaxation-long-backward.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,18 @@
; ATTINY85: <main>:
; ATTINY85-NEXT: andi r24, 0x1
; ATTINY85: cpi r24, 0x0
; ATTINY85-NEXT: breq .+2
; ATTINY85-NEXT: rjmp .+4086
; ATTINY85-NEXT: breq .-2
; ATTINY85-NEXT: R_AVR_7_PCREL .text+0x100c
; ATTINY85-NEXT: rjmp .-2
; ATTINY85-NEXT: R_AVR_13_PCREL .text+0x2
; ATTINY85: ldi r24, 0x3
; ATTINY85-NEXT: ret

; AVR25: <main>:
; AVR25-NEXT: andi r24, 0x1
; AVR25: cpi r24, 0x0
; AVR25-NEXT: breq .+2
; AVR25-NEXT: breq .-2
; AVR25-NEXT: R_AVR_7_PCREL .text+0x100c
; AVR25-NEXT: rjmp .-2
; AVR25-NEXT: R_AVR_13_PCREL .text+0x2
; AVR25: ldi r24, 0x3
Expand All @@ -22,7 +25,8 @@
; AVR3: <main>:
; AVR3-NEXT: andi r24, 0x1
; AVR3: cpi r24, 0x0
; AVR3-NEXT: breq .+4
; AVR3-NEXT: breq .-2
; AVR3-NEXT: R_AVR_7_PCREL .text+0x100e
; AVR3-NEXT: jmp 0x0
; AVR3-NEXT: R_AVR_CALL .text+0x2
; AVR3: ldi r24, 0x3
Expand Down
12 changes: 8 additions & 4 deletions llvm/test/CodeGen/AVR/branch-relaxation-long-forward.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,18 @@
; ATTINY85: <main>:
; ATTINY85-NEXT: andi r24, 0x1
; ATTINY85-NEXT: cpi r24, 0x0
; ATTINY85-NEXT: brne .+2
; ATTINY85-NEXT: rjmp .-4092
; ATTINY85-NEXT: brne .-2
; ATTINY85-NEXT: R_AVR_7_PCREL .text+0x8
; ATTINY85-NEXT: rjmp .-2
; ATTINY85-NEXT: R_AVR_13_PCREL .text+0x100c
; ATTINY85: ldi r24, 0x3
; ATTINY85-NEXT: ret

; AVR25: <main>:
; AVR25-NEXT: andi r24, 0x1
; AVR25-NEXT: cpi r24, 0x0
; AVR25-NEXT: brne .+2
; AVR25-NEXT: brne .-2
; AVR25-NEXT: R_AVR_7_PCREL .text+0x8
; AVR25-NEXT: rjmp .-2
; AVR25-NEXT: R_AVR_13_PCREL .text+0x100c
; AVR25: ldi r24, 0x3
Expand All @@ -22,7 +25,8 @@
; AVR3: <main>:
; AVR3-NEXT: andi r24, 0x1
; AVR3-NEXT: cpi r24, 0x0
; AVR3-NEXT: brne .+4
; AVR3-NEXT: brne .-2
; AVR3-NEXT: R_AVR_7_PCREL .text+0xa
; AVR3-NEXT: jmp 0x0
; AVR3-NEXT: R_AVR_CALL .text+0x100e
; AVR3: ldi r24, 0x3
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/CodeGen/AVR/jmp.ll
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ declare i8 @bar(i8);
; CHECK: rcall .-2
; CHECK-NEXT: 00000000: R_AVR_13_PCREL bar
; CHECK-NEXT: cpi r24, 0x7b
; CHECK-NEXT: brne .+4
; CHECK-NEXT: brne .-2
; CHECK-NEXT: R_AVR_7_PCREL .text+0xa
; CHECK-NEXT: ldi r24, 0x64
; CHECK-NEXT: ret
; CHECK-NEXT: ldi r24, 0xc8
Expand Down
6 changes: 4 additions & 2 deletions llvm/test/MC/AVR/inst-brbc.s
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ foo:
; CHECK: brcc .Ltmp1-16+2 ; encoding: [0bAAAAA000,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: 23 f4 brvc .+8
; INST-NEXT: c0 f7 brsh .-16
; INST-NEXT: fb f7 brvc .-2
; INST-NEXT: R_AVR_7_PCREL .text+0xa
; INST-NEXT: f8 f7 brsh .-2
; INST-NEXT: R_AVR_7_PCREL .text-0xc
; INST-NEXT: 59 f7 brne .-42
; INST-NEXT: 52 f7 brpl .-44
; INST-NEXT: 4c f7 brge .-46
Expand Down
6 changes: 4 additions & 2 deletions llvm/test/MC/AVR/inst-brbs.s
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ foo:
; CHECK: brcs .Ltmp1-12+2 ; encoding: [0bAAAAA000,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: 23 f0 brvs .+8
; INST-NEXT: d0 f3 brlo .-12
; INST-NEXT: fb f3 brvs .-2
; INST-NEXT: R_AVR_7_PCREL .text+0xa
; INST-NEXT: f8 f3 brlo .-2
; INST-NEXT: R_AVR_7_PCREL .text-0x8
; INST-NEXT: 59 f3 breq .-42
; INST-NEXT: 52 f3 brmi .-44
; INST-NEXT: 4c f3 brlt .-46
Expand Down
12 changes: 8 additions & 4 deletions llvm/test/MC/AVR/inst-brcc.s
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ bar:
; CHECK: brcc bar ; encoding: [0bAAAAA000,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: 08 f5 brsh .+66
; INST-NEXT: a8 f7 brsh .-22
; INST-NEXT: 08 f5 brsh .+66
; INST-NEXT: 00 f4 brsh .+0
; INST-NEXT: f8 f7 brsh .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x44
; INST-NEXT: f8 f7 brsh .-2
; INST-NEXT: R_AVR_7_PCREL .text-0x12
; INST-NEXT: f8 f7 brsh .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x48
; INST-NEXT: f8 f7 brsh .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x8
11 changes: 7 additions & 4 deletions llvm/test/MC/AVR/inst-brcs.s
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ bar:
; CHECK: brcs bar ; encoding: [0bAAAAA000,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: 20 f0 brlo .+8
; INST-NEXT: 10 f0 brlo .+4
; INST-NEXT: 20 f0 brlo .+8
; INST-NEXT: 00 f0 brlo .+0
; INST-NEXT: f8 f3 brlo .-2
; INST-NEXT: R_AVR_7_PCREL .text+0xa
; INST-NEXT: f8 f3 brlo .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x8
; INST-NEXT: f8 f3 brlo .-2
; INST-NEXT: R_AVR_7_PCREL .text+0xe
; INST-NEXT: f8 f3 brlo .-2
10 changes: 6 additions & 4 deletions llvm/test/MC/AVR/inst-breq.s
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ bar:
; CHECK: brbs 1, bar ; encoding: [0bAAAAA001,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: b9 f3 breq .-18
; INST-NEXT: d1 f3 breq .-12
; INST-NEXT: b9 f3 breq .-18
; INST-NEXT: 01 f0 breq .+0
; INST-NEXT: f9 f3 breq .-2
; INST-NEXT: R_AVR_7_PCREL .text-0x10
; INST-NEXT: f9 f3 breq .-2
; INST-NEXT: R_AVR_7_PCREL .text-0x8
; INST-NEXT: f9 f3 breq .-2
; INST-NEXT: R_AVR_7_PCREL .text-0xc
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brge.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brge bar ; encoding: [0bAAAAA100,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: cc f4 brge .+50
; INST-NEXT: ac f4 brge .+42
; INST-NEXT: 04 f4 brge .+0
; INST-NEXT: fc f7 brge .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x34
; INST-NEXT: fc f7 brge .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x2e
; INST-NEXT: fc f7 brge .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brhc.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brhc bar ; encoding: [0bAAAAA101,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: 35 f4 brhc .+12
; INST-NEXT: 3d f4 brhc .+14
; INST-NEXT: 05 f4 brhc .+0
; INST-NEXT: fd f7 brhc .-2
; INST-NEXT: R_AVR_7_PCREL .text+0xe
; INST-NEXT: fd f7 brhc .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x12
; INST-NEXT: fd f7 brhc .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brhs.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brhs bar ; encoding: [0bAAAAA101,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: fd f2 brhs .-66
; INST-NEXT: 3d f0 brhs .+14
; INST-NEXT: 05 f0 brhs .+0
; INST-NEXT: fd f3 brhs .-2
; INST-NEXT: R_AVR_7_PCREL .text-0x40
; INST-NEXT: fd f3 brhs .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x12
; INST-NEXT: fd f3 brhs .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brid.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brid bar ; encoding: [0bAAAAA111,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: af f4 brid .+42
; INST-NEXT: ff f4 brid .+62
; INST-NEXT: 07 f4 brid .+0
; INST-NEXT: ff f7 brid .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x2c
; INST-NEXT: ff f7 brid .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x42
; INST-NEXT: ff f7 brid .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brie.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brie bar ; encoding: [0bAAAAA111,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: 57 f0 brie .+20
; INST-NEXT: a7 f0 brie .+40
; INST-NEXT: 07 f0 brie .+0
; INST-NEXT: ff f3 brie .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x16
; INST-NEXT: ff f3 brie .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x2c
; INST-NEXT: ff f3 brie .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brlo.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brlo bar ; encoding: [0bAAAAA000,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: 30 f0 brlo .+12
; INST-NEXT: 70 f0 brlo .+28
; INST-NEXT: 00 f0 brlo .+0
; INST-NEXT: f8 f3 brlo .-2
; INST-NEXT: R_AVR_7_PCREL .text+0xe
; INST-NEXT: f8 f3 brlo .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x20
; INST-NEXT: f8 f3 brlo .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brlt.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brlt bar ; encoding: [0bAAAAA100,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: 44 f0 brlt .+16
; INST-NEXT: 0c f0 brlt .+2
; INST-NEXT: 04 f0 brlt .+0
; INST-NEXT: fc f3 brlt .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x12
; INST-NEXT: fc f3 brlt .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
; INST-NEXT: fc f3 brlt .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brmi.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brmi bar ; encoding: [0bAAAAA010,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: 0a f1 brmi .+66
; INST-NEXT: ea f0 brmi .+58
; INST-NEXT: 02 f0 brmi .+0
; INST-NEXT: fa f3 brmi .-2
; INST-NEXT: VR_7_PCREL .text+0x44
; INST-NEXT: fa f3 brmi .-2
; INST-NEXT: VR_7_PCREL .text+0x3e
; INST-NEXT: fa f3 brmi .-2
; INST-NEXT: VR_7_PCREL .text+0x6
10 changes: 6 additions & 4 deletions llvm/test/MC/AVR/inst-brne.s
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ bar:
; CHECK: brbc 1, bar ; encoding: [0bAAAAA001,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: 29 f4 brne .+10
; INST-NEXT: 09 f4 brne .+2
; INST-NEXT: 29 f4 brne .+10
; INST-NEXT: 01 f4 brne .+0
; INST-NEXT: f9 f7 brne .-2
; INST-NEXT: R_AVR_7_PCREL .text+0xc
; INST-NEXT: f9 f7 brne .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
; INST-NEXT: f9 f7 brne .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x10
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brpl.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brpl bar ; encoding: [0bAAAAA010,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: d2 f7 brpl .-12
; INST-NEXT: 4a f4 brpl .+18
; INST-NEXT: 02 f4 brpl .+0
; INST-NEXT: fa f7 brpl .-2
; INST-NEXT: R_AVR_7_PCREL .text-0xa
; INST-NEXT: fa f7 brpl .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x16
; INST-NEXT: fa f7 brpl .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brsh.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brsh bar ; encoding: [0bAAAAA000,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: 80 f4 brsh .+32
; INST-NEXT: 18 f5 brsh .+70
; INST-NEXT: 00 f4 brsh .+0
; INST-NEXT: f8 f7 brsh .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x22
; INST-NEXT: f8 f7 brsh .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x4a
; INST-NEXT: f8 f7 brsh .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brtc.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brtc bar ; encoding: [0bAAAAA110,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: d6 f4 brtc .+52
; INST-NEXT: ce f4 brtc .+50
; INST-NEXT: 06 f4 brtc .+0
; INST-NEXT: fe f7 brtc .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x36
; INST-NEXT: fe f7 brtc .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x36
; INST-NEXT: fe f7 brtc .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brts.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brts bar ; encoding: [0bAAAAA110,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: 4e f0 brts .+18
; INST-NEXT: 5e f0 brts .+22
; INST-NEXT: 06 f0 brts .+0
; INST-NEXT: fe f3 brts .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x14
; INST-NEXT: fe f3 brts .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x1a
; INST-NEXT: fe f3 brts .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brvc.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brvc bar ; encoding: [0bAAAAA011,0b111101AA]

; INST-LABEL: <foo>:
; INST-NEXT: 93 f7 brvc .-28
; INST-NEXT: 0b f7 brvc .-62
; INST-NEXT: 03 f4 brvc .+0
; INST-NEXT: fb f7 brvc .-2
; INST-NEXT: R_AVR_7_PCREL .text-0x1a
; INST-NEXT: fb f7 brvc .-2
; INST-NEXT: R_AVR_7_PCREL .text-0x3a
; INST-NEXT: fb f7 brvc .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
9 changes: 6 additions & 3 deletions llvm/test/MC/AVR/inst-brvs.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ bar:
; CHECK: brvs bar ; encoding: [0bAAAAA011,0b111100AA]

; INST-LABEL: <foo>:
; INST-NEXT: 4b f0 brvs .+18
; INST-NEXT: 83 f0 brvs .+32
; INST-NEXT: 03 f0 brvs .+0
; INST-NEXT: fb f3 brvs .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x14
; INST-NEXT: fb f3 brvs .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x24
; INST-NEXT: fb f3 brvs .-2
; INST-NEXT: R_AVR_7_PCREL .text+0x6
12 changes: 7 additions & 5 deletions llvm/test/MC/AVR/inst-rcall.s
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ foo:
; CHECK: rcall .Ltmp3+46+2 ; encoding: [A,0b1101AAAA]

; INST-LABEL: <foo>:
; INST-NEXT: 00 d0 rcall .+0
; INST-NEXT: fc df rcall .-8
; INST-NEXT: 06 d0 rcall .+12
; INST-NEXT: 17 d0 rcall .+46
; INST-NEXT: ea df rcall .-44
; INST-NEXT: ff df rcall .-2
; INST-NEXT: R_AVR_13_PCREL .text+0x2
; INST-NEXT: ff df rcall .-2
; INST-NEXT: R_AVR_13_PCREL .text-0x4
; INST-NEXT: ff df rcall .-2
; INST-NEXT: R_AVR_13_PCREL .text+0x12
; INST-NEXT: ff df rcall .-2
Loading
Loading