blob: 14a7fbbbe676714dbb73dcaa62489f13fd565c0a [file] [edit]
//===---------- MachOBuilderTest.cpp - MachOBuilder Tests -----------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "llvm/ExecutionEngine/Orc/MachOBuilder.h"
#include "llvm/BinaryFormat/MachO.h"
#include "llvm/Object/MachO.h"
#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
using namespace llvm;
using namespace llvm::orc;
static Expected<std::unique_ptr<object::MachOObjectFile>>
parseMachO(ArrayRef<char> Buffer) {
return object::ObjectFile::createMachOObjectFile(
MemoryBufferRef(StringRef(Buffer.data(), Buffer.size()), "test"));
}
TEST(MachOBuilderTest, AddLCUUID) {
MachOBuilder<MachO64LE> B(4096);
B.Header.filetype = MachO::MH_OBJECT;
uint8_t UUID[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
B.addLoadCommand<MachO::LC_UUID>(UUID);
size_t Size = B.layout();
std::vector<char> Buffer(Size, 0);
B.write({Buffer.data(), Buffer.size()});
auto Obj = parseMachO(Buffer);
ASSERT_THAT_EXPECTED(Obj, Succeeded());
ArrayRef<uint8_t> ParsedUUID = (*Obj)->getUuid();
ASSERT_EQ(ParsedUUID.size(), 16u);
EXPECT_EQ(ArrayRef<uint8_t>(UUID), ParsedUUID);
}
TEST(MachOBuilderTest, AddLCTargetTriple) {
std::string TestTriple = "x86_64-apple-darwin";
MachOBuilder<MachO64LE> B(4096);
B.Header.filetype = MachO::MH_OBJECT;
B.addLoadCommand<MachO::LC_TARGET_TRIPLE>(TestTriple);
size_t Size = B.layout();
std::vector<char> Buffer(Size, 0);
B.write({Buffer.data(), Buffer.size()});
auto Obj = parseMachO(Buffer);
ASSERT_THAT_EXPECTED(Obj, Succeeded());
bool Found = false;
for (auto &LC : (*Obj)->load_commands()) {
if (LC.C.cmd == MachO::LC_TARGET_TRIPLE) {
Found = true;
MachO::target_triple_command TTC = (*Obj)->getTargetTripleLoadCommand(LC);
ASSERT_LT(TTC.triple, TTC.cmdsize);
EXPECT_EQ(LC.Ptr + TTC.triple, TestTriple);
break;
}
}
EXPECT_TRUE(Found);
}