[llvm] 366d34b - [AVR][MC] Add ELF flag 'EF_AVR_LINKRELAX_PREPARED' to OBJ files

Ben Shi via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 23 19:17:34 PST 2023


Author: Ben Shi
Date: 2023-02-24T11:16:42+08:00
New Revision: 366d34b39e432abff724f644adbff8d627d6f27c

URL: https://github.com/llvm/llvm-project/commit/366d34b39e432abff724f644adbff8d627d6f27c
DIFF: https://github.com/llvm/llvm-project/commit/366d34b39e432abff724f644adbff8d627d6f27c.diff

LOG: [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 https://github.com/llvm/llvm-project/issues/54508

Reviewed By: MaskRay, jacquesguan, aykevl

Differential Revision: https://reviews.llvm.org/D144617

Added: 
    llvm/test/MC/AVR/elf_header.s

Modified: 
    lld/test/ELF/avr-flags.s
    lld/test/ELF/linkerscript/avr5.test
    llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp

Removed: 
    


################################################################################
diff  --git a/lld/test/ELF/avr-flags.s b/lld/test/ELF/avr-flags.s
index 69e08cd4dab9e..df449af1c2468 100644
--- a/lld/test/ELF/avr-flags.s
+++ b/lld/test/ELF/avr-flags.s
@@ -11,7 +11,9 @@
 ; RUN: not ld.lld %t-v5 %t-xmega3 -o /dev/null 2>&1 | FileCheck --check-prefix ERR %s
 ; ERR: error: {{.*}}: cannot link object files with incompatible target ISA
 
-; V5:  Flags [ (0x5)
+; V5:  Flags [ (0x85)
 ; V5:  EF_AVR_ARCH_AVR5 (0x5)
-; XMEGA3: Flags [ (0x67)
+; V5:  EF_AVR_LINKRELAX_PREPARED (0x80)
+; XMEGA3: Flags [ (0xE7)
 ; XMEGA3: EF_AVR_ARCH_XMEGA3 (0x67)
+; XMEGA3: EF_AVR_LINKRELAX_PREPARED (0x80)

diff  --git a/lld/test/ELF/linkerscript/avr5.test b/lld/test/ELF/linkerscript/avr5.test
index 6c65a74c6c11f..5e52c945bae86 100644
--- a/lld/test/ELF/linkerscript/avr5.test
+++ b/lld/test/ELF/linkerscript/avr5.test
@@ -16,7 +16,7 @@
 # RUN: llvm-readelf --headers %t/avr5b.out | FileCheck %s --check-prefix=HEAD
 
 # HEAD: Atmel AVR 8-bit microcontroller
-# HEAD: 0x5, EF_AVR_ARCH_AVR5
+# HEAD: 0x85, EF_AVR_ARCH_AVR5, relaxable
 
 # HEAD:      Name     Type      Address   Off     Size
 # HEAD-NEXT:          NULL      00000000  000000  000000

diff  --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp
index ade5df18c3b9e..3900a1f3ba50b 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp
@@ -61,6 +61,7 @@ AVRELFStreamer::AVRELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
   unsigned EFlags = MCA.getELFHeaderEFlags();
 
   EFlags |= getEFlagsForFeatureSet(STI.getFeatureBits());
+  EFlags |= ELF::EF_AVR_LINKRELAX_PREPARED;
 
   MCA.setELFHeaderEFlags(EFlags);
 }

diff  --git a/llvm/test/MC/AVR/elf_header.s b/llvm/test/MC/AVR/elf_header.s
new file mode 100644
index 0000000000000..e82d86442eb21
--- /dev/null
+++ b/llvm/test/MC/AVR/elf_header.s
@@ -0,0 +1,74 @@
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=at90s8515 %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR2 %s
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=attiny13a %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR25 %s
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=attiny167 %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR35 %s
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atmega88 %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR4 %s
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atmega16 %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR5 %s
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atmega128 %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,AVR51 %s
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=attiny817 %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,XM3 %s
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atxmega256a3u %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,XM6 %s
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=atxmega256a3u %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,XM6 %s
+; RUN: llvm-mc -filetype=obj -triple avr -mcpu=attiny10 %s -o - \
+; RUN:     | llvm-readobj -h - | FileCheck --check-prefixes=ALL,TINY %s
+
+; ALL:       ElfHeader {
+; ALL-NEXT:    Ident {
+; ALL-NEXT:      Magic: (7F 45 4C 46)
+; ALL-NEXT:      Class: 32-bit (0x1)
+; ALL-NEXT:      DataEncoding: LittleEndian (0x1)
+; ALL-NEXT:      FileVersion: 1
+; ALL-NEXT:      OS/ABI: SystemV (0x0)
+; ALL-NEXT:      ABIVersion: 0
+; ALL-NEXT:      Unused: (00 00 00 00 00 00 00)
+; ALL-NEXT:    }
+; ALL-NEXT:    Type: Relocatable (0x1)
+; ALL-NEXT:    Machine: EM_AVR (0x53)
+; ALL-NEXT:    Version: 1
+; ALL-NEXT:    Entry: 0x0
+; ALL-NEXT:    ProgramHeaderOffset: 0x0
+; ALL-NEXT:    SectionHeaderOffset: 0x5C
+
+; AVR2:        Flags [ (0x82)
+; AVR2-NEXT:     EF_AVR_ARCH_AVR2 (0x2)
+
+; AVR25:       Flags [ (0x99)
+; AVR25-NEXT:    EF_AVR_ARCH_AVR25 (0x19)
+
+; AVR35:       Flags [ (0xA3)
+; AVR35-NEXT:    EF_AVR_ARCH_AVR35 (0x23)
+
+; AVR4:        Flags [ (0x84)
+; AVR4-NEXT:     EF_AVR_ARCH_AVR4 (0x4)
+
+; AVR5:        Flags [ (0x85)
+; AVR5-NEXT:     EF_AVR_ARCH_AVR5 (0x5)
+
+; AVR51:       Flags [ (0xB3)
+; AVR51-NEXT:    EF_AVR_ARCH_AVR51 (0x33)
+
+; XM3:         Flags [ (0xE7)
+; XM3-NEXT:      EF_AVR_ARCH_XMEGA3 (0x67)
+
+; XM6:         Flags [ (0xEA)
+; XM6-NEXT:      EF_AVR_ARCH_XMEGA6 (0x6A)
+
+; TINY:        Flags [ (0xE4)
+; TINY-NEXT:     EF_AVR_ARCH_AVRTINY (0x64)
+
+; ALL:           EF_AVR_LINKRELAX_PREPARED (0x80)
+; ALL-NEXT:    ]
+; ALL-NEXT:    HeaderSize: 52
+; ALL-NEXT:    ProgramHeaderEntrySize: 0
+; ALL-NEXT:    ProgramHeaderCount: 0
+; ALL-NEXT:    SectionHeaderEntrySize: 40
+; ALL-NEXT:    SectionHeaderCount: 4
+; ALL-NEXT:    StringTableSectionIndex: 1
+; ALL-NEXT:  }


        


More information about the llvm-commits mailing list