CI updates

This commit is contained in:
Markus F.X.J. Oberhumer 2025-07-05 22:23:13 +02:00
parent ef01a73e8f
commit 915bfbd82e
6 changed files with 59 additions and 47 deletions

View File

@ -220,7 +220,7 @@ jobs:
# NOTE: macos does not have "env -C"; only with brew coreutils # NOTE: macos does not have "env -C"; only with brew coreutils
- { os: macos-13, gcc: gcc-12, gxx: g++-12, testsuite: true } - { os: macos-13, gcc: gcc-12, gxx: g++-12, testsuite: true }
- { os: macos-14, gcc: gcc-13, gxx: g++-13, testsuite: true } - { os: macos-14, gcc: gcc-13, gxx: g++-13, testsuite: true }
# { os: macos-15, gcc: gcc-13, gxx: g++-13, testsuite: true } # { os: macos-15, gcc: gcc-14, gxx: g++-14, testsuite: true }
- { os: macos-15, testsuite: true } - { os: macos-15, testsuite: true }
name: ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} name: ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
@ -525,6 +525,7 @@ jobs:
include: include:
# only build a few selected targets => more targets are tested in the Weekly CI # only build a few selected targets => more targets are tested in the Weekly CI
- { zig_target: aarch64-linux-musl, qemu: qemu-aarch64 } - { zig_target: aarch64-linux-musl, qemu: qemu-aarch64 }
- { zig_target: aarch64-linux-musl, qemu: qemu-aarch64, zig_pic: -fPIE }
- { zig_target: aarch64-macos.11.0-none } - { zig_target: aarch64-macos.11.0-none }
- { zig_target: aarch64-windows-gnu } - { zig_target: aarch64-windows-gnu }
- { zig_target: arm-linux-musleabihf, qemu: qemu-arm } - { zig_target: arm-linux-musleabihf, qemu: qemu-arm }
@ -543,7 +544,9 @@ jobs:
# { zig_target: mips-linux-musleabi-mips32r6, zig_flags: -march=mips32r6, qemu: qemu-mips } # { zig_target: mips-linux-musleabi-mips32r6, zig_flags: -march=mips32r6, qemu: qemu-mips }
- { zig_target: powerpc-linux-musleabihf, qemu: qemu-ppc } - { zig_target: powerpc-linux-musleabihf, qemu: qemu-ppc }
- { zig_target: powerpc64-linux-musl, qemu: qemu-ppc64 } - { zig_target: powerpc64-linux-musl, qemu: qemu-ppc64 }
- { zig_target: powerpc64-linux-musl, qemu: qemu-ppc64, zig_pic: -fPIE }
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le } - { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le }
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le, zig_pic: -fPIE }
- { zig_target: x86_64-linux-gnu.2.3.4, qemu: qemu-x86_64 } # can use QEMU because of gcompat - { zig_target: x86_64-linux-gnu.2.3.4, qemu: qemu-x86_64 } # can use QEMU because of gcompat
- { zig_target: x86_64-linux-gnu.2.17, qemu: qemu-x86_64 } # can use QEMU because of gcompat - { zig_target: x86_64-linux-gnu.2.17, qemu: qemu-x86_64 } # can use QEMU because of gcompat
- { zig_target: x86_64-linux-musl, qemu: qemu-x86_64 } - { zig_target: x86_64-linux-musl, qemu: qemu-x86_64 }

2
.gitignore vendored
View File

@ -1,6 +1,8 @@
/.cache* /.cache*
/.idea/
/.hg* /.hg*
/.vscode* /.vscode*
/.zed/
/CMakeCache* /CMakeCache*
/CMakeFiles* /CMakeFiles*
/CTest* /CTest*

View File

@ -69,7 +69,9 @@ upx_cmake_include_hook(2_init)
# Disallow in-source build. Note that you will still have to manually # Disallow in-source build. Note that you will still have to manually
# clean up a few files if you accidentally try an in-source build. # clean up a few files if you accidentally try an in-source build.
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
upx_disallow_in_source_build() upx_disallow_in_source_build()
endif()
# global settings # global settings
if(${CMAKE_VERSION} VERSION_GREATER "3.14.99" AND NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) if(${CMAKE_VERSION} VERSION_GREATER "3.14.99" AND NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)

