18c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer//===- llvm/unittest/Support/DataExtractorTest.cpp - DataExtractor tests --===// 28c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// 38c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// The LLVM Compiler Infrastructure 48c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// 58c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// This file is distributed under the University of Illinois Open Source 68c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// License. See LICENSE.TXT for details. 78c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// 88c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer//===----------------------------------------------------------------------===// 98c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 108c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer#include "gtest/gtest.h" 118c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer#include "llvm/Support/DataExtractor.h" 128c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramerusing namespace llvm; 138c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 148c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramernamespace { 158c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 168c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramerconst char numberData[] = "\x80\x90\xFF\xFF\x80\x00\x00\x00"; 178c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramerconst char stringData[] = "hellohello\0hello"; 188c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramerconst char leb128data[] = "\xA6\x49"; 1946aed739555d2f821691b323d46de7ad7a75d5e7Benjamin Kramerconst char bigleb128data[] = "\xAA\xA9\xFF\xAA\xFF\xAA\xFF\x4A"; 208c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 218c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin KramerTEST(DataExtractorTest, OffsetOverflow) { 228c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer DataExtractor DE(StringRef(numberData, sizeof(numberData)-1), false, 8); 238c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_FALSE(DE.isValidOffsetForDataOfSize(-2U, 5)); 248c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer} 258c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 268c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin KramerTEST(DataExtractorTest, UnsignedNumbers) { 278c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer DataExtractor DE(StringRef(numberData, sizeof(numberData)-1), false, 8); 288c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint32_t offset = 0; 298c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 308c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0x80U, DE.getU8(&offset)); 318c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(1U, offset); 328c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 338c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0x8090U, DE.getU16(&offset)); 348c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(2U, offset); 358c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 368c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0x8090FFFFU, DE.getU32(&offset)); 378c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(4U, offset); 388c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 394bffb62289614d355bdb160822eff7213ec9bb62NAKAMURA Takumi EXPECT_EQ(0x8090FFFF80000000ULL, DE.getU64(&offset)); 408c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(8U, offset); 418c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 424bffb62289614d355bdb160822eff7213ec9bb62NAKAMURA Takumi EXPECT_EQ(0x8090FFFF80000000ULL, DE.getAddress(&offset)); 438c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(8U, offset); 448c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 458c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 468c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint32_t data[2]; 478c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(data, DE.getU32(&offset, data, 2)); 488c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0x8090FFFFU, data[0]); 498c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0x80000000U, data[1]); 508c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(8U, offset); 518c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 528c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 538c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer // Now for little endian. 548c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer DE = DataExtractor(StringRef(numberData, sizeof(numberData)-1), true, 4); 558c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0x9080U, DE.getU16(&offset)); 568c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(2U, offset); 578c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 588c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0xFFFF9080U, DE.getU32(&offset)); 598c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(4U, offset); 608c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 614bffb62289614d355bdb160822eff7213ec9bb62NAKAMURA Takumi EXPECT_EQ(0x80FFFF9080ULL, DE.getU64(&offset)); 628c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(8U, offset); 638c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 648c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0xFFFF9080U, DE.getAddress(&offset)); 658c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(4U, offset); 668c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 678c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 688c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(data, DE.getU32(&offset, data, 2)); 698c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0xFFFF9080U, data[0]); 708c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(0x80U, data[1]); 718c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(8U, offset); 728c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer} 738c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 748c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin KramerTEST(DataExtractorTest, SignedNumbers) { 758c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer DataExtractor DE(StringRef(numberData, sizeof(numberData)-1), false, 8); 768c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint32_t offset = 0; 778c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 788c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(-128, DE.getSigned(&offset, 1)); 798c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(1U, offset); 808c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 818c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(-32624, DE.getSigned(&offset, 2)); 828c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(2U, offset); 838c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 848c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(-2137980929, DE.getSigned(&offset, 4)); 858c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(4U, offset); 868c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 878c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(-9182558167379214336LL, DE.getSigned(&offset, 8)); 888c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(8U, offset); 898c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer} 908c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 918c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin KramerTEST(DataExtractorTest, Strings) { 928c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer DataExtractor DE(StringRef(stringData, sizeof(stringData)-1), false, 8); 938c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint32_t offset = 0; 948c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 958c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(stringData, DE.getCStr(&offset)); 968c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(11U, offset); 97c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_EQ(nullptr, DE.getCStr(&offset)); 988c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(11U, offset); 998c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer} 1008c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 1018c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin KramerTEST(DataExtractorTest, LEB128) { 1028c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer DataExtractor DE(StringRef(leb128data, sizeof(leb128data)-1), false, 8); 1038c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint32_t offset = 0; 1048c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 1058c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(9382ULL, DE.getULEB128(&offset)); 1068c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(2U, offset); 1078c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer offset = 0; 1088c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(-7002LL, DE.getSLEB128(&offset)); 1098c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer EXPECT_EQ(2U, offset); 11046aed739555d2f821691b323d46de7ad7a75d5e7Benjamin Kramer 11146aed739555d2f821691b323d46de7ad7a75d5e7Benjamin Kramer DataExtractor BDE(StringRef(bigleb128data, sizeof(bigleb128data)-1), false,8); 11246aed739555d2f821691b323d46de7ad7a75d5e7Benjamin Kramer offset = 0; 11346aed739555d2f821691b323d46de7ad7a75d5e7Benjamin Kramer EXPECT_EQ(42218325750568106ULL, BDE.getULEB128(&offset)); 11446aed739555d2f821691b323d46de7ad7a75d5e7Benjamin Kramer EXPECT_EQ(8U, offset); 11546aed739555d2f821691b323d46de7ad7a75d5e7Benjamin Kramer offset = 0; 11646aed739555d2f821691b323d46de7ad7a75d5e7Benjamin Kramer EXPECT_EQ(-29839268287359830LL, BDE.getSLEB128(&offset)); 11746aed739555d2f821691b323d46de7ad7a75d5e7Benjamin Kramer EXPECT_EQ(8U, offset); 1188c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer} 1198c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 1208c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer} 121