aboutsummaryrefslogtreecommitdiff
path: root/Lex/HeaderMap.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-12-17 18:59:44 +0000
committerChris Lattner <sabre@nondot.org>2007-12-17 18:59:44 +0000
commitba8326517548d1d7773c4040aef4a4d91bb99df0 (patch)
tree8a8ef015ea60729c4b1fd2e6e610ac16f06348bf /Lex/HeaderMap.cpp
parent98751314c4ba596860b574c3d3551030f01ff7d8 (diff)
simplify some code, using new scoped_ptr support. Fix a bug in the
cross-endianness case, where we checked the version in the wrong endianness. Amusingly, the GCC logic that detects mixed endianness hmaps and rejects them is dead for this very reason. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45113 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Lex/HeaderMap.cpp')
-rw-r--r--Lex/HeaderMap.cpp21
1 files changed, 10 insertions, 11 deletions
diff --git a/Lex/HeaderMap.cpp b/Lex/HeaderMap.cpp
index c698aba066..abd1f9ee0c 100644
--- a/Lex/HeaderMap.cpp
+++ b/Lex/HeaderMap.cpp
@@ -20,7 +20,8 @@
using namespace clang;
enum {
- HeaderMagicNumber = ('h' << 24) | ('m' << 16) | ('a' << 8) | 'p'
+ HeaderMagicNumber = ('h' << 24) | ('m' << 16) | ('a' << 8) | 'p',
+ HeaderVersion = 1
};
struct HMapHeader {
@@ -53,23 +54,21 @@ const HeaderMap *HeaderMap::Create(const FileEntry *FE) {
// We know the file is at least as big as the header, check it now.
const HMapHeader *Header = reinterpret_cast<const HMapHeader*>(FileStart);
- // Sniff it to see if it's a headermap.
- if (Header->Version != 1 || Header->Reserved != 0)
- return 0;
-
- // Check the magic number.
+ // Sniff it to see if it's a headermap by checking the magic number and
+ // version.
bool NeedsByteSwap;
- if (Header->Magic == HeaderMagicNumber)
+ if (Header->Magic == HeaderMagicNumber && Header->Version == HeaderVersion)
NeedsByteSwap = false;
- else if (Header->Magic == llvm::ByteSwap_32(HeaderMagicNumber))
+ else if (Header->Magic == llvm::ByteSwap_32(HeaderMagicNumber) &&
+ Header->Version == llvm::ByteSwap_16(HeaderVersion))
NeedsByteSwap = true; // Mixed endianness headermap.
else
return 0; // Not a header map.
+
+ if (Header->Reserved != 0) return 0;
// Okay, everything looks good, create the header map.
- HeaderMap *NewHM = new HeaderMap(FileBuffer.get(), NeedsByteSwap);
- FileBuffer.reset(); // Don't deallocate the buffer on return.
- return NewHM;
+ return new HeaderMap(FileBuffer.take(), NeedsByteSwap);
}
HeaderMap::~HeaderMap() {