brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.5 KiB · 61ec78f Raw
399 lines · cpp
1//===- ELFTest.cpp - Tests for ELF.cpp ------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/Object/ELF.h"10#include "llvm/Object/ELFObjectFile.h"11#include "llvm/ObjectYAML/yaml2obj.h"12#include "llvm/Support/Error.h"13#include "llvm/Support/YAMLTraits.h"14#include "llvm/Testing/Support/Error.h"15#include "gtest/gtest.h"16 17using namespace llvm;18using namespace llvm::object;19using namespace llvm::ELF;20 21TEST(ELFTest, getELFRelocationTypeNameForVE) {22  EXPECT_EQ("R_VE_NONE", getELFRelocationTypeName(EM_VE, R_VE_NONE));23  EXPECT_EQ("R_VE_REFLONG", getELFRelocationTypeName(EM_VE, R_VE_REFLONG));24  EXPECT_EQ("R_VE_REFQUAD", getELFRelocationTypeName(EM_VE, R_VE_REFQUAD));25  EXPECT_EQ("R_VE_SREL32", getELFRelocationTypeName(EM_VE, R_VE_SREL32));26  EXPECT_EQ("R_VE_HI32", getELFRelocationTypeName(EM_VE, R_VE_HI32));27  EXPECT_EQ("R_VE_LO32", getELFRelocationTypeName(EM_VE, R_VE_LO32));28  EXPECT_EQ("R_VE_PC_HI32", getELFRelocationTypeName(EM_VE, R_VE_PC_HI32));29  EXPECT_EQ("R_VE_PC_LO32", getELFRelocationTypeName(EM_VE, R_VE_PC_LO32));30  EXPECT_EQ("R_VE_GOT32", getELFRelocationTypeName(EM_VE, R_VE_GOT32));31  EXPECT_EQ("R_VE_GOT_HI32", getELFRelocationTypeName(EM_VE, R_VE_GOT_HI32));32  EXPECT_EQ("R_VE_GOT_LO32", getELFRelocationTypeName(EM_VE, R_VE_GOT_LO32));33  EXPECT_EQ("R_VE_GOTOFF32", getELFRelocationTypeName(EM_VE, R_VE_GOTOFF32));34  EXPECT_EQ("R_VE_GOTOFF_HI32",35            getELFRelocationTypeName(EM_VE, R_VE_GOTOFF_HI32));36  EXPECT_EQ("R_VE_GOTOFF_LO32",37            getELFRelocationTypeName(EM_VE, R_VE_GOTOFF_LO32));38  EXPECT_EQ("R_VE_PLT32", getELFRelocationTypeName(EM_VE, R_VE_PLT32));39  EXPECT_EQ("R_VE_PLT_HI32", getELFRelocationTypeName(EM_VE, R_VE_PLT_HI32));40  EXPECT_EQ("R_VE_PLT_LO32", getELFRelocationTypeName(EM_VE, R_VE_PLT_LO32));41  EXPECT_EQ("R_VE_RELATIVE", getELFRelocationTypeName(EM_VE, R_VE_RELATIVE));42  EXPECT_EQ("R_VE_GLOB_DAT", getELFRelocationTypeName(EM_VE, R_VE_GLOB_DAT));43  EXPECT_EQ("R_VE_JUMP_SLOT", getELFRelocationTypeName(EM_VE, R_VE_JUMP_SLOT));44  EXPECT_EQ("R_VE_COPY", getELFRelocationTypeName(EM_VE, R_VE_COPY));45  EXPECT_EQ("R_VE_DTPMOD64", getELFRelocationTypeName(EM_VE, R_VE_DTPMOD64));46  EXPECT_EQ("R_VE_DTPOFF64", getELFRelocationTypeName(EM_VE, R_VE_DTPOFF64));47  EXPECT_EQ("R_VE_TLS_GD_HI32",48            getELFRelocationTypeName(EM_VE, R_VE_TLS_GD_HI32));49  EXPECT_EQ("R_VE_TLS_GD_LO32",50            getELFRelocationTypeName(EM_VE, R_VE_TLS_GD_LO32));51  EXPECT_EQ("R_VE_TPOFF_HI32",52            getELFRelocationTypeName(EM_VE, R_VE_TPOFF_HI32));53  EXPECT_EQ("R_VE_TPOFF_LO32",54            getELFRelocationTypeName(EM_VE, R_VE_TPOFF_LO32));55  EXPECT_EQ("R_VE_CALL_HI32", getELFRelocationTypeName(EM_VE, R_VE_CALL_HI32));56  EXPECT_EQ("R_VE_CALL_LO32", getELFRelocationTypeName(EM_VE, R_VE_CALL_LO32));57}58 59TEST(ELFTest, getELFRelocationTypeNameForLoongArch) {60  EXPECT_EQ("R_LARCH_NONE",61            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_NONE));62  EXPECT_EQ("R_LARCH_32", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_32));63  EXPECT_EQ("R_LARCH_64", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_64));64  EXPECT_EQ("R_LARCH_RELATIVE",65            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_RELATIVE));66  EXPECT_EQ("R_LARCH_COPY",67            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_COPY));68  EXPECT_EQ("R_LARCH_JUMP_SLOT",69            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_JUMP_SLOT));70  EXPECT_EQ("R_LARCH_TLS_DTPMOD32",71            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD32));72  EXPECT_EQ("R_LARCH_TLS_DTPMOD64",73            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD64));74  EXPECT_EQ("R_LARCH_TLS_DTPREL32",75            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL32));76  EXPECT_EQ("R_LARCH_TLS_DTPREL64",77            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL64));78  EXPECT_EQ("R_LARCH_TLS_TPREL32",79            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL32));80  EXPECT_EQ("R_LARCH_TLS_TPREL64",81            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL64));82  EXPECT_EQ("R_LARCH_IRELATIVE",83            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_IRELATIVE));84 85  EXPECT_EQ("R_LARCH_MARK_LA",86            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_LA));87  EXPECT_EQ("R_LARCH_MARK_PCREL",88            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_PCREL));89  EXPECT_EQ("R_LARCH_SOP_PUSH_PCREL",90            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PCREL));91  EXPECT_EQ("R_LARCH_SOP_PUSH_ABSOLUTE",92            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_ABSOLUTE));93  EXPECT_EQ("R_LARCH_SOP_PUSH_DUP",94            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_DUP));95  EXPECT_EQ("R_LARCH_SOP_PUSH_GPREL",96            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_GPREL));97  EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_TPREL",98            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_TPREL));99  EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GOT",100            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GOT));101  EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GD",102            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GD));103  EXPECT_EQ("R_LARCH_SOP_PUSH_PLT_PCREL",104            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PLT_PCREL));105  EXPECT_EQ("R_LARCH_SOP_ASSERT",106            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ASSERT));107  EXPECT_EQ("R_LARCH_SOP_NOT",108            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_NOT));109  EXPECT_EQ("R_LARCH_SOP_SUB",110            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SUB));111  EXPECT_EQ("R_LARCH_SOP_SL",112            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SL));113  EXPECT_EQ("R_LARCH_SOP_SR",114            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SR));115  EXPECT_EQ("R_LARCH_SOP_ADD",116            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ADD));117  EXPECT_EQ("R_LARCH_SOP_AND",118            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_AND));119  EXPECT_EQ("R_LARCH_SOP_IF_ELSE",120            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_IF_ELSE));121  EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_5",122            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_5));123  EXPECT_EQ("R_LARCH_SOP_POP_32_U_10_12",124            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U_10_12));125  EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_12",126            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_12));127  EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_16",128            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16));129  EXPECT_EQ(130      "R_LARCH_SOP_POP_32_S_10_16_S2",131      getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16_S2));132  EXPECT_EQ("R_LARCH_SOP_POP_32_S_5_20",133            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_5_20));134  EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_5_10_16_S2",135            getELFRelocationTypeName(EM_LOONGARCH,136                                     R_LARCH_SOP_POP_32_S_0_5_10_16_S2));137  EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_10_10_16_S2",138            getELFRelocationTypeName(EM_LOONGARCH,139                                     R_LARCH_SOP_POP_32_S_0_10_10_16_S2));140  EXPECT_EQ("R_LARCH_SOP_POP_32_U",141            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U));142  EXPECT_EQ("R_LARCH_ADD8",143            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD8));144  EXPECT_EQ("R_LARCH_ADD16",145            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD16));146  EXPECT_EQ("R_LARCH_ADD24",147            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD24));148  EXPECT_EQ("R_LARCH_ADD32",149            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD32));150  EXPECT_EQ("R_LARCH_ADD64",151            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD64));152  EXPECT_EQ("R_LARCH_SUB8",153            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB8));154  EXPECT_EQ("R_LARCH_SUB16",155            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB16));156  EXPECT_EQ("R_LARCH_SUB24",157            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB24));158  EXPECT_EQ("R_LARCH_SUB32",159            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB32));160  EXPECT_EQ("R_LARCH_SUB64",161            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB64));162  EXPECT_EQ("R_LARCH_GNU_VTINHERIT",163            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTINHERIT));164  EXPECT_EQ("R_LARCH_GNU_VTENTRY",165            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTENTRY));166  EXPECT_EQ("R_LARCH_B16",167            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_B16));168  EXPECT_EQ("R_LARCH_B21",169            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_B21));170  EXPECT_EQ("R_LARCH_B26",171            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_B26));172  EXPECT_EQ("R_LARCH_ABS_HI20",173            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS_HI20));174  EXPECT_EQ("R_LARCH_ABS_LO12",175            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS_LO12));176  EXPECT_EQ("R_LARCH_ABS64_LO20",177            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS64_LO20));178  EXPECT_EQ("R_LARCH_ABS64_HI12",179            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS64_HI12));180  EXPECT_EQ("R_LARCH_PCALA_HI20",181            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA_HI20));182  EXPECT_EQ("R_LARCH_PCALA_LO12",183            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA_LO12));184  EXPECT_EQ("R_LARCH_PCALA64_LO20",185            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA64_LO20));186  EXPECT_EQ("R_LARCH_PCALA64_HI12",187            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA64_HI12));188  EXPECT_EQ("R_LARCH_GOT_PC_HI20",189            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_PC_HI20));190  EXPECT_EQ("R_LARCH_GOT_PC_LO12",191            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_PC_LO12));192  EXPECT_EQ("R_LARCH_GOT64_PC_LO20",193            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_PC_LO20));194  EXPECT_EQ("R_LARCH_GOT64_PC_HI12",195            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_PC_HI12));196  EXPECT_EQ("R_LARCH_GOT_HI20",197            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_HI20));198  EXPECT_EQ("R_LARCH_GOT_LO12",199            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_LO12));200  EXPECT_EQ("R_LARCH_GOT64_LO20",201            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_LO20));202  EXPECT_EQ("R_LARCH_GOT64_HI12",203            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_HI12));204  EXPECT_EQ("R_LARCH_TLS_LE_HI20",205            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE_HI20));206  EXPECT_EQ("R_LARCH_TLS_LE_LO12",207            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE_LO12));208  EXPECT_EQ("R_LARCH_TLS_LE64_LO20",209            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE64_LO20));210  EXPECT_EQ("R_LARCH_TLS_LE64_HI12",211            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE64_HI12));212  EXPECT_EQ("R_LARCH_TLS_IE_PC_HI20",213            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_PC_HI20));214  EXPECT_EQ("R_LARCH_TLS_IE_PC_LO12",215            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_PC_LO12));216  EXPECT_EQ("R_LARCH_TLS_IE64_PC_LO20",217            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_PC_LO20));218  EXPECT_EQ("R_LARCH_TLS_IE64_PC_HI12",219            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_PC_HI12));220  EXPECT_EQ("R_LARCH_TLS_IE_HI20",221            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_HI20));222  EXPECT_EQ("R_LARCH_TLS_IE_LO12",223            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_LO12));224  EXPECT_EQ("R_LARCH_TLS_IE64_LO20",225            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_LO20));226  EXPECT_EQ("R_LARCH_TLS_IE64_HI12",227            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_HI12));228  EXPECT_EQ("R_LARCH_TLS_LD_PC_HI20",229            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LD_PC_HI20));230  EXPECT_EQ("R_LARCH_TLS_LD_HI20",231            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LD_HI20));232  EXPECT_EQ("R_LARCH_TLS_GD_PC_HI20",233            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_GD_PC_HI20));234  EXPECT_EQ("R_LARCH_TLS_GD_HI20",235            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_GD_HI20));236  EXPECT_EQ("R_LARCH_32_PCREL",237            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_32_PCREL));238  EXPECT_EQ("R_LARCH_RELAX",239            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_RELAX));240  EXPECT_EQ("R_LARCH_ALIGN",241            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ALIGN));242  EXPECT_EQ("R_LARCH_PCREL20_S2",243            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCREL20_S2));244  EXPECT_EQ("R_LARCH_ADD6",245            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD6));246  EXPECT_EQ("R_LARCH_SUB6",247            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB6));248  EXPECT_EQ("R_LARCH_ADD_ULEB128",249            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD_ULEB128));250  EXPECT_EQ("R_LARCH_SUB_ULEB128",251            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB_ULEB128));252  EXPECT_EQ("R_LARCH_64_PCREL",253            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_64_PCREL));254  EXPECT_EQ("R_LARCH_CALL36",255            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_CALL36));256}257 258TEST(ELFTest, getRISCVVendorRelocationTypeName) {259  EXPECT_EQ("R_RISCV_QC_ABS20_U",260            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM192, "QUALCOMM"));261  EXPECT_EQ("R_RISCV_QC_E_BRANCH",262            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM193, "QUALCOMM"));263  EXPECT_EQ("R_RISCV_QC_E_32",264            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM194, "QUALCOMM"));265  EXPECT_EQ("R_RISCV_QC_E_CALL_PLT",266            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM195, "QUALCOMM"));267 268  EXPECT_EQ("R_RISCV_NDS_BRANCH_10",269            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM241, "ANDES"));270}271 272TEST(ELFTest, getELFRelativeRelocationType) {273  EXPECT_EQ(ELF::R_VE_RELATIVE, getELFRelativeRelocationType(EM_VE));274  EXPECT_EQ(ELF::R_LARCH_RELATIVE, getELFRelativeRelocationType(EM_LOONGARCH));275}276 277// This is a test for the DataRegion helper struct, defined in ELF.h header.278TEST(ELFTest, DataRegionTest) {279  std::vector<uint8_t> Data = {0, 1, 2};280 281  // Used to check that the operator[] works properly.282  auto CheckOperator = [&](DataRegion<uint8_t> &R) {283    for (size_t I = 0, E = Data.size(); I != E; ++I) {284      Expected<uint8_t> ValOrErr = R[I];285      ASSERT_THAT_EXPECTED(ValOrErr, Succeeded());286      EXPECT_EQ(*ValOrErr, I);287    }288  };289 290  // Check we can use the constructor that takes an ArrayRef<T>.291  DataRegion<uint8_t> Region(Data);292 293  CheckOperator(Region);294  const char *ErrMsg1 =295      "the index is greater than or equal to the number of entries (3)";296  EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg1));297  EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg1));298 299  // Check we can use the constructor that takes the data begin and the300  // data end pointers.301  Region = {Data.data(), Data.data() + Data.size()};302 303  CheckOperator(Region);304  const char *ErrMsg2 = "can't read past the end of the file";305  EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg2));306  EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg2));307}308 309// Test the sysV and the gnu hash functions, particularly with UTF-8 unicode.310// Use names long enough for the hash's recycling of the high bits to kick in.311// Explicitly encode the UTF-8 to avoid encoding transliterations.312TEST(ELFTest, Hash) {313  EXPECT_EQ(hashSysV("FooBarBazToto"), 0x5ec3e8fU);314  EXPECT_EQ(hashGnu("FooBarBazToto"), 0x5478be61U);315 316  // boom💥pants317  EXPECT_EQ(hashSysV("boom\xf0\x9f\x92\xa5pants"), 0x5a0cf53U);318  EXPECT_EQ(hashGnu("boom\xf0\x9f\x92\xa5pants"), 0xf5dda2deU);319 320  // woot!🧙 💑 🌈321  EXPECT_EQ(hashSysV("woot!\xf0\x9f\xa7\x99 \xf0\x9f\x92\x91 "322                     "\xf0\x9f\x8c\x88"), 0x3522e38U);323  EXPECT_EQ(hashGnu("woot!\xf0\x9f\xa7\x99 \xf0\x9f\x92\x91 "324                    "\xf0\x9f\x8c\x88"), 0xf7603f3U);325 326  // This string hashes to 0x100000000 in the originally formulated function,327  // when long is 64 bits -- but that was never the intent. The code was328  // presuming 32-bit long. Thus make sure that extra bit doesn't appear. 329  EXPECT_EQ(hashSysV("ZZZZZW9p"), 0U);330}331 332template <class ELFT>333static Expected<ELFObjectFile<ELFT>> toBinary(SmallVectorImpl<char> &Storage,334                                              StringRef Yaml) {335  raw_svector_ostream OS(Storage);336  yaml::Input YIn(Yaml);337  if (!yaml::convertYAML(YIn, OS, [](const Twine &Msg) {}))338    return createStringError(std::errc::invalid_argument,339                             "unable to convert YAML");340  return ELFObjectFile<ELFT>::create(MemoryBufferRef(OS.str(), "dummyELF"));341}342 343TEST(ELFObjectFileTest, ELFNoteIteratorOverflow) {344  using Elf_Shdr_Range = ELFFile<ELF64LE>::Elf_Shdr_Range;345  using Elf_Phdr_Range = ELFFile<ELF64LE>::Elf_Phdr_Range;346 347  SmallString<0> Storage;348  Expected<ELFObjectFile<ELF64LE>> ElfOrErr = toBinary<ELF64LE>(Storage, R"(349--- !ELF350FileHeader:351  Class:          ELFCLASS64352  Data:           ELFDATA2LSB353  Type:           ET_EXEC354  Machine:        EM_X86_64355ProgramHeaders:356  - Type:         PT_NOTE357    FileSize:     0xffffffffffffff88358    FirstSec:     .note.gnu.build-id359    LastSec:      .note.gnu.build-id360Sections:361  - Name:         .note.gnu.build-id362    Type:         SHT_NOTE363    AddressAlign: 0x04364    ShOffset:     0xffffffffffffff88365    Notes:366      - Name:     "GNU"367        Desc:     "abb50d82b6bdc861"368        Type:     3369)");370  ASSERT_THAT_EXPECTED(ElfOrErr, Succeeded());371  ELFFile<ELF64LE> Obj = ElfOrErr.get().getELFFile();372 373  auto CheckOverflow = [&](auto &&PhdrOrShdr, uint64_t Offset, uint64_t Size) {374    Error Err = Error::success();375    Obj.notes(PhdrOrShdr, Err);376 377    std::string ErrMessage;378    handleAllErrors(std::move(Err), [&](const ErrorInfoBase &EI) {379      ErrMessage = EI.message();380    });381 382    EXPECT_EQ(ErrMessage, ("invalid offset (0x" + Twine::utohexstr(Offset) +383                           ") or size (0x" + Twine::utohexstr(Size) + ")")384                              .str());385  };386 387  Expected<Elf_Phdr_Range> PhdrsOrErr = Obj.program_headers();388  EXPECT_FALSE(!PhdrsOrErr);389  for (Elf_Phdr_Impl<ELF64LE> P : *PhdrsOrErr)390    if (P.p_type == ELF::PT_NOTE)391      CheckOverflow(P, P.p_offset, P.p_filesz);392 393  Expected<Elf_Shdr_Range> ShdrsOrErr = Obj.sections();394  EXPECT_FALSE(!ShdrsOrErr);395  for (Elf_Shdr_Impl<ELF64LE> S : *ShdrsOrErr)396    if (S.sh_type == ELF::SHT_NOTE)397      CheckOverflow(S, S.sh_offset, S.sh_size);398}399