View File

@ -32,8 +32,9 @@
// NE - Native Endianness (aka Host Endianness aka CPU Endianness) // NE - Native Endianness (aka Host Endianness aka CPU Endianness)
// TE - Target Endianness (not used here, see various packers) // TE - Target Endianness (not used here, see various packers)
static_assert(std::is_same_v<upx_uint32_t, unsigned>);
static_assert(std::is_same_v<byte, unsigned char>); static_assert(std::is_same_v<byte, unsigned char>);
static_assert(std::is_same_v<upx_int32_t, int>);
static_assert(std::is_same_v<upx_uint32_t, unsigned>);
#if defined(upx_is_constant_evaluated) #if defined(upx_is_constant_evaluated)
#define bele_constexpr constexpr #define bele_constexpr constexpr
@ -411,7 +412,7 @@ inline bele_constexpr void set_le14_5(XE32 *p, unsigned v) noexcept {
// get signed values // get signed values
**************************************************************************/ **************************************************************************/
forceinline constexpr int sign_extend(unsigned v, unsigned bits) noexcept { forceinline constexpr int sign_extend32(unsigned v, unsigned bits) noexcept {
#if (ACC_ARCH_M68K) // no barrel shifter #if (ACC_ARCH_M68K) // no barrel shifter
const unsigned sign_bit = 1u << (bits - 1); const unsigned sign_bit = 1u << (bits - 1);
return ACC_ICAST(int, (v & (sign_bit - 1)) - (v & sign_bit)); return ACC_ICAST(int, (v & (sign_bit - 1)) - (v & sign_bit));
@ -420,7 +421,7 @@ forceinline constexpr int sign_extend(unsigned v, unsigned bits) noexcept {
#endif #endif
} }
forceinline constexpr upx_int64_t sign_extend(upx_uint64_t v, unsigned bits) noexcept { forceinline constexpr upx_int64_t sign_extend64(upx_uint64_t v, unsigned bits) noexcept {
#if (ACC_ARCH_M68K) // no barrel shifter #if (ACC_ARCH_M68K) // no barrel shifter
const upx_uint64_t sign_bit = upx_uint64_t(1) << (bits - 1); const upx_uint64_t sign_bit = upx_uint64_t(1) << (bits - 1);
return ACC_ICAST(upx_int64_t, (v & (sign_bit - 1)) - (v & sign_bit)); return ACC_ICAST(upx_int64_t, (v & (sign_bit - 1)) - (v & sign_bit));
@ -432,49 +433,49 @@ forceinline constexpr upx_int64_t sign_extend(upx_uint64_t v, unsigned bits) noe
REQUIRE_XE16 REQUIRE_XE16
inline bele_constexpr int get_be16_signed(const XE16 *p) noexcept { inline bele_constexpr int get_be16_signed(const XE16 *p) noexcept {
unsigned v = get_be16(p); unsigned v = get_be16(p);
return sign_extend(v, 16); return sign_extend32(v, 16);
} }
REQUIRE_XE24 REQUIRE_XE24
inline bele_constexpr int get_be24_signed(const XE24 *p) noexcept { inline bele_constexpr int get_be24_signed(const XE24 *p) noexcept {
unsigned v = get_be24(p); unsigned v = get_be24(p);
return sign_extend(v, 24); return sign_extend32(v, 24);
} }
REQUIRE_XE32 REQUIRE_XE32
inline bele_constexpr int get_be32_signed(const XE32 *p) noexcept { inline bele_constexpr int get_be32_signed(const XE32 *p) noexcept {
unsigned v = get_be32(p); unsigned v = get_be32(p);
return sign_extend(v, 32); return sign_extend32(v, 32);
} }
REQUIRE_XE64 REQUIRE_XE64
inline bele_constexpr upx_int64_t get_be64_signed(const XE64 *p) noexcept { inline bele_constexpr upx_int64_t get_be64_signed(const XE64 *p) noexcept {
upx_uint64_t v = get_be64(p); upx_uint64_t v = get_be64(p);
return sign_extend(v, 64); return sign_extend64(v, 64);
} }
REQUIRE_XE16 REQUIRE_XE16
inline bele_constexpr int get_le16_signed(const XE16 *p) noexcept { inline bele_constexpr int get_le16_signed(const XE16 *p) noexcept {
unsigned v = get_le16(p); unsigned v = get_le16(p);
return sign_extend(v, 16); return sign_extend32(v, 16);
} }
REQUIRE_XE24 REQUIRE_XE24
inline bele_constexpr int get_le24_signed(const XE24 *p) noexcept { inline bele_constexpr int get_le24_signed(const XE24 *p) noexcept {
unsigned v = get_le24(p); unsigned v = get_le24(p);
return sign_extend(v, 24); return sign_extend32(v, 24);
} }
REQUIRE_XE32 REQUIRE_XE32
inline bele_constexpr int get_le32_signed(const XE32 *p) noexcept { inline bele_constexpr int get_le32_signed(const XE32 *p) noexcept {
unsigned v = get_le32(p); unsigned v = get_le32(p);
return sign_extend(v, 32); return sign_extend32(v, 32);
} }
REQUIRE_XE64 REQUIRE_XE64
inline bele_constexpr upx_int64_t get_le64_signed(const XE64 *p) noexcept { inline bele_constexpr upx_int64_t get_le64_signed(const XE64 *p) noexcept {
upx_uint64_t v = get_le64(p); upx_uint64_t v = get_le64(p);
return sign_extend(v, 64); return sign_extend64(v, 64);
} }
/************************************************************************* /*************************************************************************

View File

@ -283,18 +283,18 @@ static_assert(bswap32(bswap32(0xf4f3f2f1)) == no_bswap32(0xf4f3f2f1));
static_assert(bswap64(bswap64(0xf8f7f6f5f4f3f2f1ull)) == no_bswap64(0xf8f7f6f5f4f3f2f1ull)); static_assert(bswap64(bswap64(0xf8f7f6f5f4f3f2f1ull)) == no_bswap64(0xf8f7f6f5f4f3f2f1ull));
#endif #endif
static_assert(sign_extend(0u + 0, 8) == 0); static_assert(sign_extend32(0u + 0, 8) == 0);
static_assert(sign_extend(0u + 1, 8) == 1); static_assert(sign_extend32(0u + 1, 8) == 1);
static_assert(sign_extend(0u + 127, 8) == 127); static_assert(sign_extend32(0u + 127, 8) == 127);
static_assert(sign_extend(0u + 128, 8) == -128); static_assert(sign_extend32(0u + 128, 8) == -128);
static_assert(sign_extend(0u - 1, 8) == -1); static_assert(sign_extend32(0u - 1, 8) == -1);
static_assert(sign_extend(0u + 256, 8) == 0); static_assert(sign_extend32(0u + 256, 8) == 0);
static_assert(sign_extend(0u + 257, 8) == 1); static_assert(sign_extend32(0u + 257, 8) == 1);
static_assert(sign_extend(0u + 383, 8) == 127); static_assert(sign_extend32(0u + 383, 8) == 127);
static_assert(sign_extend(0u + 384, 8) == -128); static_assert(sign_extend32(0u + 384, 8) == -128);
static_assert(sign_extend(0u + 511, 8) == -1); static_assert(sign_extend32(0u + 511, 8) == -1);
static_assert(sign_extend(upx_uint64_t(0) + 0, 1) == 0); static_assert(sign_extend64(upx_uint64_t(0) + 0, 1) == 0);
static_assert(sign_extend(upx_uint64_t(0) + 1, 1) == -1); static_assert(sign_extend64(upx_uint64_t(0) + 1, 1) == -1);
static_assert(CHAR_BIT == 8); static_assert(CHAR_BIT == 8);
#if 0 // does not work with MSVC #if 0 // does not work with MSVC
@ -1212,29 +1212,33 @@ void upx_compiler_sanity_check(void) noexcept {
for (int i = 0; i < 256; i++) { for (int i = 0; i < 256; i++) {
{ {
const unsigned u = i; const unsigned u = i;
assert_noexcept(sign_extend(u, 1) == ((i & 1) ? -1 : 0)); assert_noexcept(sign_extend32(u, 1) == ((i & 1) ? -1 : 0));
assert_noexcept(sign_extend(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1))); assert_noexcept(sign_extend32(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1)));
assert_noexcept(sign_extend(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3))); assert_noexcept(sign_extend32(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3)));
assert_noexcept(sign_extend(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7))); assert_noexcept(sign_extend32(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7)));
assert_noexcept(sign_extend(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15))); assert_noexcept(sign_extend32(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15)));
assert_noexcept(sign_extend(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31))); assert_noexcept(sign_extend32(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31)));
assert_noexcept(sign_extend(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63))); assert_noexcept(sign_extend32(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63)));
assert_noexcept(sign_extend(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127))); assert_noexcept(sign_extend32(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127)));
assert_noexcept(sign_extend(u, 32) == i); assert_noexcept(sign_extend32(u, 9) == i);
assert_noexcept(sign_extend(0u - u, 32) == -i); assert_noexcept(sign_extend32(u, 32) == i);
assert_noexcept(sign_extend32(0u - u, 32) == -i);
} }
{ {
const upx_uint64_t u = i; const upx_uint64_t u = i;
assert_noexcept(sign_extend(u, 1) == ((i & 1) ? -1 : 0)); assert_noexcept(sign_extend64(u, 1) == ((i & 1) ? -1 : 0));
assert_noexcept(sign_extend(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1))); assert_noexcept(sign_extend64(u, 2) == ((i & 2) ? -2 + (i & 1) : (i & 1)));
assert_noexcept(sign_extend(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3))); assert_noexcept(sign_extend64(u, 3) == ((i & 4) ? -4 + (i & 3) : (i & 3)));
assert_noexcept(sign_extend(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7))); assert_noexcept(sign_extend64(u, 4) == ((i & 8) ? -8 + (i & 7) : (i & 7)));
assert_noexcept(sign_extend(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15))); assert_noexcept(sign_extend64(u, 5) == ((i & 16) ? -16 + (i & 15) : (i & 15)));
assert_noexcept(sign_extend(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31))); assert_noexcept(sign_extend64(u, 6) == ((i & 32) ? -32 + (i & 31) : (i & 31)));
assert_noexcept(sign_extend(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63))); assert_noexcept(sign_extend64(u, 7) == ((i & 64) ? -64 + (i & 63) : (i & 63)));
assert_noexcept(sign_extend(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127))); assert_noexcept(sign_extend64(u, 8) == ((i & 128) ? -128 + (i & 127) : (i & 127)));
assert_noexcept(sign_extend(u, 64) == i); assert_noexcept(sign_extend64(u, 9) == i);
assert_noexcept(sign_extend(upx_uint64_t(0) - u, 64) == -i); assert_noexcept(sign_extend64(u, 32) == i);
assert_noexcept(sign_extend64(upx_uint64_t(0) - u, 32) == -i);
assert_noexcept(sign_extend64(u, 64) == i);
assert_noexcept(sign_extend64(upx_uint64_t(0) - u, 64) == -i);
} }
} }
} }

View File

@ -115,8 +115,8 @@
#if !defined(__ORDER_BIG_ENDIAN__) || (__ORDER_BIG_ENDIAN__ + 0 != 4321) #if !defined(__ORDER_BIG_ENDIAN__) || (__ORDER_BIG_ENDIAN__ + 0 != 4321)
#error "unexpected __ORDER_BIG_ENDIAN__" #error "unexpected __ORDER_BIG_ENDIAN__"
#endif #endif
#if !defined(__ORDER_BIG_ENDIAN__) || (__ORDER_LITTLE_ENDIAN__ + 0 != 1234) #if !defined(__ORDER_LITTLE_ENDIAN__) || (__ORDER_LITTLE_ENDIAN__ + 0 != 1234)
#error "unexpected __ORDER_BIG_ENDIAN__" #error "unexpected __ORDER_LITTLE_ENDIAN__"
#endif #endif
#if (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__) #if (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__)
#error "unexpected __BYTE_ORDER__" #error "unexpected __BYTE_ORDER__"