mirror of https://github.com/Nonannet/copapy.git
selection of default architecture changed from system to current process (new function detect_process_arch added)
This commit is contained in:
parent
971c7c2007
commit
9f211dfda3
|
|
@ -1,7 +1,6 @@
|
||||||
import pkgutil
|
import pkgutil
|
||||||
from typing import Any, TypeVar, overload, TypeAlias, Generic, cast
|
from typing import Any, TypeVar, overload, TypeAlias, Generic, cast
|
||||||
from ._stencils import stencil_database
|
from ._stencils import stencil_database, detect_process_arch
|
||||||
import platform
|
|
||||||
import copapy as cp
|
import copapy as cp
|
||||||
|
|
||||||
NumLike: TypeAlias = 'variable[int] | variable[float] | variable[bool] | int | float | bool'
|
NumLike: TypeAlias = 'variable[int] | variable[float] | variable[bool] | int | float | bool'
|
||||||
|
|
@ -12,17 +11,25 @@ unibool: TypeAlias = 'variable[bool] | bool'
|
||||||
TCPNum = TypeVar("TCPNum", bound='variable[Any]')
|
TCPNum = TypeVar("TCPNum", bound='variable[Any]')
|
||||||
TNum = TypeVar("TNum", int, bool, float)
|
TNum = TypeVar("TNum", int, bool, float)
|
||||||
|
|
||||||
|
stencil_cache: dict[tuple[str, str], stencil_database] = {}
|
||||||
|
|
||||||
|
|
||||||
def get_var_name(var: Any, scope: dict[str, Any] = globals()) -> list[str]:
|
def get_var_name(var: Any, scope: dict[str, Any] = globals()) -> list[str]:
|
||||||
return [name for name, value in scope.items() if value is var]
|
return [name for name, value in scope.items() if value is var]
|
||||||
|
|
||||||
|
|
||||||
def stencil_db_from_package(arch: str = 'native', optimization: str = 'O3') -> stencil_database:
|
def stencil_db_from_package(arch: str = 'native', optimization: str = 'O3') -> stencil_database:
|
||||||
|
global stencil_cache
|
||||||
|
ci = (arch, optimization)
|
||||||
|
if ci in stencil_cache:
|
||||||
|
return stencil_cache[ci] # return cached stencil db
|
||||||
if arch == 'native':
|
if arch == 'native':
|
||||||
arch = platform.machine()
|
arch = detect_process_arch()
|
||||||
stencil_data = pkgutil.get_data(__name__, f"obj/stencils_{arch}_{optimization}.o")
|
stencil_data = pkgutil.get_data(__name__, f"obj/stencils_{arch}_{optimization}.o")
|
||||||
assert stencil_data, f"stencils_{arch}_{optimization} not found"
|
assert stencil_data, f"stencils_{arch}_{optimization} not found"
|
||||||
return stencil_database(stencil_data)
|
sdb = stencil_database(stencil_data)
|
||||||
|
stencil_cache[ci] = sdb
|
||||||
|
return sdb
|
||||||
|
|
||||||
|
|
||||||
generic_sdb = stencil_db_from_package()
|
generic_sdb = stencil_db_from_package()
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ from dataclasses import dataclass
|
||||||
from pelfy import open_elf_file, elf_file, elf_symbol
|
from pelfy import open_elf_file, elf_file, elf_symbol
|
||||||
from typing import Generator, Literal, Iterable
|
from typing import Generator, Literal, Iterable
|
||||||
import pelfy
|
import pelfy
|
||||||
|
import struct
|
||||||
|
import platform
|
||||||
|
|
||||||
ByteOrder = Literal['little', 'big']
|
ByteOrder = Literal['little', 'big']
|
||||||
|
|
||||||
|
|
@ -37,6 +39,28 @@ class patch_entry:
|
||||||
patch_type: int
|
patch_type: int
|
||||||
|
|
||||||
|
|
||||||
|
def detect_process_arch() -> str:
|
||||||
|
bits = struct.calcsize("P") * 8
|
||||||
|
arch = platform.machine().lower()
|
||||||
|
|
||||||
|
if arch in ('amd64', 'x86_64'):
|
||||||
|
arch_family = 'x86_64' if bits == 64 else 'x86'
|
||||||
|
elif arch in ('i386', 'i686', 'x86'):
|
||||||
|
arch_family = 'x86'
|
||||||
|
elif arch in ('arm64', 'aarch64'):
|
||||||
|
arch_family = 'arm64'
|
||||||
|
elif 'arm' in arch:
|
||||||
|
arch_family = 'arm'
|
||||||
|
elif 'mips' in arch:
|
||||||
|
arch_family = 'mips64' if bits == 64 else 'mips'
|
||||||
|
elif 'riscv' in arch:
|
||||||
|
arch_family = 'riscv64' if bits == 64 else 'riscv'
|
||||||
|
else:
|
||||||
|
raise NotImplementedError(f"Platform {arch} with {bits} bits is not supported.")
|
||||||
|
|
||||||
|
return arch_family
|
||||||
|
|
||||||
|
|
||||||
def get_return_function_type(symbol: elf_symbol) -> str:
|
def get_return_function_type(symbol: elf_symbol) -> str:
|
||||||
if symbol.relocations:
|
if symbol.relocations:
|
||||||
result_func = symbol.relocations[-1].symbol
|
result_func = symbol.relocations[-1].symbol
|
||||||
|
|
@ -276,6 +300,10 @@ class stencil_database():
|
||||||
"""Returns the size of a section specified by index."""
|
"""Returns the size of a section specified by index."""
|
||||||
return self.elf.sections[index].fields['sh_size']
|
return self.elf.sections[index].fields['sh_size']
|
||||||
|
|
||||||
|
def get_section_alignment(self, index: int) -> int:
|
||||||
|
"""Returns the required alignment of a section specified by index."""
|
||||||
|
return self.elf.sections[index].fields['sh_addralign']
|
||||||
|
|
||||||
def get_section_data(self, index: int) -> bytes:
|
def get_section_data(self, index: int) -> bytes:
|
||||||
"""Returns the data of a section specified by index."""
|
"""Returns the data of a section specified by index."""
|
||||||
return self.elf.sections[index].data
|
return self.elf.sections[index].data
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue