binutils-gdb/bfd/cpu-amdgcn.c
Simon Marchi 978602e83f bfd: add AMDGCN architecture
Add support for the AMDGCN architecture to BFD.

This is the bare minimum to get

  $ ./configure --target=amdgcn-hsa-amdhsa --disable-gas
  $ make all-binutils

working later in this series.

The specific AMDGCN models added here are a bit arbitrary, based on
what we intend to initially support in GDB.  This list will need to be
updated in the future anyway.  The complete up-to-date list of existing
AMDGPU models can be found here:

  https://llvm.org/docs/AMDGPUUsage.html#processors

The ELF format for this architecture is documented here:

  https://llvm.org/docs/AMDGPUUsage.html#elf-code-object

The flags for the "HSA" OS ABI are properly versioned and documented on
that page.  But the NONE, PAL and MESA3D OS ABIs are not well documented
nor versioned.  Taking a peek at the LLVM source code, we see that they
encode their flags the same way as HSA v3.  For example, for PAL:

  c8b614cd74/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp (L601)

So at least, we know that all AMDGPU objects (of which AMDGCN objects
are a subset of) at the time of writing encode the specific GPU model in
the EF_AMDGPU_MACH field of e_flags.

bfd/ChangeLog:

	* Makefile.am (ALL_MACHINES, ALL_MACHINES_CFILES):
	Add cpu-amdgcn.c.
	(BFD64_BACKENDS): Add elf64-amdgcn.lo.
	(BFD64_BACKENDS_CFILES): Add elf64-amdgcn.c.
	* Makefile.in: Re-generate.
	* cpu-amdgcn.c: New.
	* elf64-amdgcn.c: New.
	* archures.c (bfd_architecture): Add bfd_arch_amdgcn and related
	mach defines.
	(bfd_amdgcn_arch): New.
	(bfd_archures_list): Add bfd_amdgcn_arch.
	* bfd-in2.h: Re-generate.
	* config.bfd: Handle amdgcn* target.
	* configure.ac: Handle amdgcn_elf64_le_vec.
	* configure: Re-generate.
	* elf-bfd.h (elf_target_id): Add AMDGCN_ELF_DATA.
	* targets.c (amdgcn_elf64_le_vec): New.
	(_bfd_target_vector): Add amdgcn_elf64_le_vec.

include/ChangeLog:

	* elf/amdgpu.h: New.
	* elf/common.h (ELFOSABI_AMDGPU_HSA): Add.

Change-Id: I969f7b14960797e88891c308749a6e341eece5b2
2022-03-16 09:00:27 -04:00

60 lines
2.6 KiB
C

/* BFD support for the AMDGCN GPU architecture.
Copyright (C) 2019-2022 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "sysdep.h"
#include "bfd.h"
#include "libbfd.h"
#define N(MACHINE, PRINTABLE_NAME, DEFAULT, NEXT) \
{ \
32, /* 32 bits in a word */ \
64, /* 64 bits in an address */ \
8, /* 8 bits in a byte */ \
bfd_arch_amdgcn, \
MACHINE, \
"amdgcn", \
PRINTABLE_NAME, \
3, /* section align power */ \
DEFAULT, \
bfd_default_compatible, \
bfd_default_scan, \
bfd_arch_default_fill, \
NEXT, \
0 \
}
#define NN(index) (&arch_info_struct[index])
static const bfd_arch_info_type arch_info_struct[] =
{
N (bfd_mach_amdgcn_gfx904, "amdgcn:gfx904", false, NN (1)),
N (bfd_mach_amdgcn_gfx906, "amdgcn:gfx906", false, NN (2)),
N (bfd_mach_amdgcn_gfx908, "amdgcn:gfx908", false, NN (3)),
N (bfd_mach_amdgcn_gfx90a, "amdgcn:gfx90a", false, NN (4)),
N (bfd_mach_amdgcn_gfx1010, "amdgcn:gfx1010", false, NN (5)),
N (bfd_mach_amdgcn_gfx1011, "amdgcn:gfx1011", false, NN (6)),
N (bfd_mach_amdgcn_gfx1012, "amdgcn:gfx1012", false, NN (7)),
N (bfd_mach_amdgcn_gfx1030, "amdgcn:gfx1030", false, NN (8)),
N (bfd_mach_amdgcn_gfx1031, "amdgcn:gfx1031", false, NN (9)),
N (bfd_mach_amdgcn_gfx1032, "amdgcn:gfx1032", false, NULL)
};
const bfd_arch_info_type bfd_amdgcn_arch =
N (bfd_mach_amdgcn_gfx900, "amdgcn:gfx900", true, NN (0));