Skip to content

Commit 366d34b

Browse files
committed
[AVR][MC] Add ELF flag 'EF_AVR_LINKRELAX_PREPARED' to OBJ files
This is in accordance with avr-gcc, even '-mno-relax' is specified to avr-gcc, this flag will also be added to the output relocatables. With this flag set, the GNU ld will perform long call -> short call optimization for AVR, otherwise not. Fixes #54508 Reviewed By: MaskRay, jacquesguan, aykevl Differential Revision: https://reviews.llvm.org/D144617
1 parent e758215 commit 366d34b

File tree

4 files changed

+80
-3
lines changed

4 files changed

+80
-3
lines changed

lld/test/ELF/avr-flags.s

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
; RUN: not ld.lld %t-v5 %t-xmega3 -o /dev/null 2>&1 | FileCheck --check-prefix ERR %s
1212
; ERR: error: {{.*}}: cannot link object files with incompatible target ISA
1313

14-
; V5: Flags [ (0x5)
14+
; V5: Flags [ (0x85)
1515
; V5: EF_AVR_ARCH_AVR5 (0x5)
16-
; XMEGA3: Flags [ (0x67)
16+
; V5: EF_AVR_LINKRELAX_PREPARED (0x80)
17+
; XMEGA3: Flags [ (0xE7)
1718
; XMEGA3: EF_AVR_ARCH_XMEGA3 (0x67)
19+
; XMEGA3: EF_AVR_LINKRELAX_PREPARED (0x80)

lld/test/ELF/linkerscript/avr5.test

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# RUN: llvm-readelf --headers %t/avr5b.out | FileCheck %s --check-prefix=HEAD
1717

1818
# HEAD: Atmel AVR 8-bit microcontroller
19-
# HEAD: 0x5, EF_AVR_ARCH_AVR5
19+
# HEAD: 0x85, EF_AVR_ARCH_AVR5, relaxable
2020

2121
# HEAD: Name Type Address Off Size
2222
# HEAD-NEXT: NULL 00000000 000000 000000

llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ AVRELFStreamer::AVRELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
6161
unsigned EFlags = MCA.getELFHeaderEFlags();
6262

6363
EFlags |= getEFlagsForFeatureSet(STI.getFeatureBits());
64+
EFlags |= ELF::EF_AVR_LINKRELAX_PREPARED;
6465

6566
MCA.setELFHeaderEFlags(EFlags);
6667
}

llvm/test/MC/AVR/elf_header.s

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=at90s8515 %s -o - \
2+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR2 %s
3+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=attiny13a %s -o - \
4+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR25 %s
5+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=attiny167 %s -o - \
6+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR35 %s
7+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atmega88 %s -o - \
8+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR4 %s
9+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atmega16 %s -o - \
10+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR5 %s
11+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atmega128 %s -o - \
12+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR51 %s
13+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=attiny817 %s -o - \
14+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,XM3 %s
15+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atxmega256a3u %s -o - \
16+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,XM6 %s
17+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atxmega256a3u %s -o - \
18+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,XM6 %s
19+
; RUN: llvm-mc -filetype=obj -triple avr -mcpu=attiny10 %s -o - \
20+
; RUN: | llvm-readobj -h - | FileCheck --check-prefixes=ALL,TINY %s
21+
22+
; ALL: ElfHeader {
23+
; ALL-NEXT: Ident {
24+
; ALL-NEXT: Magic: (7F 45 4C 46)
25+
; ALL-NEXT: Class: 32-bit (0x1)
26+
; ALL-NEXT: DataEncoding: LittleEndian (0x1)
27+
; ALL-NEXT: FileVersion: 1
28+
; ALL-NEXT: OS/ABI: SystemV (0x0)
29+
; ALL-NEXT: ABIVersion: 0
30+
; ALL-NEXT: Unused: (00 00 00 00 00 00 00)
31+
; ALL-NEXT: }
32+
; ALL-NEXT: Type: Relocatable (0x1)
33+
; ALL-NEXT: Machine: EM_AVR (0x53)
34+
; ALL-NEXT: Version: 1
35+
; ALL-NEXT: Entry: 0x0
36+
; ALL-NEXT: ProgramHeaderOffset: 0x0
37+
; ALL-NEXT: SectionHeaderOffset: 0x5C
38+
39+
; AVR2: Flags [ (0x82)
40+
; AVR2-NEXT: EF_AVR_ARCH_AVR2 (0x2)
41+
42+
; AVR25: Flags [ (0x99)
43+
; AVR25-NEXT: EF_AVR_ARCH_AVR25 (0x19)
44+
45+
; AVR35: Flags [ (0xA3)
46+
; AVR35-NEXT: EF_AVR_ARCH_AVR35 (0x23)
47+
48+
; AVR4: Flags [ (0x84)
49+
; AVR4-NEXT: EF_AVR_ARCH_AVR4 (0x4)
50+
51+
; AVR5: Flags [ (0x85)
52+
; AVR5-NEXT: EF_AVR_ARCH_AVR5 (0x5)
53+
54+
; AVR51: Flags [ (0xB3)
55+
; AVR51-NEXT: EF_AVR_ARCH_AVR51 (0x33)
56+
57+
; XM3: Flags [ (0xE7)
58+
; XM3-NEXT: EF_AVR_ARCH_XMEGA3 (0x67)
59+
60+
; XM6: Flags [ (0xEA)
61+
; XM6-NEXT: EF_AVR_ARCH_XMEGA6 (0x6A)
62+
63+
; TINY: Flags [ (0xE4)
64+
; TINY-NEXT: EF_AVR_ARCH_AVRTINY (0x64)
65+
66+
; ALL: EF_AVR_LINKRELAX_PREPARED (0x80)
67+
; ALL-NEXT: ]
68+
; ALL-NEXT: HeaderSize: 52
69+
; ALL-NEXT: ProgramHeaderEntrySize: 0
70+
; ALL-NEXT: ProgramHeaderCount: 0
71+
; ALL-NEXT: SectionHeaderEntrySize: 40
72+
; ALL-NEXT: SectionHeaderCount: 4
73+
; ALL-NEXT: StringTableSectionIndex: 1
74+
; ALL-NEXT: }

0 commit comments

Comments
 (0)