forked from cea-sec/miasm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request cea-sec#1153 from aguinet/hack/div
Include missing functions from llvm's compiler-rt into Jitllvm
- Loading branch information
Showing
11 changed files
with
793 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* ===-- divti3.c - Implement __divti3 -------------------------------------=== | ||
* | ||
* The LLVM Compiler Infrastructure | ||
* | ||
* This file is dual licensed under the MIT and the University of Illinois Open | ||
* Source Licenses. See LICENSE.TXT for details. | ||
* | ||
* ===----------------------------------------------------------------------=== | ||
* | ||
* This file implements __divti3 for the compiler_rt library. | ||
* | ||
* ===----------------------------------------------------------------------=== | ||
*/ | ||
|
||
#if __x86_64 | ||
|
||
#include "int_lib.h" | ||
#include "export.h" | ||
|
||
tu_int __udivmodti4(tu_int a, tu_int b, tu_int* rem); | ||
|
||
/* Returns: a / b */ | ||
|
||
ti_int | ||
__divti3(ti_int a, ti_int b) | ||
{ | ||
const int bits_in_tword_m1 = (int)(sizeof(ti_int) * CHAR_BIT) - 1; | ||
ti_int s_a = a >> bits_in_tword_m1; /* s_a = a < 0 ? -1 : 0 */ | ||
ti_int s_b = b >> bits_in_tword_m1; /* s_b = b < 0 ? -1 : 0 */ | ||
a = (a ^ s_a) - s_a; /* negate if s_a == -1 */ | ||
b = (b ^ s_b) - s_b; /* negate if s_b == -1 */ | ||
s_a ^= s_b; /* sign of quotient */ | ||
return (__udivmodti4(a, b, (tu_int*)0) ^ s_a) - s_a; /* negate if s_a == -1 */ | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#ifndef MIASM_RT_EXPORT_H | ||
#define MIASM_RT_EXPORT_H | ||
|
||
#ifdef _WIN32 | ||
#define _MIASM_EXPORT __declspec(dllexport) | ||
#else | ||
#define _MIASM_EXPORT __attribute__((visibility("default"))) | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
//===-- int_endianness.h - configuration header for compiler-rt -----------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file is a configuration header for compiler-rt. | ||
// This file is not part of the interface of this library. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef INT_ENDIANNESS_H | ||
#define INT_ENDIANNESS_H | ||
|
||
#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ | ||
defined(__ORDER_LITTLE_ENDIAN__) | ||
|
||
// Clang and GCC provide built-in endianness definitions. | ||
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ | ||
#define _YUGA_LITTLE_ENDIAN 0 | ||
#define _YUGA_BIG_ENDIAN 1 | ||
#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ | ||
#define _YUGA_LITTLE_ENDIAN 1 | ||
#define _YUGA_BIG_ENDIAN 0 | ||
#endif // __BYTE_ORDER__ | ||
|
||
#else // Compilers other than Clang or GCC. | ||
|
||
#if defined(__SVR4) && defined(__sun) | ||
#include <sys/byteorder.h> | ||
|
||
#if defined(_BIG_ENDIAN) | ||
#define _YUGA_LITTLE_ENDIAN 0 | ||
#define _YUGA_BIG_ENDIAN 1 | ||
#elif defined(_LITTLE_ENDIAN) | ||
#define _YUGA_LITTLE_ENDIAN 1 | ||
#define _YUGA_BIG_ENDIAN 0 | ||
#else // !_LITTLE_ENDIAN | ||
#error "unknown endianness" | ||
#endif // !_LITTLE_ENDIAN | ||
|
||
#endif // Solaris and AuroraUX. | ||
|
||
// .. | ||
|
||
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ | ||
defined(__minix) | ||
#include <sys/endian.h> | ||
|
||
#if _BYTE_ORDER == _BIG_ENDIAN | ||
#define _YUGA_LITTLE_ENDIAN 0 | ||
#define _YUGA_BIG_ENDIAN 1 | ||
#elif _BYTE_ORDER == _LITTLE_ENDIAN | ||
#define _YUGA_LITTLE_ENDIAN 1 | ||
#define _YUGA_BIG_ENDIAN 0 | ||
#endif // _BYTE_ORDER | ||
|
||
#endif // *BSD | ||
|
||
#if defined(__OpenBSD__) | ||
#include <machine/endian.h> | ||
|
||
#if _BYTE_ORDER == _BIG_ENDIAN | ||
#define _YUGA_LITTLE_ENDIAN 0 | ||
#define _YUGA_BIG_ENDIAN 1 | ||
#elif _BYTE_ORDER == _LITTLE_ENDIAN | ||
#define _YUGA_LITTLE_ENDIAN 1 | ||
#define _YUGA_BIG_ENDIAN 0 | ||
#endif // _BYTE_ORDER | ||
|
||
#endif // OpenBSD | ||
|
||
// .. | ||
|
||
// Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the | ||
// compiler (at least with GCC) | ||
#if defined(__APPLE__) || defined(__ellcc__) | ||
|
||
#ifdef __BIG_ENDIAN__ | ||
#if __BIG_ENDIAN__ | ||
#define _YUGA_LITTLE_ENDIAN 0 | ||
#define _YUGA_BIG_ENDIAN 1 | ||
#endif | ||
#endif // __BIG_ENDIAN__ | ||
|
||
#ifdef __LITTLE_ENDIAN__ | ||
#if __LITTLE_ENDIAN__ | ||
#define _YUGA_LITTLE_ENDIAN 1 | ||
#define _YUGA_BIG_ENDIAN 0 | ||
#endif | ||
#endif // __LITTLE_ENDIAN__ | ||
|
||
#endif // Mac OSX | ||
|
||
// .. | ||
|
||
#if defined(_WIN32) | ||
|
||
#define _YUGA_LITTLE_ENDIAN 1 | ||
#define _YUGA_BIG_ENDIAN 0 | ||
|
||
#endif // Windows | ||
|
||
#endif // Clang or GCC. | ||
|
||
// . | ||
|
||
#if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN) | ||
#error Unable to determine endian | ||
#endif // Check we found an endianness correctly. | ||
|
||
#endif // INT_ENDIANNESS_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
//===-- int_lib.h - configuration header for compiler-rt -----------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file is a configuration header for compiler-rt. | ||
// This file is not part of the interface of this library. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef INT_LIB_H | ||
#define INT_LIB_H | ||
|
||
// Assumption: Signed integral is 2's complement. | ||
// Assumption: Right shift of signed negative is arithmetic shift. | ||
// Assumption: Endianness is little or big (not mixed). | ||
|
||
// ABI macro definitions | ||
|
||
#if __ARM_EABI__ | ||
#ifdef COMPILER_RT_ARMHF_TARGET | ||
#define COMPILER_RT_ABI | ||
#else | ||
#define COMPILER_RT_ABI __attribute__((__pcs__("aapcs"))) | ||
#endif | ||
#else | ||
#define COMPILER_RT_ABI | ||
#endif | ||
|
||
#define AEABI_RTABI __attribute__((__pcs__("aapcs"))) | ||
|
||
#if defined(_MSC_VER) && !defined(__clang__) | ||
#define ALWAYS_INLINE __forceinline | ||
#define NOINLINE __declspec(noinline) | ||
#define NORETURN __declspec(noreturn) | ||
#define UNUSED | ||
#else | ||
#define ALWAYS_INLINE __attribute__((always_inline)) | ||
#define NOINLINE __attribute__((noinline)) | ||
#define NORETURN __attribute__((noreturn)) | ||
#define UNUSED __attribute__((unused)) | ||
#endif | ||
|
||
#define STR(a) #a | ||
#define XSTR(a) STR(a) | ||
#define SYMBOL_NAME(name) XSTR(__USER_LABEL_PREFIX__) #name | ||
|
||
#if defined(__ELF__) || defined(__MINGW32__) || defined(__wasm__) | ||
#define COMPILER_RT_ALIAS(name, aliasname) \ | ||
COMPILER_RT_ABI __typeof(name) aliasname __attribute__((__alias__(#name))); | ||
#elif defined(__APPLE__) | ||
#if defined(VISIBILITY_HIDDEN) | ||
#define COMPILER_RT_ALIAS_VISIBILITY(name) \ | ||
__asm__(".private_extern " SYMBOL_NAME(name)); | ||
#else | ||
#define COMPILER_RT_ALIAS_VISIBILITY(name) | ||
#endif | ||
#define COMPILER_RT_ALIAS(name, aliasname) \ | ||
__asm__(".globl " SYMBOL_NAME(aliasname)); \ | ||
COMPILER_RT_ALIAS_VISIBILITY(aliasname) \ | ||
__asm__(SYMBOL_NAME(aliasname) " = " SYMBOL_NAME(name)); \ | ||
COMPILER_RT_ABI __typeof(name) aliasname; | ||
#elif defined(_WIN32) | ||
#define COMPILER_RT_ALIAS(name, aliasname) | ||
#else | ||
#error Unsupported target | ||
#endif | ||
|
||
#if defined(__NetBSD__) && (defined(_KERNEL) || defined(_STANDALONE)) | ||
// | ||
// Kernel and boot environment can't use normal headers, | ||
// so use the equivalent system headers. | ||
// | ||
#include <machine/limits.h> | ||
#include <sys/stdint.h> | ||
#include <sys/types.h> | ||
#else | ||
// Include the standard compiler builtin headers we use functionality from. | ||
#include <float.h> | ||
#include <limits.h> | ||
#include <stdbool.h> | ||
#include <stdint.h> | ||
#endif | ||
|
||
// Include the commonly used internal type definitions. | ||
#include "int_types.h" | ||
|
||
// Include internal utility function declarations. | ||
#include "int_util.h" | ||
|
||
COMPILER_RT_ABI si_int __paritysi2(si_int a); | ||
COMPILER_RT_ABI si_int __paritydi2(di_int a); | ||
|
||
COMPILER_RT_ABI di_int __divdi3(di_int a, di_int b); | ||
COMPILER_RT_ABI si_int __divsi3(si_int a, si_int b); | ||
COMPILER_RT_ABI su_int __udivsi3(su_int n, su_int d); | ||
|
||
COMPILER_RT_ABI su_int __udivmodsi4(su_int a, su_int b, su_int *rem); | ||
COMPILER_RT_ABI du_int __udivmoddi4(du_int a, du_int b, du_int *rem); | ||
#ifdef CRT_HAS_128BIT | ||
COMPILER_RT_ABI si_int __clzti2(ti_int a); | ||
COMPILER_RT_ABI tu_int __udivmodti4(tu_int a, tu_int b, tu_int *rem); | ||
#endif | ||
|
||
// Definitions for builtins unavailable on MSVC | ||
#if defined(_MSC_VER) && !defined(__clang__) | ||
#include <intrin.h> | ||
|
||
uint32_t __inline __builtin_ctz(uint32_t value) { | ||
unsigned long trailing_zero = 0; | ||
if (_BitScanForward(&trailing_zero, value)) | ||
return trailing_zero; | ||
return 32; | ||
} | ||
|
||
uint32_t __inline __builtin_clz(uint32_t value) { | ||
unsigned long leading_zero = 0; | ||
if (_BitScanReverse(&leading_zero, value)) | ||
return 31 - leading_zero; | ||
return 32; | ||
} | ||
|
||
#if defined(_M_ARM) || defined(_M_X64) | ||
uint32_t __inline __builtin_clzll(uint64_t value) { | ||
unsigned long leading_zero = 0; | ||
if (_BitScanReverse64(&leading_zero, value)) | ||
return 63 - leading_zero; | ||
return 64; | ||
} | ||
#else | ||
uint32_t __inline __builtin_clzll(uint64_t value) { | ||
if (value == 0) | ||
return 64; | ||
uint32_t msh = (uint32_t)(value >> 32); | ||
uint32_t lsh = (uint32_t)(value & 0xFFFFFFFF); | ||
if (msh != 0) | ||
return __builtin_clz(msh); | ||
return 32 + __builtin_clz(lsh); | ||
} | ||
#endif | ||
|
||
#define __builtin_clzl __builtin_clzll | ||
#endif // defined(_MSC_VER) && !defined(__clang__) | ||
|
||
#endif // INT_LIB_H |
Oops, something went wrong.