602 lines · cpp
1//===- GOFFObjectFileTest.cpp - Tests for GOFFObjectFile ------------------===//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/GOFFObjectFile.h"10#include "llvm/Support/MemoryBuffer.h"11#include "llvm/Testing/Support/Error.h"12#include "gtest/gtest.h"13 14using namespace llvm;15using namespace llvm::object;16using namespace llvm::GOFF;17 18namespace {19char GOFFData[GOFF::RecordLength * 3] = {0x00};20 21void constructValidGOFF(size_t Size) {22 StringRef ValidSize(GOFFData, Size);23 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =24 object::ObjectFile::createGOFFObjectFile(25 MemoryBufferRef(ValidSize, "dummyGOFF"));26 27 ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());28}29 30void constructInvalidGOFF(size_t Size) {31 // Construct GOFFObject with record of length != multiple of 80.32 StringRef InvalidData(GOFFData, Size);33 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =34 object::ObjectFile::createGOFFObjectFile(35 MemoryBufferRef(InvalidData, "dummyGOFF"));36 37 ASSERT_THAT_EXPECTED(38 GOFFObjOrErr,39 FailedWithMessage("object file is not the right size. Must be a multiple "40 "of 80 bytes, but is " +41 std::to_string(Size) + " bytes"));42}43} // namespace44 45TEST(GOFFObjectFileTest, ConstructGOFFObjectValidSize) {46 GOFFData[0] = (char)0x03;47 GOFFData[1] = (char)0xF0;48 GOFFData[80] = (char)0x03;49 GOFFData[81] = (char)0x40;50 constructValidGOFF(160);51 constructValidGOFF(0);52}53 54TEST(GOFFObjectFileTest, ConstructGOFFObjectInvalidSize) {55 constructInvalidGOFF(70);56 constructInvalidGOFF(79);57 constructInvalidGOFF(81);58}59 60TEST(GOFFObjectFileTest, MissingHDR) {61 char GOFFData[GOFF::RecordLength * 2] = {0x00};62 63 // ESD record.64 GOFFData[0] = (char)0x03;65 66 // END record.67 GOFFData[GOFF::RecordLength] = (char)0x03;68 GOFFData[GOFF::RecordLength + 1] = (char)0x40;69 70 StringRef Data(GOFFData, GOFF::RecordLength * 2);71 72 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =73 object::ObjectFile::createGOFFObjectFile(74 MemoryBufferRef(Data, "dummyGOFF"));75 76 ASSERT_THAT_EXPECTED(77 GOFFObjOrErr,78 FailedWithMessage("object file must start with HDR record"));79}80 81TEST(GOFFObjectFileTest, MissingEND) {82 char GOFFData[GOFF::RecordLength * 2] = {0x00};83 84 // HDR record.85 GOFFData[0] = (char)0x03;86 GOFFData[1] = (char)0xF0;87 88 // ESD record.89 GOFFData[GOFF::RecordLength] = (char)0x03;90 91 StringRef Data(GOFFData, GOFF::RecordLength * 2);92 93 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =94 object::ObjectFile::createGOFFObjectFile(95 MemoryBufferRef(Data, "dummyGOFF"));96 97 ASSERT_THAT_EXPECTED(98 GOFFObjOrErr, FailedWithMessage("object file must end with END record"));99}100 101TEST(GOFFObjectFileTest, GetSymbolName) {102 char GOFFData[GOFF::RecordLength * 3] = {0x00};103 104 // HDR record.105 GOFFData[0] = (char)0x03;106 GOFFData[1] = (char)0xF0;107 108 // ESD record.109 GOFFData[GOFF::RecordLength] = (char)0x03;110 GOFFData[GOFF::RecordLength + 3] = (char)0x02;111 GOFFData[GOFF::RecordLength + 7] = (char)0x01;112 GOFFData[GOFF::RecordLength + 11] = (char)0x01;113 GOFFData[GOFF::RecordLength + 71] = (char)0x05; // Size of symbol name.114 GOFFData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is Hello.115 GOFFData[GOFF::RecordLength + 73] = (char)0x85;116 GOFFData[GOFF::RecordLength + 74] = (char)0x93;117 GOFFData[GOFF::RecordLength + 75] = (char)0x93;118 GOFFData[GOFF::RecordLength + 76] = (char)0x96;119 120 // END record.121 GOFFData[GOFF::RecordLength * 2] = 0x03;122 GOFFData[GOFF::RecordLength * 2 + 1] = 0x40;123 124 StringRef Data(GOFFData, GOFF::RecordLength * 3);125 126 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =127 object::ObjectFile::createGOFFObjectFile(128 MemoryBufferRef(Data, "dummyGOFF"));129 130 ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());131 132 GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());133 134 for (SymbolRef Symbol : GOFFObj->symbols()) {135 Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);136 ASSERT_THAT_EXPECTED(SymbolNameOrErr, Succeeded());137 StringRef SymbolName = SymbolNameOrErr.get();138 139 EXPECT_EQ(SymbolName, "Hello");140 }141}142 143TEST(GOFFObjectFileTest, ConcatenatedGOFFFile) {144 char GOFFData[GOFF::RecordLength * 6] = {0x00};145 146 // HDR record.147 GOFFData[0] = (char)0x03;148 GOFFData[1] = (char)0xF0;149 // ESD record.150 GOFFData[GOFF::RecordLength] = (char)0x03;151 // END record.152 GOFFData[GOFF::RecordLength * 2] = (char)0x03;153 GOFFData[GOFF::RecordLength * 2 + 1] = (char)0x40;154 // HDR record.155 GOFFData[GOFF::RecordLength * 3] = (char)0x03;156 GOFFData[GOFF::RecordLength * 3 + 1] = (char)0xF0;157 // ESD record.158 GOFFData[GOFF::RecordLength * 4] = (char)0x03;159 // END record.160 GOFFData[GOFF::RecordLength * 5] = (char)0x03;161 GOFFData[GOFF::RecordLength * 5 + 1] = (char)0x40;162 163 StringRef Data(GOFFData, GOFF::RecordLength * 6);164 165 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =166 object::ObjectFile::createGOFFObjectFile(167 MemoryBufferRef(Data, "dummyGOFF"));168 169 ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());170}171 172TEST(GOFFObjectFileTest, ContinuationGetSymbolName) {173 char GOFFContData[GOFF::RecordLength * 4] = {0x00};174 175 // HDR record.176 GOFFContData[0] = (char)0x03;177 GOFFContData[1] = (char)0xF0;178 179 // ESD record.180 GOFFContData[GOFF::RecordLength] = (char)0x03;181 GOFFContData[GOFF::RecordLength + 1] = (char)0x01;182 GOFFContData[GOFF::RecordLength + 3] = (char)0x02;183 GOFFContData[GOFF::RecordLength + 7] = (char)0x01;184 GOFFContData[GOFF::RecordLength + 11] = (char)0x01;185 GOFFContData[GOFF::RecordLength + 71] = (char)0x0A; // Size of symbol name.186 GOFFContData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is HelloWorld.187 GOFFContData[GOFF::RecordLength + 73] = (char)0x85;188 GOFFContData[GOFF::RecordLength + 74] = (char)0x93;189 GOFFContData[GOFF::RecordLength + 75] = (char)0x93;190 GOFFContData[GOFF::RecordLength + 76] = (char)0x96;191 GOFFContData[GOFF::RecordLength + 77] = (char)0xA6;192 GOFFContData[GOFF::RecordLength + 78] = (char)0x96;193 GOFFContData[GOFF::RecordLength + 79] = (char)0x99;194 195 // ESD continuation record.196 GOFFContData[GOFF::RecordLength * 2] = (char)0x03;197 GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x02; // No further continuations.198 GOFFContData[GOFF::RecordLength * 2 + 3] = (char)0x93;199 GOFFContData[GOFF::RecordLength * 2 + 4] = (char)0x84;200 201 // END record.202 GOFFContData[GOFF::RecordLength * 3] = (char)0x03;203 GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;204 205 StringRef Data(GOFFContData, GOFF::RecordLength * 4);206 207 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =208 object::ObjectFile::createGOFFObjectFile(209 MemoryBufferRef(Data, "dummyGOFF"));210 211 ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());212 213 GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());214 215 for (SymbolRef Symbol : GOFFObj->symbols()) {216 Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);217 ASSERT_THAT_EXPECTED(SymbolNameOrErr, Succeeded());218 StringRef SymbolName = SymbolNameOrErr.get();219 EXPECT_EQ(SymbolName, "Helloworld");220 }221}222 223TEST(GOFFObjectFileTest, ContinuationBitNotSet) {224 char GOFFContData[GOFF::RecordLength * 4] = {0x00};225 226 // HDR record.227 GOFFContData[0] = (char)0x03;228 GOFFContData[1] = (char)0xF0;229 230 // ESD record.231 GOFFContData[GOFF::RecordLength] = (char)0x03;232 GOFFContData[GOFF::RecordLength + 1] = (char)0x01;233 GOFFContData[GOFF::RecordLength + 3] = (char)0x02;234 GOFFContData[GOFF::RecordLength + 7] = (char)0x01;235 GOFFContData[GOFF::RecordLength + 11] = (char)0x01;236 GOFFContData[GOFF::RecordLength + 71] = (char)0x0A; // Size of symbol name.237 GOFFContData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is HelloWorld.238 GOFFContData[GOFF::RecordLength + 73] = (char)0x85;239 GOFFContData[GOFF::RecordLength + 74] = (char)0x93;240 GOFFContData[GOFF::RecordLength + 75] = (char)0x93;241 GOFFContData[GOFF::RecordLength + 76] = (char)0x96;242 GOFFContData[GOFF::RecordLength + 77] = (char)0xA6;243 GOFFContData[GOFF::RecordLength + 78] = (char)0x96;244 GOFFContData[GOFF::RecordLength + 79] = (char)0x99;245 246 // ESD continuation record.247 GOFFContData[GOFF::RecordLength * 2] = (char)0x03;248 GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x00;249 GOFFContData[GOFF::RecordLength * 2 + 3] = (char)0x93;250 GOFFContData[GOFF::RecordLength * 2 + 4] = (char)0x84;251 252 // END record.253 GOFFContData[GOFF::RecordLength * 3] = (char)0x03;254 GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;255 256 StringRef Data(GOFFContData, GOFF::RecordLength * 4);257 258 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =259 object::ObjectFile::createGOFFObjectFile(260 MemoryBufferRef(Data, "dummyGOFF"));261 EXPECT_THAT_EXPECTED(262 GOFFObjOrErr,263 FailedWithMessage("record 2 is not a continuation record but the "264 "preceding record is continued"));265}266 267TEST(GOFFObjectFileTest, ContinuationRecordNotTerminated) {268 char GOFFContData[GOFF::RecordLength * 4] = {0x00};269 270 // HDR record.271 GOFFContData[0] = (char)0x03;272 GOFFContData[1] = (char)0xF0;273 274 // ESD record.275 GOFFContData[GOFF::RecordLength] = (char)0x03;276 GOFFContData[GOFF::RecordLength + 1] = (char)0x01;277 GOFFContData[GOFF::RecordLength + 3] = (char)0x02;278 GOFFContData[GOFF::RecordLength + 7] = (char)0x01;279 GOFFContData[GOFF::RecordLength + 11] = (char)0x01;280 GOFFContData[GOFF::RecordLength + 71] = (char)0x0A; // Size of symbol name.281 GOFFContData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is HelloWorld.282 GOFFContData[GOFF::RecordLength + 73] = (char)0x85;283 GOFFContData[GOFF::RecordLength + 74] = (char)0x93;284 GOFFContData[GOFF::RecordLength + 75] = (char)0x93;285 GOFFContData[GOFF::RecordLength + 76] = (char)0x96;286 GOFFContData[GOFF::RecordLength + 77] = (char)0xA6;287 GOFFContData[GOFF::RecordLength + 78] = (char)0x96;288 GOFFContData[GOFF::RecordLength + 79] = (char)0x99;289 290 // ESD continuation record.291 GOFFContData[GOFF::RecordLength * 2] = (char)0x03;292 GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x03; // Continued bit set.293 GOFFContData[GOFF::RecordLength * 2 + 3] = (char)0x93;294 GOFFContData[GOFF::RecordLength * 2 + 4] = (char)0x84;295 296 // END record.297 GOFFContData[GOFF::RecordLength * 3] = (char)0x03;298 GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;299 300 StringRef Data(GOFFContData, GOFF::RecordLength * 4);301 302 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =303 object::ObjectFile::createGOFFObjectFile(304 MemoryBufferRef(Data, "dummyGOFF"));305 ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());306 307 GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());308 309 for (SymbolRef Symbol : GOFFObj->symbols()) {310 Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);311 EXPECT_THAT_EXPECTED(SymbolNameOrErr,312 FailedWithMessage("continued bit should not be set"));313 }314}315 316TEST(GOFFObjectFileTest, PrevNotContinued) {317 char GOFFContData[GOFF::RecordLength * 4] = {0x00};318 319 // HDR record.320 GOFFContData[0] = (char)0x03;321 GOFFContData[1] = (char)0xF0;322 323 // ESD record, with continued bit not set.324 GOFFContData[GOFF::RecordLength] = (char)0x03;325 326 // ESD continuation record.327 GOFFContData[GOFF::RecordLength * 2] = (char)0x03;328 GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x02;329 330 // END record.331 GOFFContData[GOFF::RecordLength * 3] = (char)0x03;332 GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;333 334 StringRef Data(GOFFContData, GOFF::RecordLength * 4);335 336 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =337 object::ObjectFile::createGOFFObjectFile(338 MemoryBufferRef(Data, "dummyGOFF"));339 340 ASSERT_THAT_EXPECTED(341 GOFFObjOrErr,342 FailedWithMessage("record 2 is a continuation record that is not "343 "preceded by a continued record"));344}345 346TEST(GOFFObjectFileTest, ContinuationTypeMismatch) {347 char GOFFContData[GOFF::RecordLength * 4] = {0x00};348 349 // HDR record.350 GOFFContData[0] = (char)0x03;351 GOFFContData[1] = (char)0xF0;352 353 // ESD record.354 GOFFContData[GOFF::RecordLength] = (char)0x03;355 GOFFContData[GOFF::RecordLength + 1] = (char)0x01; // Continued to next record.356 357 // END continuation record.358 GOFFContData[GOFF::RecordLength * 2] = (char)0x03;359 GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x42;360 361 // END record.362 GOFFContData[GOFF::RecordLength * 3] = (char)0x03;363 GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;364 365 StringRef Data(GOFFContData, GOFF::RecordLength * 4);366 367 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =368 object::ObjectFile::createGOFFObjectFile(369 MemoryBufferRef(Data, "dummyGOFF"));370 371 ASSERT_THAT_EXPECTED(372 GOFFObjOrErr,373 FailedWithMessage("record 2 is a continuation record that does not match "374 "the type of the previous record"));375}376 377TEST(GOFFObjectFileTest, TwoSymbols) {378 char GOFFData[GOFF::RecordLength * 4] = {0x00};379 380 // HDR record.381 GOFFData[0] = (char)0x03;382 GOFFData[1] = (char)0xF0;383 384 // ESD record 1.385 GOFFData[GOFF::RecordLength] = (char)0x03;386 GOFFData[GOFF::RecordLength + 3] = (char)0x00;387 GOFFData[GOFF::RecordLength + 7] = (char)0x01; // ESDID.388 GOFFData[GOFF::RecordLength + 71] = (char)0x01; // Size of symbol name.389 GOFFData[GOFF::RecordLength + 72] = (char)0xa7; // Symbol name is x.390 391 // ESD record 2.392 GOFFData[GOFF::RecordLength * 2] = (char)0x03;393 GOFFData[GOFF::RecordLength * 2 + 3] = (char)0x03;394 GOFFData[GOFF::RecordLength * 2 + 7] = (char)0x02; // ESDID.395 GOFFData[GOFF::RecordLength * 2 + 11] = (char)0x01; // Parent ESDID.396 GOFFData[GOFF::RecordLength * 2 + 71] = (char)0x05; // Size of symbol name.397 GOFFData[GOFF::RecordLength * 2 + 72] = (char)0xC8; // Symbol name is Hello.398 GOFFData[GOFF::RecordLength * 2 + 73] = (char)0x85;399 GOFFData[GOFF::RecordLength * 2 + 74] = (char)0x93;400 GOFFData[GOFF::RecordLength * 2 + 75] = (char)0x93;401 GOFFData[GOFF::RecordLength * 2 + 76] = (char)0x96;402 403 // END record.404 GOFFData[GOFF::RecordLength * 3] = (char)0x03;405 GOFFData[GOFF::RecordLength * 3 + 1] = (char)0x40;406 407 StringRef Data(GOFFData, GOFF::RecordLength * 4);408 409 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =410 object::ObjectFile::createGOFFObjectFile(411 MemoryBufferRef(Data, "dummyGOFF"));412 413 ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());414 415 GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());416 417 for (SymbolRef Symbol : GOFFObj->symbols()) {418 Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);419 ASSERT_THAT_EXPECTED(SymbolNameOrErr, Succeeded());420 StringRef SymbolName = SymbolNameOrErr.get();421 EXPECT_EQ(SymbolName, "Hello");422 }423}424 425TEST(GOFFObjectFileTest, InvalidSymbolType) {426 char GOFFData[GOFF::RecordLength * 3] = {0x00};427 428 // HDR record.429 GOFFData[0] = (char)0x03;430 GOFFData[1] = (char)0xF0;431 432 // ESD record.433 GOFFData[GOFF::RecordLength] = (char)0x03;434 GOFFData[GOFF::RecordLength + 3] = (char)0x05;435 GOFFData[GOFF::RecordLength + 7] = (char)0x01;436 GOFFData[GOFF::RecordLength + 11] = (char)0x01;437 GOFFData[GOFF::RecordLength + 71] = (char)0x01; // Size of symbol name.438 GOFFData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name.439 440 // END record.441 GOFFData[GOFF::RecordLength * 2] = (char)0x03;442 GOFFData[GOFF::RecordLength * 2 + 1] = (char)0x40;443 444 StringRef Data(GOFFData, GOFF::RecordLength * 3);445 446 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =447 object::ObjectFile::createGOFFObjectFile(448 MemoryBufferRef(Data, "dummyGOFF"));449 450 ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());451 452 GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());453 454 for (SymbolRef Symbol : GOFFObj->symbols()) {455 Expected<SymbolRef::Type> SymbolType = Symbol.getType();456 EXPECT_THAT_EXPECTED(457 SymbolType,458 FailedWithMessage("ESD record 1 has invalid symbol type 0x05"));459 460 Expected<section_iterator> SymSI = Symbol.getSection();461 ASSERT_THAT_EXPECTED(462 SymSI,463 FailedWithMessage(464 "symbol with ESD id 1 refers to invalid section with ESD id 1"));465 }466}467 468TEST(GOFFObjectFileTest, InvalidERSymbolType) {469 char GOFFData[GOFF::RecordLength * 3] = {0x00};470 471 // HDR record.472 GOFFData[0] = (char)0x03;473 GOFFData[1] = (char)0xF0;474 475 // ESD record.476 GOFFData[GOFF::RecordLength] = (char)0x03;477 GOFFData[GOFF::RecordLength + 3] = (char)0x04;478 GOFFData[GOFF::RecordLength + 7] = (char)0x01;479 GOFFData[GOFF::RecordLength + 11] = (char)0x01;480 GOFFData[GOFF::RecordLength + 63] = (char)0x03; // Unknown executable type.481 GOFFData[GOFF::RecordLength + 71] = (char)0x01; // Size of symbol name.482 GOFFData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name.483 484 // END record.485 GOFFData[GOFF::RecordLength * 2] = (char)0x03;486 GOFFData[GOFF::RecordLength * 2 + 1] = (char)0x40;487 488 StringRef Data(GOFFData, GOFF::RecordLength * 3);489 490 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =491 object::ObjectFile::createGOFFObjectFile(492 MemoryBufferRef(Data, "dummyGOFF"));493 494 ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());495 496 GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());497 498 for (SymbolRef Symbol : GOFFObj->symbols()) {499 Expected<SymbolRef::Type> SymbolType = Symbol.getType();500 EXPECT_THAT_EXPECTED(501 SymbolType,502 FailedWithMessage("ESD record 1 has unknown Executable type 0x03"));503 }504}505 506TEST(GOFFObjectFileTest, TXTConstruct) {507 char GOFFData[GOFF::RecordLength * 6] = {};508 509 // HDR record.510 GOFFData[0] = (char)0x03;511 GOFFData[1] = (char)0xF0;512 GOFFData[50] = (char)0x01;513 514 // ESD record.515 GOFFData[GOFF::RecordLength] = (char)0x03;516 GOFFData[GOFF::RecordLength + 7] = (char)0x01; // ESDID.517 GOFFData[GOFF::RecordLength + 71] = (char)0x05; // Size of symbol name.518 GOFFData[GOFF::RecordLength + 72] = (char)0xa5; // Symbol name is v.519 GOFFData[GOFF::RecordLength + 73] = (char)0x81; // Symbol name is a.520 GOFFData[GOFF::RecordLength + 74] = (char)0x99; // Symbol name is r.521 GOFFData[GOFF::RecordLength + 75] = (char)0x7b; // Symbol name is #.522 GOFFData[GOFF::RecordLength + 76] = (char)0x83; // Symbol name is c.523 524 // ESD record.525 GOFFData[GOFF::RecordLength * 2] = (char)0x03;526 GOFFData[GOFF::RecordLength * 2 + 3] = (char)0x01;527 GOFFData[GOFF::RecordLength * 2 + 7] = (char)0x02; // ESDID.528 GOFFData[GOFF::RecordLength * 2 + 11] = (char)0x01; // Parent ESDID.529 GOFFData[GOFF::RecordLength * 2 + 27] = (char)0x08; // Length.530 GOFFData[GOFF::RecordLength * 2 + 40] = (char)0x01; // Name Space ID.531 GOFFData[GOFF::RecordLength * 2 + 41] = (char)0x80;532 GOFFData[GOFF::RecordLength * 2 + 60] = (char)0x04; // Size of symbol name.533 GOFFData[GOFF::RecordLength * 2 + 61] = (char)0x04; // Size of symbol name.534 GOFFData[GOFF::RecordLength * 2 + 63] = (char)0x0a; // Size of symbol name.535 GOFFData[GOFF::RecordLength * 2 + 66] = (char)0x03; // Size of symbol name.536 GOFFData[GOFF::RecordLength * 2 + 71] = (char)0x08; // Size of symbol name.537 GOFFData[GOFF::RecordLength * 2 + 72] = (char)0xc3; // Symbol name is c.538 GOFFData[GOFF::RecordLength * 2 + 73] = (char)0x6d; // Symbol name is _.539 GOFFData[GOFF::RecordLength * 2 + 74] = (char)0xc3; // Symbol name is c.540 GOFFData[GOFF::RecordLength * 2 + 75] = (char)0xd6; // Symbol name is o.541 GOFFData[GOFF::RecordLength * 2 + 76] = (char)0xc4; // Symbol name is D.542 GOFFData[GOFF::RecordLength * 2 + 77] = (char)0xc5; // Symbol name is E.543 GOFFData[GOFF::RecordLength * 2 + 78] = (char)0xf6; // Symbol name is 6.544 GOFFData[GOFF::RecordLength * 2 + 79] = (char)0xf4; // Symbol name is 4.545 546 // ESD record.547 GOFFData[GOFF::RecordLength * 3] = (char)0x03;548 GOFFData[GOFF::RecordLength * 3 + 3] = (char)0x02;549 GOFFData[GOFF::RecordLength * 3 + 7] = (char)0x03; // ESDID.550 GOFFData[GOFF::RecordLength * 3 + 11] = (char)0x02; // Parent ESDID.551 GOFFData[GOFF::RecordLength * 3 + 71] = (char)0x05; // Size of symbol name.552 GOFFData[GOFF::RecordLength * 3 + 72] = (char)0xa5; // Symbol name is v.553 GOFFData[GOFF::RecordLength * 3 + 73] = (char)0x81; // Symbol name is a.554 GOFFData[GOFF::RecordLength * 3 + 74] = (char)0x99; // Symbol name is r.555 GOFFData[GOFF::RecordLength * 3 + 75] = (char)0x7b; // Symbol name is #.556 GOFFData[GOFF::RecordLength * 3 + 76] = (char)0x83; // Symbol name is c.557 558 // TXT record.559 GOFFData[GOFF::RecordLength * 4] = (char)0x03;560 GOFFData[GOFF::RecordLength * 4 + 1] = (char)0x10;561 GOFFData[GOFF::RecordLength * 4 + 7] = (char)0x02;562 GOFFData[GOFF::RecordLength * 4 + 23] = (char)0x08; // Data Length.563 GOFFData[GOFF::RecordLength * 4 + 24] = (char)0x12;564 GOFFData[GOFF::RecordLength * 4 + 25] = (char)0x34;565 GOFFData[GOFF::RecordLength * 4 + 26] = (char)0x56;566 GOFFData[GOFF::RecordLength * 4 + 27] = (char)0x78;567 GOFFData[GOFF::RecordLength * 4 + 28] = (char)0x9a;568 GOFFData[GOFF::RecordLength * 4 + 29] = (char)0xbc;569 GOFFData[GOFF::RecordLength * 4 + 30] = (char)0xde;570 GOFFData[GOFF::RecordLength * 4 + 31] = (char)0xf0;571 572 // END record.573 GOFFData[GOFF::RecordLength * 5] = (char)0x03;574 GOFFData[GOFF::RecordLength * 5 + 1] = (char)0x40;575 GOFFData[GOFF::RecordLength * 5 + 11] = (char)0x06;576 577 StringRef Data(GOFFData, GOFF::RecordLength * 6);578 579 Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =580 object::ObjectFile::createGOFFObjectFile(581 MemoryBufferRef(Data, "dummyGOFF"));582 583 ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());584 585 GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());586 auto Symbols = GOFFObj->symbols();587 ASSERT_EQ(std::distance(Symbols.begin(), Symbols.end()), 1);588 SymbolRef Symbol = *Symbols.begin();589 Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);590 ASSERT_THAT_EXPECTED(SymbolNameOrErr, Succeeded());591 StringRef SymbolName = SymbolNameOrErr.get();592 EXPECT_EQ(SymbolName, "var#c");593 594 auto Sections = GOFFObj->sections();595 ASSERT_EQ(std::distance(Sections.begin(), Sections.end()), 1);596 SectionRef Section = *Sections.begin();597 Expected<StringRef> SectionContent = Section.getContents();598 ASSERT_THAT_EXPECTED(SectionContent, Succeeded());599 StringRef Contents = SectionContent.get();600 EXPECT_EQ(Contents, "\x12\x34\x56\x78\x9a\xbc\xde\xf0");601}602