llvm-project/lldb/unittests/Core/ModuleSpecTest.cpp
Fred Riss a4a00ced0c [lldb/Module] Allow for the creation of memory-only modules
Summary:
This patch extends the ModuleSpec class to include a
DataBufferSP which contains the module data. If this
data is provided, LLDB won't try to hit the filesystem
to create the Module, but use only the data stored in
the ModuleSpec.

Reviewers: labath, espindola

Subscribers: emaste, MaskRay, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D83512
2020-07-14 08:45:44 -07:00

167 lines
5.0 KiB
C++

//===-- ModuleSpecTest.cpp ------------------------------------------------===//
//
// 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 "TestingSupport/SubsystemRAII.h"
#include "TestingSupport/TestUtilities.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Utility/DataBuffer.h"
#include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"
#include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h"
#include "gtest/gtest.h"
using namespace lldb;
using namespace lldb_private;
extern const char *TestMainArgv0;
// This test file intentionally doesn't initialize the FileSystem.
// Everything in this file should be able to run without requiring
// any interaction with the FileSystem class; by keeping it
// uninitialized, it will assert if anything tries to interact with
// it.
TEST(ModuleSpecTest, InvalidInMemoryBuffer) {
uint8_t Invalid[] = "This is not a binary file.";
DataBufferSP InvalidBufferSP =
std::make_shared<DataBufferUnowned>(Invalid, sizeof(Invalid));
ModuleSpec Spec(FileSpec(), UUID(), InvalidBufferSP);
auto InvalidModuleSP = std::make_shared<Module>(Spec);
ASSERT_EQ(InvalidModuleSP->GetObjectFile(), nullptr);
}
TEST(ModuleSpecTest, InvalidInMemoryBufferValidFile) {
uint8_t Invalid[] = "This is not a binary file.";
DataBufferSP InvalidBufferSP =
std::make_shared<DataBufferUnowned>(Invalid, sizeof(Invalid));
ModuleSpec Spec(FileSpec(TestMainArgv0), UUID(), InvalidBufferSP);
auto InvalidModuleSP = std::make_shared<Module>(Spec);
ASSERT_EQ(InvalidModuleSP->GetObjectFile(), nullptr);
}
TEST(ModuleSpecTest, TestELFFile) {
SubsystemRAII<ObjectFileELF> subsystems;
auto ExpectedFile = TestFile::fromYaml(R"(
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
AddressAlign: 0x0000000000000010
...
)");
ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
auto M = std::make_shared<Module>(ExpectedFile->moduleSpec());
ObjectFile *OF = M->GetObjectFile();
ASSERT_EQ(llvm::isa<ObjectFileELF>(OF), true);
}
TEST(ModuleSpecTest, TestCOFFFile) {
SubsystemRAII<ObjectFilePECOFF> subsystems;
auto ExpectedFile = TestFile::fromYaml(R"(
--- !COFF
OptionalHeader:
AddressOfEntryPoint: 0
ImageBase: 16777216
SectionAlignment: 4096
FileAlignment: 512
MajorOperatingSystemVersion: 6
MinorOperatingSystemVersion: 0
MajorImageVersion: 0
MinorImageVersion: 0
MajorSubsystemVersion: 6
MinorSubsystemVersion: 0
Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT ]
SizeOfStackReserve: 1048576
SizeOfStackCommit: 4096
SizeOfHeapReserve: 1048576
SizeOfHeapCommit: 4096
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE ]
sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
VirtualAddress: 4096
VirtualSize: 4096
symbols: []
...
)");
ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
auto M = std::make_shared<Module>(ExpectedFile->moduleSpec());
ObjectFile *OF = M->GetObjectFile();
ASSERT_EQ(llvm::isa<ObjectFilePECOFF>(OF), true);
}
TEST(ModuleSpecTest, TestMachOFile) {
SubsystemRAII<ObjectFileMachO> subsystems;
auto ExpectedFile = TestFile::fromYaml(R"(
--- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x0100000C
cpusubtype: 0x00000000
filetype: 0x00000001
ncmds: 1
sizeofcmds: 232
flags: 0x00002000
reserved: 0x00000000
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 232
segname: ''
vmaddr: 0
vmsize: 56
fileoff: 392
filesize: 56
maxprot: 7
initprot: 7
nsects: 1
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x0000000000000000
size: 24
offset: 0x00000188
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
...
)");
ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
auto M = std::make_shared<Module>(ExpectedFile->moduleSpec());
ObjectFile *OF = M->GetObjectFile();
ASSERT_EQ(llvm::isa<ObjectFileMachO>(OF), true);
}