commit: d3dd74e856564aac2414a3fca1fd859961ee162f Author: Mario Haustein <mario.haustein <AT> hrz <DOT> tu-chemnitz <DOT> de> AuthorDate: Sun Oct 8 11:54:40 2023 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Sun Feb 16 06:31:24 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=d3dd74e8
dev-util/unicorn: fix modern C issue Closes: https://bugs.gentoo.org/879685 Signed-off-by: Mario Haustein <mario.haustein <AT> hrz.tu-chemnitz.de> Signed-off-by: Sam James <sam <AT> gentoo.org> .../unicorn-2.0.1-old-style-declaration.patch | 45 ++++ .../files/unicorn-2.0.1-strict-prototypes.patch | 299 +++++++++++++++++++++ dev-util/unicorn/unicorn-2.0.1-r1.ebuild | 95 +++++++ 3 files changed, 439 insertions(+) diff --git a/dev-util/unicorn/files/unicorn-2.0.1-old-style-declaration.patch b/dev-util/unicorn/files/unicorn-2.0.1-old-style-declaration.patch new file mode 100644 index 000000000000..b63ffee0c096 --- /dev/null +++ b/dev-util/unicorn/files/unicorn-2.0.1-old-style-declaration.patch @@ -0,0 +1,45 @@ +commit 9a2583e96710ba49a8fd2a4ab87db7212c1e887c +Upstream: https://github.com/unicorn-engine/unicorn/pull/1886 +Author: Mario Haustein <[email protected]> +Date: Sun Oct 8 13:40:23 2023 +0200 + + fix deprecated storage-class declarations + +--- a/qemu/accel/tcg/cputlb.c ++++ b/qemu/accel/tcg/cputlb.c +@@ -1415,7 +1415,7 @@ load_memop(const void *haddr, MemOp op) + } + } + +-static uint64_t inline ++static inline uint64_t + load_helper(CPUArchState *env, target_ulong addr, TCGMemOpIdx oi, + uintptr_t retaddr, MemOp op, bool code_read, + FullLoadHelper *full_load) +@@ -1983,7 +1983,7 @@ uint64_t cpu_ldq_data(CPUArchState *env, target_ulong ptr) + * Store Helpers + */ + +-static void inline ++static inline void + store_memop(void *haddr, uint64_t val, MemOp op) + { + switch (op) { +@@ -2014,7 +2014,7 @@ store_memop(void *haddr, uint64_t val, MemOp op) + } + } + +-static void inline ++static inline void + store_helper(CPUArchState *env, target_ulong addr, uint64_t val, + TCGMemOpIdx oi, uintptr_t retaddr, MemOp op) + { +@@ -2343,7 +2343,7 @@ void helper_be_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val, + * Store Helpers for cpu_ldst.h + */ + +-static void inline ++static inline void + cpu_store_helper(CPUArchState *env, target_ulong addr, uint64_t val, + int mmu_idx, uintptr_t retaddr, MemOp op) // qq + { diff --git a/dev-util/unicorn/files/unicorn-2.0.1-strict-prototypes.patch b/dev-util/unicorn/files/unicorn-2.0.1-strict-prototypes.patch new file mode 100644 index 000000000000..d8ae8677d837 --- /dev/null +++ b/dev-util/unicorn/files/unicorn-2.0.1-strict-prototypes.patch @@ -0,0 +1,299 @@ +commit 5983b399d84c534ad2f19461dd38f69e70ea9cfb +Upstream: https://github.com/unicorn-engine/unicorn/pull/1886 +Author: Mario Haustein <[email protected]> +Date: Sun Oct 8 13:39:13 2023 +0200 + + use full prototypes for functions without parameters + +--- a/bindings/ruby/unicorn_gem/ext/unicorn.c ++++ b/bindings/ruby/unicorn_gem/ext/unicorn.c +@@ -31,7 +31,7 @@ VALUE SavedContext = Qnil; + VALUE Hook = Qnil; + + +-void Init_unicorn_engine() { ++void Init_unicorn_engine(void) { + rb_require("unicorn_engine/unicorn_const"); + UnicornModule = rb_define_module("UnicornEngine"); + UcError = rb_define_class_under(UnicornModule, "UcError", rb_eStandardError); +--- a/samples/mem_apis.c ++++ b/samples/mem_apis.c +@@ -193,7 +193,7 @@ static void do_nx_demo(bool cause_fault) + uc_close(uc); + } + +-static void nx_test() ++static void nx_test(void) + { + printf("NX demo - step 1: show that code runs to completion\n"); + do_nx_demo(false); +@@ -276,7 +276,7 @@ static void do_perms_demo(bool change_perms) + uc_close(uc); + } + +-static void perms_test() ++static void perms_test(void) + { + printf("Permissions demo - step 1: show that area is writeable\n"); + do_perms_demo(false); +@@ -355,7 +355,7 @@ static void do_unmap_demo(bool do_unmap) + uc_close(uc); + } + +-static void unmap_test() ++static void unmap_test(void) + { + printf("Unmap demo - step 1: show that area is writeable\n"); + do_unmap_demo(false); +--- a/samples/sample_arm.c ++++ b/samples/sample_arm.c +@@ -366,7 +366,7 @@ static void test_thumb_ite_internal(bool step, uint32_t *r2_out, + *r3_out = r3; + } + +-static void test_thumb_ite() ++static void test_thumb_ite(void) + { + uint32_t r2, r3; + uint32_t step_r2, step_r3; +@@ -390,7 +390,7 @@ static void test_thumb_ite() + } + } + +-static void test_read_sctlr() ++static void test_read_sctlr(void) + { + uc_engine *uc; + uc_err err; +--- a/samples/sample_arm64.c ++++ b/samples/sample_arm64.c +@@ -197,7 +197,7 @@ static void test_arm64eb(void) + uc_close(uc); + } + +-static void test_arm64_sctlr() ++static void test_arm64_sctlr(void) + { + uc_engine *uc; + uc_err err; +@@ -248,7 +248,7 @@ static uint32_t hook_mrs(uc_engine *uc, uc_arm64_reg reg, + return 1; + } + +-static void test_arm64_hook_mrs() ++static void test_arm64_hook_mrs(void) + { + uc_engine *uc; + uc_err err; +--- a/samples/sample_batch_reg.c ++++ b/samples/sample_batch_reg.c +@@ -49,7 +49,7 @@ void hook_code(uc_engine *uc, uint64_t addr, uint32_t size, void *user_data) + printf("HOOK_CODE: 0x%" PRIx64 ", 0x%x\n", addr, size); + } + +-int main() ++int main(void) + { + int i; + uc_hook sys_hook; +--- a/samples/sample_ctl.c ++++ b/samples/sample_ctl.c +@@ -79,7 +79,7 @@ static void trace_new_edge(uc_engine *uc, uc_tb *cur, uc_tb *prev, void *data) + prev->pc + prev->size - 1, cur->pc); + } + +-void test_uc_ctl_exits() ++void test_uc_ctl_exits(void) + { + uc_engine *uc; + uc_err err; +@@ -193,7 +193,7 @@ double time_emulation(uc_engine *uc, uint64_t start, uint64_t end) + return (t2 - t1) * 1000.0 / CLOCKS_PER_SEC; + } + +-static void test_uc_ctl_tb_cache() ++static void test_uc_ctl_tb_cache(void) + { + uc_engine *uc; + uc_err err; +--- a/samples/sample_x86.c ++++ b/samples/sample_x86.c +@@ -1240,7 +1240,7 @@ static void test_i386_invalid_mem_read_in_tb(void) + uc_close(uc); + } + +-static void test_i386_smc_xor() ++static void test_i386_smc_xor(void) + { + uc_engine *uc; + uc_err err; +@@ -1319,7 +1319,7 @@ static void mmio_write_callback(uc_engine *uc, uint64_t offset, unsigned size, + return; + } + +-static void test_i386_mmio() ++static void test_i386_mmio(void) + { + uc_engine *uc; + int r_ecx = 0xdeadbeef; +@@ -1392,7 +1392,7 @@ static bool test_i386_hook_mem_invalid_cb(uc_engine *uc, uc_mem_type type, + return true; + } + +-static void test_i386_hook_mem_invalid() ++static void test_i386_hook_mem_invalid(void) + { + uc_engine *uc; + uc_hook hook; +--- a/samples/sample_x86_32_gdt_and_seg_regs.c ++++ b/samples/sample_x86_32_gdt_and_seg_regs.c +@@ -163,7 +163,7 @@ static void hex_dump(unsigned char *ptr, unsigned int len) + } + */ + +-static void gdt_demo() ++static void gdt_demo(void) + { + uc_engine *uc; + uc_hook hook1, hook2; +--- a/tests/regress/00opcode_uc_crash.c ++++ b/tests/regress/00opcode_uc_crash.c +@@ -7,7 +7,7 @@ + #define X86_CODE32 "\x00" // add byte ptr ds:[eax],al + #define ADDRESS 0x1000000 + +-static void VM_exec() ++static void VM_exec(void) + { + uc_engine *uc; + uc_err err; +--- a/tests/regress/arm_enable_vfp.c ++++ b/tests/regress/arm_enable_vfp.c +@@ -6,7 +6,7 @@ + #define ADDRESS 0x1000 + #define ARM_VMOV "\xC0\xEF\x10\x00" // VMOV.I32 D16, #0 ; Vector Move + +-int main() ++int main(void) + { + uc_engine *uc; + uc_err err; +--- a/tests/regress/block_test.c ++++ b/tests/regress/block_test.c +@@ -24,7 +24,7 @@ void cb_hookblock(uc_engine *uc, uint64_t address, uint32_t size, void *user_dat + fprintf(stderr, "ok %d - basic block size is correct\n", count++); + } + +-int main() { ++int main(void) { + uc_engine *uc; + + fprintf(stderr, "# basic block callback test\n"); +--- a/tests/regress/eflags_noset.c ++++ b/tests/regress/eflags_noset.c +@@ -20,7 +20,7 @@ typedef uint64_t puint; + #define PRIX3264 PRIX64 + #endif + +-uint32_t realEflags() ++uint32_t realEflags(void) + { + puint val = 0; + +@@ -55,7 +55,7 @@ uint32_t realEflags() + return (uint32_t)val & 0xFFFFFFFF; + } + +-static void VM_exec() ++static void VM_exec(void) + { + #if defined(__i386__) || defined(__x86_64__) + uc_engine *uc; +--- a/tests/regress/eflags_nosync.c ++++ b/tests/regress/eflags_nosync.c +@@ -64,7 +64,7 @@ static bool hook_invalid_mem(uc_engine *uc, uc_mem_type type, uint64_t address, + } + } + +-static void VM_exec() ++static void VM_exec(void) + { + uc_engine *uc; + uc_err err; +--- a/tests/regress/emu_clear_errors.c ++++ b/tests/regress/emu_clear_errors.c +@@ -38,7 +38,7 @@ bool cb_hookunmapped(uc_engine *uc, uc_mem_type type, uint64_t address, uint32_t + "\x56" \ + "\xFF\x15\x20\x20\x00\x10" + +-int main() { ++int main(void) { + uc_engine *uc; + + uc_err err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); +--- a/tests/regress/hook_extrainvoke.c ++++ b/tests/regress/hook_extrainvoke.c +@@ -14,7 +14,7 @@ void hook_ins(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) + printf("hook called\n"); + } + +-static void VM_exec() ++static void VM_exec(void) + { + uc_engine *uc; + uc_err err; +--- a/tests/regress/map_crash.c ++++ b/tests/regress/map_crash.c +@@ -6,7 +6,7 @@ + #define UC_BUG_WRITE_SIZE 13000 + #define UC_BUG_WRITE_ADDR 0x1000 + +-int main() ++int main(void) + { + int size; + uint8_t *buf; +--- a/tests/regress/map_write.c ++++ b/tests/regress/map_write.c +@@ -6,7 +6,7 @@ + #define SIZE 1024*64 + #define OVERFLOW 1 + +-int main() ++int main(void) + { + uc_engine *uc = NULL; + uint8_t *buf = NULL, *buf2 = NULL; +--- a/tests/regress/mips_kseg0_1.c ++++ b/tests/regress/mips_kseg0_1.c +@@ -20,7 +20,7 @@ + + #define MIPS_CODE_EL "\x56\x34\x21\x34" // ori $at, $at, 0x3456; + +-int main() ++int main(void) + { + + uc_engine *uc; +--- a/tests/regress/sigill.c ++++ b/tests/regress/sigill.c +@@ -16,7 +16,7 @@ void _interrupt(uc_engine *uc, uint32_t intno, void *user_data) + } + } + +-int main() ++int main(void) + { + int size; + uint8_t *buf; +--- a/tests/regress/sigill2.c ++++ b/tests/regress/sigill2.c +@@ -6,7 +6,7 @@ + #define UC_BUG_WRITE_SIZE 128 + #define UC_BUG_WRITE_ADDR 0x2000 + +-int main() ++int main(void) + { + int size; + uc_engine *uc; diff --git a/dev-util/unicorn/unicorn-2.0.1-r1.ebuild b/dev-util/unicorn/unicorn-2.0.1-r1.ebuild new file mode 100644 index 000000000000..ce52142b1b04 --- /dev/null +++ b/dev-util/unicorn/unicorn-2.0.1-r1.ebuild @@ -0,0 +1,95 @@ +# Copyright 1999-2023 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +MY_PV=${PV/_/-} + +DISTUTILS_USE_PEP517=setuptools +DISTUTILS_OPTIONAL=1 +PYTHON_COMPAT=( python3_{10..12} ) +inherit cmake distutils-r1 + +DESCRIPTION="A lightweight multi-platform, multi-architecture CPU emulator framework" +HOMEPAGE="https://www.unicorn-engine.org" + +if [[ ${PV} == *9999 ]]; then + inherit git-r3 + EGIT_REPO_URI="https://github.com/unicorn-engine/unicorn" +else + SRC_URI="https://github.com/unicorn-engine/unicorn/archive/${MY_PV}.tar.gz -> ${P}.gh.tar.gz" + KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~riscv ~x86" +fi + +S="${WORKDIR}/${PN}-${MY_PV}" + +LICENSE="BSD-2 GPL-2 LGPL-2.1" +SLOT="0/2" +IUSE="python static-libs" +REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )" + +DEPEND="${PYTHON_DEPS} + dev-libs/glib:2" +RDEPEND="python? ( ${PYTHON_DEPS} )" +BDEPEND="virtual/pkgconfig + python? ( ${DISTUTILS_DEPS} )" + +UNICORN_TARGETS="x86 arm aarch64 riscv mips sparc m68k ppc s390x tricore" + +PATCHES=( + "${FILESDIR}/${P}-strict-prototypes.patch" + "${FILESDIR}/${P}-old-style-declaration.patch" +) + +# suppress warning wrt 'implicit function declaration' in config logs due to +# auto-detection of some libc functions (bug #906919) +QA_CONFIG_IMPL_DECL_SKIP=( + clock_adjtime + malloc_trim +) + +wrap_python() { + if use python; then + # src_prepare + # Do not compile C extensions + export LIBUNICORN_PATH=1 + + pushd bindings/python >/dev/null || die + distutils-r1_${1} "$@" + popd >/dev/null || die + fi +} + +src_prepare() { + # Build from sources + rm -r bindings/python/prebuilt || die "failed to remove prebuilt files" + + cmake_src_prepare + wrap_python ${FUNCNAME} +} + +src_configure(){ + local mycmakeargs=( + -DUNICORN_ARCH="${UNICORN_TARGETS// /;}" + ) + + cmake_src_configure + + wrap_python ${FUNCNAME} +} + +src_compile() { + cmake_src_compile + + wrap_python ${FUNCNAME} +} + +src_install() { + cmake_src_install + + if ! use static-libs; then + find "${ED}" -type f \( -name "*.a" -o -name "*.la" \) -delete || die + fi + + wrap_python ${FUNCNAME} +}
