From 7feee8f380a8d811a6a343682fa1d2baa121a6d9 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Mon, 10 Dec 2007 17:43:13 +0000 Subject: Fix PR1836: in the interpreter, read and write apints using the minimum possible number of bytes. For little endian targets run on little endian machines, apints are stored in memory from LSB to MSB as before. For big endian targets on big endian machines they are stored from MSB to LSB which wasn't always the case before (if the target and host endianness doesn't match values are stored according to the host's endianness). Doing this requires knowing the endianness of the host, which is determined when configuring - thanks go to Anton for this. Only having access to little endian machines I was unable to properly test the big endian part, which is also the most complicated... git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44796 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Config/config.h.in | 6 ++++++ include/llvm/Target/TargetData.h | 11 +++++++++++ 2 files changed, 17 insertions(+) (limited to 'include/llvm') diff --git a/include/llvm/Config/config.h.in b/include/llvm/Config/config.h.in index 32e154a..64858f2 100644 --- a/include/llvm/Config/config.h.in +++ b/include/llvm/Config/config.h.in @@ -494,6 +494,9 @@ /* Installation prefix directory */ #undef LLVM_PREFIX +/* Define if this target is little endian */ +#undef LSB_FIRST + /* Define if the OS needs help to load dependent libraries for dlopen(). */ #undef LTDL_DLOPEN_DEPLIBS @@ -511,6 +514,9 @@ /* Define to the system default library search path. */ #undef LTDL_SYSSEARCHPATH +/* Define if this target is big endian */ +#undef MSB_FIRST + /* Define if /dev/zero should be used when mapping RWX memory, or undefine if its not necessary */ #undef NEED_DEV_ZERO_FOR_MMAP diff --git a/include/llvm/Target/TargetData.h b/include/llvm/Target/TargetData.h index 3136a38..fd52ef3 100644 --- a/include/llvm/Target/TargetData.h +++ b/include/llvm/Target/TargetData.h @@ -23,6 +23,7 @@ #include "llvm/Pass.h" #include "llvm/Support/DataTypes.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/Config/config.h" #include namespace llvm { @@ -142,6 +143,16 @@ public: bool isLittleEndian() const { return LittleEndian; } bool isBigEndian() const { return !LittleEndian; } + /// Host endianness... + bool hostIsLittleEndian() const { +#ifdef LSB_FIRST + return true; +#else + return false; +#endif + } + bool hostIsBigEndian() const { return !hostIsLittleEndian(); } + /// getStringRepresentation - Return the string representation of the /// TargetData. This representation is in the same format accepted by the /// string constructor above. -- cgit v1.1