From da1b9868c8ea1e088fe80d394845baaee52560df Mon Sep 17 00:00:00 2001 From: Brian Cain Date: Tue, 16 Jul 2024 15:01:27 -0500 Subject: [PATCH] [lld] Add emulation support for hexagon (#98857) Summary: Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60251650 --- lld/ELF/Driver.cpp | 1 + lld/ELF/ScriptParser.cpp | 1 + lld/test/ELF/emulation-hexagon.s | 34 ++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 lld/test/ELF/emulation-hexagon.s diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 710f5a642a2272..40e095a133d953 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -202,6 +202,7 @@ static std::tuple parseEmulation(StringRef emul) { .Case("elf64_amdgpu", {ELF64LEKind, EM_AMDGPU}) .Case("elf64loongarch", {ELF64LEKind, EM_LOONGARCH}) .Case("elf64_s390", {ELF64BEKind, EM_S390}) + .Case("hexagonelf", {ELF32LEKind, EM_HEXAGON}) .Default({ELFNoneKind, EM_NONE}); if (ret.first == ELFNoneKind) diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 649e2d0e29c225..92ef9330141fca 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -452,6 +452,7 @@ static std::pair parseBfdName(StringRef s) { .Case("elf32-loongarch", {ELF32LEKind, EM_LOONGARCH}) .Case("elf64-loongarch", {ELF64LEKind, EM_LOONGARCH}) .Case("elf64-s390", {ELF64BEKind, EM_S390}) + .Cases("elf32-hexagon", "elf32-littlehexagon", {ELF32LEKind, EM_HEXAGON}) .Default({ELFNoneKind, EM_NONE}); } diff --git a/lld/test/ELF/emulation-hexagon.s b/lld/test/ELF/emulation-hexagon.s new file mode 100644 index 00000000000000..a8a02d4c428b5c --- /dev/null +++ b/lld/test/ELF/emulation-hexagon.s @@ -0,0 +1,34 @@ +# REQUIRES: hexagon +# RUN: llvm-mc -filetype=obj -triple=hexagon %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-readelf --file-headers %t | FileCheck --check-prefix=CHECK %s +# RUN: ld.lld -m hexagonelf %t.o -o %t +# RUN: llvm-readelf --file-headers %t | FileCheck --check-prefix=CHECK %s + +# RUN: echo 'OUTPUT_FORMAT(elf32-littlehexagon)' > %t.script +# RUN: ld.lld %t.script %t.o -o %t +# RUN: llvm-readelf --file-headers %t | FileCheck --check-prefix=CHECK %s + +# RUN: echo 'OUTPUT_FORMAT(elf32-hexagon)' > %t.script +# RUN: ld.lld %t.script %t.o -o %t +# RUN: llvm-readelf --file-headers %t | FileCheck --check-prefix=CHECK %s + +# CHECK: ELF Header: +# CHECK-NEXT: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 +# CHECK-NEXT: Class: ELF32 +# CHECK-NEXT: Data: 2's complement, little endian +# CHECK-NEXT: Version: 1 (current) +# CHECK-NEXT: OS/ABI: UNIX - System V +# CHECK-NEXT: ABI Version: 0 +# CHECK-NEXT: Type: EXEC (Executable file) +# CHECK-NEXT: Machine: Qualcomm Hexagon +# CHECK-NEXT: Version: 0x1 +# CHECK-NEXT: Entry point address: 0x200B4 +# CHECK-NEXT: Start of program headers: 52 (bytes into file) +# CHECK-NEXT: Start of section headers: +# CHECK-NEXT: Flags: 0x60 +# CHECK-NEXT: Size of this header: 52 (bytes) +# CHECK-NEXT: Size of program headers: 32 (bytes) + +.globl _start +_start: