From 8fb740dd3032543b833b141011aa2005c035d024 Mon Sep 17 00:00:00 2001 From: Pip Cet Date: Mon, 27 Mar 2017 11:39:50 +0100 Subject: [PATCH] Add minimal support for WebAssembly backend to the BFD library. include * elf/wasm32.h: New file to support wasm32 architecture. bfd * cpu-wasm32.c: New file to support wasm32 architecture. * elf32-wasm32.c: New file to support wasm32 architecture. * Makefile.am: Add wasm32 architecture. * archures.c: Likewise. * config.bfd: Likewise. * configure.ac: Likewise. * targets.c: Likewise. --- bfd/Makefile.am | 4 ++++ bfd/Makefile.in | 6 +++++ bfd/archures.c | 4 ++++ bfd/bfd-in2.h | 2 ++ bfd/config.bfd | 5 ++++ bfd/configure | 1 + bfd/configure.ac | 1 + bfd/cpu-wasm32.c | 36 +++++++++++++++++++++++++++++ bfd/elf32-wasm32.c | 52 ++++++++++++++++++++++++++++++++++++++++++ bfd/po/SRC-POTFILES.in | 2 ++ bfd/targets.c | 3 +++ include/ChangeLog | 4 ++++ include/elf/wasm32.h | 28 +++++++++++++++++++++++ 13 files changed, 148 insertions(+) create mode 100644 bfd/cpu-wasm32.c create mode 100644 bfd/elf32-wasm32.c create mode 100644 include/elf/wasm32.h diff --git a/bfd/Makefile.am b/bfd/Makefile.am index 0b0226306f..6fa8302020 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -169,6 +169,7 @@ ALL_MACHINES = \ cpu-vax.lo \ cpu-visium.lo \ cpu-w65.lo \ + cpu-wasm32.lo \ cpu-we32k.lo \ cpu-xc16x.lo \ cpu-xgate.lo \ @@ -257,6 +258,7 @@ ALL_MACHINES_CFILES = \ cpu-v850_rh850.c \ cpu-vax.c \ cpu-visium.c \ + cpu-wasm32.c \ cpu-w65.c \ cpu-we32k.c \ cpu-xc16x.c \ @@ -383,6 +385,7 @@ BFD32_BACKENDS = \ elf32-v850.lo \ elf32-vax.lo \ elf32-visium.lo \ + elf32-wasm32.lo \ elf32-xc16x.lo \ elf32-xgate.lo \ elf32-xstormy16.lo \ @@ -576,6 +579,7 @@ BFD32_BACKENDS_CFILES = \ elf32-v850.c \ elf32-vax.c \ elf32-visium.c \ + elf32-wasm32.c \ elf32-xc16x.c \ elf32-xgate.c \ elf32-xstormy16.c \ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 096c7ef043..76916b7d10 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -502,6 +502,7 @@ ALL_MACHINES = \ cpu-vax.lo \ cpu-visium.lo \ cpu-w65.lo \ + cpu-wasm32.lo \ cpu-we32k.lo \ cpu-xc16x.lo \ cpu-xgate.lo \ @@ -590,6 +591,7 @@ ALL_MACHINES_CFILES = \ cpu-v850_rh850.c \ cpu-vax.c \ cpu-visium.c \ + cpu-wasm32.c \ cpu-w65.c \ cpu-we32k.c \ cpu-xc16x.c \ @@ -717,6 +719,7 @@ BFD32_BACKENDS = \ elf32-v850.lo \ elf32-vax.lo \ elf32-visium.lo \ + elf32-wasm32.lo \ elf32-xc16x.lo \ elf32-xgate.lo \ elf32-xstormy16.lo \ @@ -910,6 +913,7 @@ BFD32_BACKENDS_CFILES = \ elf32-v850.c \ elf32-vax.c \ elf32-visium.c \ + elf32-wasm32.c \ elf32-xc16x.c \ elf32-xgate.c \ elf32-xstormy16.c \ @@ -1446,6 +1450,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-vax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-visium.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-w65.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-wasm32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-we32k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-xc16x.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-xgate.Plo@am__quote@ @@ -1534,6 +1539,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-v850.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-vax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-visium.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-wasm32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-xc16x.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-xgate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-xstormy16.Plo@am__quote@ diff --git a/bfd/archures.c b/bfd/archures.c index c909db012d..c6e7152057 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -528,6 +528,8 @@ DESCRIPTION .#define bfd_mach_nios2r2 2 . bfd_arch_visium, {* Visium *} .#define bfd_mach_visium 1 +. bfd_arch_wasm32, {* WebAssembly *} +.#define bfd_mach_wasm32 1 . bfd_arch_pru, {* PRU *} .#define bfd_mach_pru 0 . bfd_arch_last @@ -654,6 +656,7 @@ extern const bfd_arch_info_type bfd_v850_arch; extern const bfd_arch_info_type bfd_v850_rh850_arch; extern const bfd_arch_info_type bfd_vax_arch; extern const bfd_arch_info_type bfd_visium_arch; +extern const bfd_arch_info_type bfd_wasm32_arch; extern const bfd_arch_info_type bfd_w65_arch; extern const bfd_arch_info_type bfd_we32k_arch; extern const bfd_arch_info_type bfd_xstormy16_arch; @@ -746,6 +749,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] = &bfd_vax_arch, &bfd_visium_arch, &bfd_w65_arch, + &bfd_wasm32_arch, &bfd_we32k_arch, &bfd_xstormy16_arch, &bfd_xtensa_arch, diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 59403af698..adfcefdcdc 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -2372,6 +2372,8 @@ enum bfd_architecture #define bfd_mach_nios2r2 2 bfd_arch_visium, /* Visium */ #define bfd_mach_visium 1 + bfd_arch_wasm32, /* WebAssembly */ +#define bfd_mach_wasm32 1 bfd_arch_pru, /* PRU */ #define bfd_mach_pru 0 bfd_arch_last diff --git a/bfd/config.bfd b/bfd/config.bfd index 52db9a47f1..abcb7ae210 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -197,6 +197,7 @@ tilegx*) targ_archs=bfd_tilegx_arch ;; tilepro*) targ_archs=bfd_tilepro_arch ;; v850*) targ_archs="bfd_v850_arch bfd_v850_rh850_arch" ;; visium*) targ_archs=bfd_visium_arch ;; +wasm32) targ_archs=bfd_wasm32_arch ;; x86_64*) targ_archs=bfd_i386_arch ;; xtensa*) targ_archs=bfd_xtensa_arch ;; xgate) targ_archs=bfd_xgate_arch ;; @@ -1793,6 +1794,10 @@ case "${targ}" in targ_defvec=visium_elf32_vec ;; + wasm32-*-*) + targ_defvec=wasm32_elf32_vec + ;; + we32k-*-*) targ_defvec=we32k_coff_vec ;; diff --git a/bfd/configure b/bfd/configure index 83256d25df..57beb64b3b 100755 --- a/bfd/configure +++ b/bfd/configure @@ -14569,6 +14569,7 @@ do ft32_elf32_vec) tb="$tb elf32-ft32.lo elf32.lo $elf" ;; visium_elf32_vec) tb="$tb elf32-visium.lo elf32.lo $elf" ;; w65_coff_vec) tb="$tb coff-w65.lo reloc16.lo $coffgen" ;; + wasm32_elf32_vec) tb="$tb elf32-wasm32.lo elf32.lo $elf" ;; we32k_coff_vec) tb="$tb coff-we32k.lo $coffgen" ;; x86_64_coff_vec) tb="$tb coff-x86_64.lo $coff"; target_size=64 ;; x86_64_elf32_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-nacl.lo elf64.lo elf32.lo $elf"; target_size=64 ;; diff --git a/bfd/configure.ac b/bfd/configure.ac index ee0c537ea2..77961945d1 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -700,6 +700,7 @@ do ft32_elf32_vec) tb="$tb elf32-ft32.lo elf32.lo $elf" ;; visium_elf32_vec) tb="$tb elf32-visium.lo elf32.lo $elf" ;; w65_coff_vec) tb="$tb coff-w65.lo reloc16.lo $coffgen" ;; + wasm32_elf32_vec) tb="$tb elf32-wasm32.lo elf32.lo $elf" ;; we32k_coff_vec) tb="$tb coff-we32k.lo $coffgen" ;; x86_64_coff_vec) tb="$tb coff-x86_64.lo $coff"; target_size=64 ;; x86_64_elf32_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-nacl.lo elf64.lo elf32.lo $elf"; target_size=64 ;; diff --git a/bfd/cpu-wasm32.c b/bfd/cpu-wasm32.c new file mode 100644 index 0000000000..19d4cb9270 --- /dev/null +++ b/bfd/cpu-wasm32.c @@ -0,0 +1,36 @@ +/* BFD support for the WebAssembly target + Copyright (C) 2017 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "sysdep.h" +#include "bfd.h" +#include "libbfd.h" +#include "libiberty.h" + +#define N(number, print, default, next) \ +{ 32, 32, 8, bfd_arch_wasm32, number, "wasm32", "wasm32", 4, default, bfd_default_compatible, \ + bfd_default_scan, bfd_arch_default_fill, next } + +static const bfd_arch_info_type arch_info_struct[] = +{ + N (bfd_mach_wasm32, "wasm32", TRUE, NULL) +}; + +const bfd_arch_info_type bfd_wasm32_arch = + N (bfd_mach_wasm32, "wasm32", TRUE, & arch_info_struct[0]); diff --git a/bfd/elf32-wasm32.c b/bfd/elf32-wasm32.c new file mode 100644 index 0000000000..9b3827248f --- /dev/null +++ b/bfd/elf32-wasm32.c @@ -0,0 +1,52 @@ +/* 32-bit ELF for the WebAssembly target + Copyright (C) 2017 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#include "sysdep.h" +#include "bfd.h" +#include "libbfd.h" +#include "elf-bfd.h" +#include "bfd_stdint.h" +#include "elf/wasm32.h" + +#define ELF_ARCH bfd_arch_wasm32 +#define ELF_TARGET_ID EM_WEBASSEMBLY +#define ELF_MACHINE_CODE EM_WEBASSEMBLY +/* FIXME we don't have paged executables, see: + https://github.com/pipcet/binutils-gdb/issues/4 */ +#define ELF_MAXPAGESIZE 4096 + +#define TARGET_LITTLE_SYM wasm32_elf32_vec +#define TARGET_LITTLE_NAME "elf32-wasm32" + +#define elf_backend_can_gc_sections 1 +#define elf_backend_rela_normal 1 +/* For testing. */ +#define elf_backend_want_dynrelro 1 + +#define bfd_elf32_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup +#define bfd_elf32_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup + +#define ELF_DYNAMIC_INTERPRETER "/sbin/elf-dynamic-interpreter.so" + +#define elf_backend_want_got_plt 1 +#define elf_backend_plt_readonly 1 +#define elf_backend_got_header_size 0 + +#include "elf32-target.h" diff --git a/bfd/po/SRC-POTFILES.in b/bfd/po/SRC-POTFILES.in index 7ecdb0a11f..81f42ea3f9 100644 --- a/bfd/po/SRC-POTFILES.in +++ b/bfd/po/SRC-POTFILES.in @@ -141,6 +141,7 @@ cpu-v850_rh850.c cpu-vax.c cpu-visium.c cpu-w65.c +cpu-wasm32.c cpu-we32k.c cpu-xc16x.c cpu-xgate.c @@ -231,6 +232,7 @@ elf32-tilepro.c elf32-v850.c elf32-vax.c elf32-visium.c +elf32-wasm32.c elf32-xc16x.c elf32-xgate.c elf32-xstormy16.c diff --git a/bfd/targets.c b/bfd/targets.c index 1a7c6b87d6..74559ac4c6 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -893,6 +893,7 @@ extern const bfd_target vax_aout_nbsd_vec; extern const bfd_target vax_elf32_vec; extern const bfd_target visium_elf32_vec; extern const bfd_target w65_coff_vec; +extern const bfd_target wasm32_elf32_vec; extern const bfd_target we32k_coff_vec; extern const bfd_target x86_64_coff_vec; extern const bfd_target x86_64_elf32_vec; @@ -1421,6 +1422,8 @@ static const bfd_target * const _bfd_target_vector[] = &w65_coff_vec, + &wasm32_elf32_vec, + &we32k_coff_vec, #ifdef BFD64 diff --git a/include/ChangeLog b/include/ChangeLog index 48f2afcff5..daaad17d73 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2017-03-27 Pip Cet + + * elf/wasm32.h: New file to support wasm32 architecture. + 2017-03-27 Rinat Zelig * opcode/arc.h (insn_class_t): Add ULTRAIP and MISC class. diff --git a/include/elf/wasm32.h b/include/elf/wasm32.h new file mode 100644 index 0000000000..38e6c2e950 --- /dev/null +++ b/include/elf/wasm32.h @@ -0,0 +1,28 @@ +/* ELF support for BFD for the WebAssembly target + Copyright (C) 2017 Free Software Foundation, Inc. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_WASM32_H +#define _ELF_WASM32_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ + +START_RELOC_NUMBERS (elf_wasm32_reloc_type) +END_RELOC_NUMBERS (R_WASM32_max = 1) + +#endif /* _ELF_WASM32_H */