mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 05:26:47 +00:00

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
167 lines
5.0 KiB
C++
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);
|
|
}
|