cpptrace/bundled/libdwarf/libdwarf_private.h
2023-09-01 13:00:45 -04:00

114 lines
3.8 KiB
C
Vendored

/* Copyright 2022, David Anderson
This trivial set of defines is hereby placed in the public domain
for all to use without restriction.
*/
/* To enable printing with printf regardless of the
actual underlying data type, we define the DW_PR_xxx macros.
To ensure uses of DW_PR_DUx or DW_PR_DSx look the way you want
ensure the DW_PR_XZEROS define as you want it.
*/
#ifndef LIBDWARF_PRIVATE_H
#define LIBDWARF_PRIVATE_H
#define DW_PR_XZEROS "08"
#ifdef _WIN32
#define DW_PR_DUx "I64x"
#define DW_PR_DSx "I64x"
#define DW_PR_DUu "I64u"
#define DW_PR_DSd "I64d"
#else
#define DW_PR_DUx "llx"
#define DW_PR_DSx "llx"
#define DW_PR_DUu "llu"
#define DW_PR_DSd "lld"
#endif /* DW_PR defines */
#ifdef _MSC_VER /* Macro to select VS compiler */
#include <windows.h>
typedef SSIZE_T ssize_t;
#ifdef _WIN64
typedef long long off_t;
#else
typedef long off_t;
#endif
#endif /* _MSC_VER */
#ifndef TRUE
#define TRUE 1
#endif /* TRUE */
#ifndef FALSE
#define FALSE 0
#endif /* FALSE */
#define DWARF_HALF_SIZE 2
#define SIZEOFT16 2
#define SIZEOFT32 4
#define SIZEOFT64 8
#ifdef WORDS_BIGENDIAN
#define ASNAR(func,t,s) \
do { \
unsigned tbyte = sizeof(t) - sizeof(s); \
(t) = 0; \
(func)(((char *)&(t))+tbyte ,&(s)[0],sizeof(s)); \
} while (0)
#else /* LITTLE ENDIAN */
#define ASNAR(func,t,s) \
do { \
(t) = 0; \
(func)(&(t),&(s)[0],sizeof(s)); \
} while (0)
#endif /* end LITTLE- BIG-ENDIAN */
/* The following actually assumes (as used here)
that t is 8 bytes (integer) while s is
also 8 bytes (Dwarf_Sig8 struct).
Just slightly different from the ASNAR generally
used in libdwarf. Unusable in
libdwarfp because of _dwarf_error() here. */
#ifdef WORDS_BIGENDIAN
#define ASNARL(t,s,l) \
do { \
unsigned tbyte = sizeof(t) - (l); \
if (sizeof(t) < (l)) { \
_dwarf_error(dbg,error,DW_DLE_XU_HASH_INDEX_ERROR); \
return DW_DLV_ERROR; \
} \
(t) = 0; \
dbg->de_copy_word(((char *)&(t))+tbyte ,&(s)[0],(l));\
} while (0)
#else /* LITTLE ENDIAN */
#define ASNARL(t,s,l) \
do { \
(t) = 0; \
if (sizeof(t) < (l)) { \
_dwarf_error(dbg,error,DW_DLE_XU_HASH_INDEX_ERROR); \
return DW_DLV_ERROR; \
} \
dbg->de_copy_word(&(t),&(s)[0],(l)); \
} while (0)
#endif /* end LITTLE- BIG-ENDIAN */
#ifdef WORDS_BIGENDIAN
#define SIGN_EXTEND(dest, length) \
do { \
if (*(Dwarf_Sbyte *)((char *)&(dest) + \
sizeof(dest) - (length)) < 0) { \
memcpy((char *)&(dest), \
"\xff\xff\xff\xff\xff\xff\xff\xff", \
sizeof(dest) - (length)); \
} \
} while (0)
#else /* LITTLE ENDIAN */
#define SIGN_EXTEND(dest, length) \
do { \
if (*(Dwarf_Sbyte *)((char *)&(dest)+ ((length)-1)) < 0) { \
memcpy((char *)&(dest)+(length), \
"\xff\xff\xff\xff\xff\xff\xff\xff", \
sizeof(dest) - (length)); \
} \
} while (0)
#endif /* LITTLE ENDIAN */
#endif /* LIBDWARF_PRIVATE_H */