public inbox for gentoo-portage-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-portage-dev] [PATCH] Recognize riscv ABIs (bug 686194)
@ 2019-05-18  6:15 Zac Medico
  0 siblings, 0 replies; only message in thread
From: Zac Medico @ 2019-05-18  6:15 UTC (permalink / raw
  To: gentoo-portage-dev; +Cc: Andreas K . Hüttel, Zac Medico

In order to avoid possibe misidentification, only the following ABIs
are recognized:

 * lp64
 * lp64d

The compute_multilib_category function correctly identifies both
riscv_lp64 and riscv_lp64d files found in the experimental stages
from https://dev.gentoo.org/~dilfridge/stages/rv64gc-multilib/.

Bug: https://bugs.gentoo.org/686194
Signed-off-by: Zac Medico <zmedico@gentoo.org>
---
 lib/portage/dep/soname/multilib_category.py | 51 +++++++++++++++++++--
 lib/portage/util/elf/constants.py           | 10 +++-
 2 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/lib/portage/dep/soname/multilib_category.py b/lib/portage/dep/soname/multilib_category.py
index 84e018fb0..37af98705 100644
--- a/lib/portage/dep/soname/multilib_category.py
+++ b/lib/portage/dep/soname/multilib_category.py
@@ -1,4 +1,4 @@
-# Copyright 2015 Gentoo Foundation
+# Copyright 2015-2019 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 #
 # Compute a multilib category, as discussed here:
@@ -14,6 +14,7 @@
 #	m68k_{32,64}
 #	mips_{eabi32,eabi64,n32,n64,o32,o64}
 #	ppc_{32,64}
+#	riscv_{lp64,lp64d}
 #	s390_{32,64}
 #	sh_{32,64}
 #	sparc_{32,64}
@@ -34,10 +35,21 @@
 from __future__ import unicode_literals
 
 from portage.util.elf.constants import (
-	EF_MIPS_ABI, EF_MIPS_ABI2, ELFCLASS32, ELFCLASS64,
+	EF_MIPS_ABI,
+	EF_MIPS_ABI2,
+	EF_RISCV_FLOAT_ABI_DOUBLE,
+	EF_RISCV_RVC,
+	ELFCLASS32,
+	ELFCLASS64,
 	EM_386, EM_68K, EM_AARCH64, EM_ALPHA, EM_ARM, EM_ALTERA_NIOS2,
 	EM_IA_64, EM_MIPS,
-	EM_PARISC, EM_PPC, EM_PPC64, EM_S390, EM_SH, EM_SPARC,
+	EM_PARISC,
+	EM_PPC,
+	EM_PPC64,
+	EM_RISCV,
+	EM_S390,
+	EM_SH,
+	EM_SPARC,
 	EM_SPARC32PLUS, EM_SPARCV9, EM_X86_64, E_MIPS_ABI_EABI32,
 	E_MIPS_ABI_EABI64, E_MIPS_ABI_O32, E_MIPS_ABI_O64)
 
@@ -53,6 +65,7 @@ _machine_prefix_map = {
 	EM_PARISC:          "hppa",
 	EM_PPC:             "ppc",
 	EM_PPC64:           "ppc",
+	EM_RISCV:           "riscv",
 	EM_S390:            "s390",
 	EM_SH:              "sh",
 	EM_SPARC:           "sparc",
@@ -82,6 +95,33 @@ def _compute_suffix_mips(elf_header):
 
 	return name
 
+
+def _compute_suffix_riscv(elf_header):
+	"""
+	Compute riscv multilib suffix. In order to avoid possible
+	misidentification, only the following ABIs are recognized:
+
+		* lp64
+		* lp64d
+	"""
+
+	name = None
+
+	if elf_header.ei_class == ELFCLASS64:
+		if elf_header.e_flags == EF_RISCV_RVC:
+			name = "lp64"
+		elif elf_header.e_flags == EF_RISCV_RVC | EF_RISCV_FLOAT_ABI_DOUBLE:
+			name = "lp64d"
+
+	return name
+
+
+_specialized_funcs = {
+	"mips": _compute_suffix_mips,
+	"riscv": _compute_suffix_riscv,
+}
+
+
 def compute_multilib_category(elf_header):
 	"""
 	Compute a multilib category from an ELF header.
@@ -96,10 +136,11 @@ def compute_multilib_category(elf_header):
 	if elf_header.e_machine is not None:
 
 		prefix = _machine_prefix_map.get(elf_header.e_machine)
+		specialized_func = _specialized_funcs.get(prefix)
 		suffix = None
 
-		if prefix == "mips":
-			suffix = _compute_suffix_mips(elf_header)
+		if specialized_func is not None:
+			suffix = specialized_func(elf_header)
 		elif elf_header.ei_class == ELFCLASS64:
 			suffix = "64"
 		elif elf_header.ei_class == ELFCLASS32:
diff --git a/lib/portage/util/elf/constants.py b/lib/portage/util/elf/constants.py
index 2704e85c3..9ab0ba8ce 100644
--- a/lib/portage/util/elf/constants.py
+++ b/lib/portage/util/elf/constants.py
@@ -1,4 +1,4 @@
-# Copyright 2015-2018 Gentoo Foundation
+# Copyright 2015-2019 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 #
 # These constants are available from elfutils:
@@ -35,6 +35,7 @@ EM_IA_64           = 50
 EM_X86_64          = 62
 EM_ALTERA_NIOS2    = 113
 EM_AARCH64         = 183
+EM_RISCV           = 243
 EM_ALPHA           = 0x9026
 
 E_ENTRY            = 24
@@ -44,3 +45,10 @@ E_MIPS_ABI_O32     = 0x00001000
 E_MIPS_ABI_O64     = 0x00002000
 E_MIPS_ABI_EABI32  = 0x00003000
 E_MIPS_ABI_EABI64  = 0x00004000
+
+EF_RISCV_RVC              = 0x0001
+EF_RISCV_FLOAT_ABI        = 0x0006
+EF_RISCV_FLOAT_ABI_SOFT   = 0x0000
+EF_RISCV_FLOAT_ABI_SINGLE = 0x0002
+EF_RISCV_FLOAT_ABI_DOUBLE = 0x0004
+EF_RISCV_FLOAT_ABI_QUAD   = 0x0006
-- 
2.21.0



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2019-05-18  6:19 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-05-18  6:15 [gentoo-portage-dev] [PATCH] Recognize riscv ABIs (bug 686194) Zac Medico

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox