unittests: Use yaml2obj as a library instead of an external process

Summary:
Recently, yaml2obj has been turned into a library. This means we can use
it from our unit tests directly, instead of shelling out to an external
process. This patch does just that.

Reviewers: JDevlieghere, aadsm, espindola, jdoerfert

Subscribers: emaste, mgorny, arichardson, MaskRay, jhenderson, abrachet, lldb-commits

Differential Revision: https://reviews.llvm.org/D65949

llvm-svn: 369374
This commit is contained in:
Pavel Labath 2019-08-20 12:28:36 +00:00
parent cc0ba28cf0
commit a2e270fa70
13 changed files with 388 additions and 409 deletions

View File

@ -15,8 +15,3 @@ add_lldb_unittest(LLDBCoreTests
LINK_COMPONENTS LINK_COMPONENTS
Support Support
) )
set(test_inputs
mangled-function-names.yaml
)
add_unittest_inputs(LLDBCoreTests "${test_inputs}")

View File

@ -1,129 +0,0 @@
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
AddressAlign: 0x0000000000000010
Content: 554889E58B0425A80000005DC30F1F00
- Name: .anothertext
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x0000000000000010
AddressAlign: 0x0000000000000010
Content: 554889E54883EC20488D0425A8000000C745FC00000000488945F0488B45F08B08894DECE8C7FFFFFF8B4DEC01C189C84883C4205D746573742073747200C3
- Name: .eh_frame
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x0000000000000050
AddressAlign: 0x0000000000000008
Content: 1400000000000000017A5200017810011B0C0708900100001C0000001C00000090FFFFFF0D00000000410E108602430D06000000000000001C0000003C00000080FFFFFF3F00000000410E108602430D0600000000000000
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x00000000000000A8
AddressAlign: 0x0000000000000004
Content: '01000000'
- Name: .comment
Type: SHT_PROGBITS
Flags: [ SHF_MERGE, SHF_STRINGS ]
AddressAlign: 0x0000000000000001
Content: 5562756E747520636C616E672076657273696F6E20332E352D317562756E74753120287472756E6B2920286261736564206F6E204C4C564D20332E352900
Symbols:
- Type: STT_SECTION
Section: .text
- Type: STT_SECTION
Section: .anothertext
Value: 0x0000000000000010
- Type: STT_SECTION
Section: .eh_frame
Value: 0x0000000000000050
- Type: STT_SECTION
Section: .data
Value: 0x00000000000000A8
- Type: STT_SECTION
Section: .comment
- Name: /tmp/a.c
Type: STT_FILE
- Type: STT_FILE
- Name: somedata
Type: STT_OBJECT
Section: .anothertext
Value: 0x0000000000000045
Binding: STB_GLOBAL
- Name: main
Type: STT_FUNC
Section: .anothertext
Value: 0x0000000000000010
Size: 0x000000000000003F
Binding: STB_GLOBAL
- Name: _Z3foov
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: puts@GLIBC_2.5
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: puts@GLIBC_2.6
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _Z5annotv@VERSION3
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZN1AC2Ev
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZN1AD2Ev
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZN1A3barEv
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZGVZN4llvm4dbgsEvE7thestrm
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZZN4llvm4dbgsEvE7thestrm
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZTVN5clang4DeclE
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: -[ObjCfoo]
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: +[B ObjCbar(WithCategory)]
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _Z12undemangableEvx42
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
...

View File

@ -56,15 +56,113 @@ TEST(MangledTest, NameIndexes_FindFunctionSymbols) {
ObjectFileELF::Initialize(); ObjectFileELF::Initialize();
SymbolFileSymtab::Initialize(); SymbolFileSymtab::Initialize();
llvm::SmallString<128> Obj; auto ExpectedFile = TestFile::fromYaml(R"(
ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( --- !ELF
"mangled-function-names-%%%%%%", "obj", Obj)); FileHeader:
llvm::FileRemover Deleter(Obj); Class: ELFCLASS64
ASSERT_THAT_ERROR(ReadYAMLObjectFile("mangled-function-names.yaml", Obj), Data: ELFDATA2LSB
llvm::Succeeded()); Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
AddressAlign: 0x0000000000000010
Size: 0x20
- Name: .anothertext
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x0000000000000010
AddressAlign: 0x0000000000000010
Size: 0x40
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x00000000000000A8
AddressAlign: 0x0000000000000004
Content: '01000000'
Symbols:
- Name: somedata
Type: STT_OBJECT
Section: .anothertext
Value: 0x0000000000000045
Binding: STB_GLOBAL
- Name: main
Type: STT_FUNC
Section: .anothertext
Value: 0x0000000000000010
Size: 0x000000000000003F
Binding: STB_GLOBAL
- Name: _Z3foov
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: puts@GLIBC_2.5
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: puts@GLIBC_2.6
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _Z5annotv@VERSION3
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZN1AC2Ev
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZN1AD2Ev
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZN1A3barEv
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZGVZN4llvm4dbgsEvE7thestrm
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZZN4llvm4dbgsEvE7thestrm
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _ZTVN5clang4DeclE
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: -[ObjCfoo]
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: +[B ObjCbar(WithCategory)]
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
- Name: _Z12undemangableEvx42
Type: STT_FUNC
Section: .text
Size: 0x000000000000000D
Binding: STB_GLOBAL
...
)");
ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
ModuleSpec Spec{FileSpec(Obj)}; ModuleSpec Spec{FileSpec(ExpectedFile->name())};
Spec.GetSymbolFileSpec().SetFile(Obj, FileSpec::Style::native);
auto M = std::make_shared<Module>(Spec); auto M = std::make_shared<Module>(Spec);
auto Count = [M](const char *Name, FunctionNameType Type) -> int { auto Count = [M](const char *Name, FunctionNameType Type) -> int {

View File

@ -11,6 +11,5 @@ add_lldb_unittest(ObjectFileELFTests
set(test_inputs set(test_inputs
early-section-headers.so early-section-headers.so
sections-resolve-consistently.yaml
) )
add_unittest_inputs(ObjectFileELFTests "${test_inputs}") add_unittest_inputs(ObjectFileELFTests "${test_inputs}")

View File

@ -1,52 +0,0 @@
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Entry: 0x0000000000400180
Sections:
- Name: .note.gnu.build-id
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x0000000000400158
AddressAlign: 0x0000000000000004
Content: 040000001400000003000000474E55003F3EC29E3FD83E49D18C4D49CD8A730CC13117B6
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x0000000000400180
AddressAlign: 0x0000000000000010
Content: 554889E58B042500106000890425041060005DC3
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x0000000000601000
AddressAlign: 0x0000000000000004
Content: 2F000000
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x0000000000601004
AddressAlign: 0x0000000000000004
Size: 0x0000000000000004
Symbols:
- Name: Y
Type: STT_OBJECT
Section: .data
Value: 0x0000000000601000
Size: 0x0000000000000004
Binding: STB_GLOBAL
- Name: _start
Type: STT_FUNC
Section: .text
Value: 0x0000000000400180
Size: 0x0000000000000014
Binding: STB_GLOBAL
- Name: X
Type: STT_OBJECT
Section: .bss
Value: 0x0000000000601004
Size: 0x0000000000000004
Binding: STB_GLOBAL
...

View File

@ -48,16 +48,65 @@ protected:
}; };
TEST_F(ObjectFileELFTest, SectionsResolveConsistently) { TEST_F(ObjectFileELFTest, SectionsResolveConsistently) {
llvm::SmallString<128> obj; auto ExpectedFile = TestFile::fromYaml(R"(
ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( --- !ELF
"sections-resolve-consistently-%%%%%%", "obj", obj)); FileHeader:
llvm::FileRemover remover(obj); Class: ELFCLASS64
ASSERT_THAT_ERROR( Data: ELFDATA2LSB
ReadYAMLObjectFile("sections-resolve-consistently.yaml", obj), Type: ET_EXEC
llvm::Succeeded()); Machine: EM_X86_64
Entry: 0x0000000000400180
Sections:
- Name: .note.gnu.build-id
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x0000000000400158
AddressAlign: 0x0000000000000004
Content: 040000001400000003000000474E55003F3EC29E3FD83E49D18C4D49CD8A730CC13117B6
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x0000000000400180
AddressAlign: 0x0000000000000010
Content: 554889E58B042500106000890425041060005DC3
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x0000000000601000
AddressAlign: 0x0000000000000004
Content: 2F000000
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x0000000000601004
AddressAlign: 0x0000000000000004
Size: 0x0000000000000004
Symbols:
- Name: Y
Type: STT_OBJECT
Section: .data
Value: 0x0000000000601000
Size: 0x0000000000000004
Binding: STB_GLOBAL
- Name: _start
Type: STT_FUNC
Section: .text
Value: 0x0000000000400180
Size: 0x0000000000000014
Binding: STB_GLOBAL
- Name: X
Type: STT_OBJECT
Section: .bss
Value: 0x0000000000601004
Size: 0x0000000000000004
Binding: STB_GLOBAL
...
)");
ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
ModuleSpec spec{FileSpec(obj)}; ModuleSpec spec{FileSpec(ExpectedFile->name())};
spec.GetSymbolFileSpec().SetFile(obj, FileSpec::Style::native); spec.GetSymbolFileSpec().SetFile(ExpectedFile->name(),
FileSpec::Style::native);
auto module_sp = std::make_shared<Module>(spec); auto module_sp = std::make_shared<Module>(spec);
SectionList *list = module_sp->GetSectionList(); SectionList *list = module_sp->GetSectionList();
ASSERT_NE(nullptr, list); ASSERT_NE(nullptr, list);

View File

@ -18,7 +18,6 @@ add_lldb_unittest(SymbolTests
) )
set(test_inputs set(test_inputs
basic-call-frame-info.yaml
inlined-functions.yaml inlined-functions.yaml
) )
add_unittest_inputs(SymbolTests "${test_inputs}") add_unittest_inputs(SymbolTests "${test_inputs}")

View File

@ -1,140 +0,0 @@
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Entry: 0x0000000000000260
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x0000000000000260
AddressAlign: 0x0000000000000010
Content: 554889E5897DFC8B45FC5DC30F1F4000554889E5897DFC8B45FC5DC30F1F4000554889E5897DFC8B45FC5DC3
#0000000000000260 <eh_frame>:
# 260: 55 push %rbp
# 261: 48 89 e5 mov %rsp,%rbp
# 264: 89 7d fc mov %edi,-0x4(%rbp)
# 267: 8b 45 fc mov -0x4(%rbp),%eax
# 26a: 5d pop %rbp
# 26b: c3 retq
# 26c: 0f 1f 40 00 nopl 0x0(%rax)
#
#0000000000000270 <debug_frame3>:
# 270: 55 push %rbp
# 271: 48 89 e5 mov %rsp,%rbp
# 274: 89 7d fc mov %edi,-0x4(%rbp)
# 277: 8b 45 fc mov -0x4(%rbp),%eax
# 27a: 5d pop %rbp
# 27b: c3 retq
# 27c: 0f 1f 40 00 nopl 0x0(%rax)
#
#0000000000000280 <debug_frame4>:
# 280: 55 push %rbp
# 281: 48 89 e5 mov %rsp,%rbp
# 284: 89 7d fc mov %edi,-0x4(%rbp)
# 287: 8b 45 fc mov -0x4(%rbp),%eax
# 28a: 5d pop %rbp
# 28b: c3 retq
- Name: .eh_frame
Type: SHT_X86_64_UNWIND
Flags: [ SHF_ALLOC ]
Address: 0x0000000000000290
AddressAlign: 0x0000000000000008
Content: 1400000000000000017A5200017810011B0C0708900100001C0000001C000000B0FFFFFF0C00000000410E108602430D0600000000000000
#00000000 0000000000000014 00000000 CIE
# Version: 1
# Augmentation: "zR"
# Code alignment factor: 1
# Data alignment factor: -8
# Return address column: 16
# Augmentation data: 1b
#
# DW_CFA_def_cfa: r7 (rsp) ofs 8
# DW_CFA_offset: r16 (rip) at cfa-8
# DW_CFA_nop
# DW_CFA_nop
#
#00000018 000000000000001c 0000001c FDE cie=00000000 pc=ffffffffffffffd0..ffffffffffffffdc
# DW_CFA_advance_loc: 1 to ffffffffffffffd1
# DW_CFA_def_cfa_offset: 16
# DW_CFA_offset: r6 (rbp) at cfa-16
# DW_CFA_advance_loc: 3 to ffffffffffffffd4
# DW_CFA_def_cfa_register: r6 (rbp)
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
- Name: .debug_frame
Type: SHT_PROGBITS
AddressAlign: 0x0000000000000008
Content: 14000000FFFFFFFF03000178100C070890010000000000001C0000000000000070020000000000000C00000000000000410E108602430D0614000000FFFFFFFF040008000178100C07089001000000001C0000003800000080020000000000000C00000000000000410E108602430D06
#00000000 0000000000000014 ffffffff CIE
# Version: 3
# Augmentation: ""
# Code alignment factor: 1
# Data alignment factor: -8
# Return address column: 16
#
# DW_CFA_def_cfa: r7 (rsp) ofs 8
# DW_CFA_offset: r16 (rip) at cfa-8
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
#
#00000018 000000000000001c 00000000 FDE cie=00000000 pc=0000000000000270..000000000000027c
# DW_CFA_advance_loc: 1 to 0000000000000271
# DW_CFA_def_cfa_offset: 16
# DW_CFA_offset: r6 (rbp) at cfa-16
# DW_CFA_advance_loc: 3 to 0000000000000274
# DW_CFA_def_cfa_register: r6 (rbp)
#
#00000038 0000000000000014 ffffffff CIE
# Version: 4
# Augmentation: ""
# Pointer Size: 8
# Segment Size: 0
# Code alignment factor: 1
# Data alignment factor: -8
# Return address column: 16
#
# DW_CFA_def_cfa: r7 (rsp) ofs 8
# DW_CFA_offset: r16 (rip) at cfa-8
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
#
#00000050 000000000000001c 00000038 FDE cie=00000038 pc=0000000000000280..000000000000028c
# DW_CFA_advance_loc: 1 to 0000000000000281
# DW_CFA_def_cfa_offset: 16
# DW_CFA_offset: r6 (rbp) at cfa-16
# DW_CFA_advance_loc: 3 to 0000000000000284
# DW_CFA_def_cfa_register: r6 (rbp)
Symbols:
- Name: eh_frame
Type: STT_FUNC
Section: .text
Value: 0x0000000000000260
Size: 0x000000000000000C
Binding: STB_GLOBAL
- Name: debug_frame3
Type: STT_FUNC
Section: .text
Value: 0x0000000000000270
Size: 0x000000000000000C
Binding: STB_GLOBAL
- Name: debug_frame4
Type: STT_FUNC
Section: .text
Value: 0x0000000000000280
Size: 0x000000000000000C
Binding: STB_GLOBAL
...

View File

@ -87,14 +87,152 @@ static UnwindPlan::Row GetExpectedRow2() {
void DWARFCallFrameInfoTest::TestBasic(DWARFCallFrameInfo::Type type, void DWARFCallFrameInfoTest::TestBasic(DWARFCallFrameInfo::Type type,
llvm::StringRef symbol) { llvm::StringRef symbol) {
llvm::SmallString<128> obj; auto ExpectedFile = TestFile::fromYaml(R"(
ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( --- !ELF
"basic-call-frame-info-%%%%%%", "obj", obj)); FileHeader:
llvm::FileRemover obj_remover(obj); Class: ELFCLASS64
ASSERT_THAT_ERROR(ReadYAMLObjectFile("basic-call-frame-info.yaml", obj), Data: ELFDATA2LSB
llvm::Succeeded()); Type: ET_DYN
Machine: EM_X86_64
Entry: 0x0000000000000260
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x0000000000000260
AddressAlign: 0x0000000000000010
Content: 554889E5897DFC8B45FC5DC30F1F4000554889E5897DFC8B45FC5DC30F1F4000554889E5897DFC8B45FC5DC3
#0000000000000260 <eh_frame>:
# 260: 55 push %rbp
# 261: 48 89 e5 mov %rsp,%rbp
# 264: 89 7d fc mov %edi,-0x4(%rbp)
# 267: 8b 45 fc mov -0x4(%rbp),%eax
# 26a: 5d pop %rbp
# 26b: c3 retq
# 26c: 0f 1f 40 00 nopl 0x0(%rax)
#
#0000000000000270 <debug_frame3>:
# 270: 55 push %rbp
# 271: 48 89 e5 mov %rsp,%rbp
# 274: 89 7d fc mov %edi,-0x4(%rbp)
# 277: 8b 45 fc mov -0x4(%rbp),%eax
# 27a: 5d pop %rbp
# 27b: c3 retq
# 27c: 0f 1f 40 00 nopl 0x0(%rax)
#
#0000000000000280 <debug_frame4>:
# 280: 55 push %rbp
# 281: 48 89 e5 mov %rsp,%rbp
# 284: 89 7d fc mov %edi,-0x4(%rbp)
# 287: 8b 45 fc mov -0x4(%rbp),%eax
# 28a: 5d pop %rbp
# 28b: c3 retq
- Name: .eh_frame
Type: SHT_X86_64_UNWIND
Flags: [ SHF_ALLOC ]
Address: 0x0000000000000290
AddressAlign: 0x0000000000000008
Content: 1400000000000000017A5200017810011B0C0708900100001C0000001C000000B0FFFFFF0C00000000410E108602430D0600000000000000
#00000000 0000000000000014 00000000 CIE
# Version: 1
# Augmentation: "zR"
# Code alignment factor: 1
# Data alignment factor: -8
# Return address column: 16
# Augmentation data: 1b
#
# DW_CFA_def_cfa: r7 (rsp) ofs 8
# DW_CFA_offset: r16 (rip) at cfa-8
# DW_CFA_nop
# DW_CFA_nop
#
#00000018 000000000000001c 0000001c FDE cie=00000000 pc=ffffffffffffffd0..ffffffffffffffdc
# DW_CFA_advance_loc: 1 to ffffffffffffffd1
# DW_CFA_def_cfa_offset: 16
# DW_CFA_offset: r6 (rbp) at cfa-16
# DW_CFA_advance_loc: 3 to ffffffffffffffd4
# DW_CFA_def_cfa_register: r6 (rbp)
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
- Name: .debug_frame
Type: SHT_PROGBITS
AddressAlign: 0x0000000000000008
Content: 14000000FFFFFFFF03000178100C070890010000000000001C0000000000000070020000000000000C00000000000000410E108602430D0614000000FFFFFFFF040008000178100C07089001000000001C0000003800000080020000000000000C00000000000000410E108602430D06
#00000000 0000000000000014 ffffffff CIE
# Version: 3
# Augmentation: ""
# Code alignment factor: 1
# Data alignment factor: -8
# Return address column: 16
#
# DW_CFA_def_cfa: r7 (rsp) ofs 8
# DW_CFA_offset: r16 (rip) at cfa-8
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
#
#00000018 000000000000001c 00000000 FDE cie=00000000 pc=0000000000000270..000000000000027c
# DW_CFA_advance_loc: 1 to 0000000000000271
# DW_CFA_def_cfa_offset: 16
# DW_CFA_offset: r6 (rbp) at cfa-16
# DW_CFA_advance_loc: 3 to 0000000000000274
# DW_CFA_def_cfa_register: r6 (rbp)
#
#00000038 0000000000000014 ffffffff CIE
# Version: 4
# Augmentation: ""
# Pointer Size: 8
# Segment Size: 0
# Code alignment factor: 1
# Data alignment factor: -8
# Return address column: 16
#
# DW_CFA_def_cfa: r7 (rsp) ofs 8
# DW_CFA_offset: r16 (rip) at cfa-8
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
# DW_CFA_nop
#
#00000050 000000000000001c 00000038 FDE cie=00000038 pc=0000000000000280..000000000000028c
# DW_CFA_advance_loc: 1 to 0000000000000281
# DW_CFA_def_cfa_offset: 16
# DW_CFA_offset: r6 (rbp) at cfa-16
# DW_CFA_advance_loc: 3 to 0000000000000284
# DW_CFA_def_cfa_register: r6 (rbp)
Symbols:
- Name: eh_frame
Type: STT_FUNC
Section: .text
Value: 0x0000000000000260
Size: 0x000000000000000C
Binding: STB_GLOBAL
- Name: debug_frame3
Type: STT_FUNC
Section: .text
Value: 0x0000000000000270
Size: 0x000000000000000C
Binding: STB_GLOBAL
- Name: debug_frame4
Type: STT_FUNC
Section: .text
Value: 0x0000000000000280
Size: 0x000000000000000C
Binding: STB_GLOBAL
...
)");
ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
auto module_sp = std::make_shared<Module>(ModuleSpec(FileSpec(obj))); auto module_sp =
std::make_shared<Module>(ModuleSpec(FileSpec(ExpectedFile->name())));
SectionList *list = module_sp->GetSectionList(); SectionList *list = module_sp->GetSectionList();
ASSERT_NE(nullptr, list); ASSERT_NE(nullptr, list);

View File

@ -33,13 +33,7 @@ using namespace lldb;
class LineEntryTest : public testing::Test { class LineEntryTest : public testing::Test {
public: public:
void SetUp() override { void SetUp() override;
FileSystem::Initialize();
HostInfo::Initialize();
ObjectFileMachO::Initialize();
SymbolFileDWARF::Initialize();
ClangASTContext::Initialize();
}
void TearDown() override { void TearDown() override {
ClangASTContext::Terminate(); ClangASTContext::Terminate();
@ -50,44 +44,32 @@ public:
} }
protected: protected:
llvm::Expected<ModuleSP> GetModule();
llvm::Expected<LineEntry> GetLineEntryForLine(uint32_t line); llvm::Expected<LineEntry> GetLineEntryForLine(uint32_t line);
llvm::Optional<TestFile> m_file;
ModuleSP m_module_sp; ModuleSP m_module_sp;
}; };
llvm::Expected<ModuleSP> LineEntryTest::GetModule() { void LineEntryTest::SetUp() {
if (m_module_sp) FileSystem::Initialize();
return m_module_sp; HostInfo::Initialize();
ObjectFileMachO::Initialize();
llvm::SmallString<128> obj; SymbolFileDWARF::Initialize();
if (auto ec = llvm::sys::fs::createTemporaryFile("source-%%%%%%", "obj", obj)) ClangASTContext::Initialize();
return llvm::errorCodeToError(ec); auto ExpectedFile = TestFile::fromYamlFile("inlined-functions.yaml");
llvm::FileRemover obj_remover(obj); ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
if (auto error = ReadYAMLObjectFile("inlined-functions.yaml", obj)) m_file.emplace(std::move(*ExpectedFile));
return llvm::Error(std::move(error)); m_module_sp = std::make_shared<Module>(ModuleSpec(FileSpec(m_file->name())));
m_module_sp = std::make_shared<Module>(ModuleSpec(FileSpec(obj)));
// Preload because the temporary file will be gone once we exit this function.
m_module_sp->PreloadSymbols();
return m_module_sp;
} }
llvm::Expected<LineEntry> LineEntryTest::GetLineEntryForLine(uint32_t line) { llvm::Expected<LineEntry> LineEntryTest::GetLineEntryForLine(uint32_t line) {
auto expected_module_so = GetModule();
if (!expected_module_so)
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"Not able to get module for test object.");
auto module = expected_module_so->get();
bool check_inlines = true; bool check_inlines = true;
bool exact = true; bool exact = true;
SymbolContextList sc_comp_units; SymbolContextList sc_comp_units;
SymbolContextList sc_line_entries; SymbolContextList sc_line_entries;
FileSpec file_spec("inlined-functions.cpp"); FileSpec file_spec("inlined-functions.cpp");
module->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines, m_module_sp->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
lldb::eSymbolContextCompUnit, lldb::eSymbolContextCompUnit,
sc_comp_units); sc_comp_units);
if (sc_comp_units.GetSize() == 0) if (sc_comp_units.GetSize() == 0)
return llvm::createStringError(llvm::inconvertibleErrorCode(), return llvm::createStringError(llvm::inconvertibleErrorCode(),
"No comp unit found on the test object."); "No comp unit found on the test object.");

View File

@ -8,7 +8,5 @@ add_lldb_library(lldbUtilityHelpers
LINK_COMPONENTS LINK_COMPONENTS
Support Support
ObjectYAML
) )
add_dependencies(lldbUtilityHelpers yaml2obj)
add_definitions(-DYAML2OBJ="$<TARGET_FILE:yaml2obj>")

View File

@ -8,9 +8,14 @@
#include "TestUtilities.h" #include "TestUtilities.h"
#include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallString.h"
#include "llvm/ObjectYAML/yaml2obj.h"
#include "llvm/Support/FileSystem.h" #include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h" #include "llvm/Support/Path.h"
#include "llvm/Support/Program.h" #include "llvm/Support/Program.h"
#include "llvm/Support/YAMLTraits.h"
#include "gtest/gtest.h"
using namespace lldb_private;
extern const char *TestMainArgv0; extern const char *TestMainArgv0;
@ -21,23 +26,39 @@ std::string lldb_private::GetInputFilePath(const llvm::Twine &name) {
return result.str(); return result.str();
} }
llvm::Error llvm::Expected<TestFile> TestFile::fromYaml(llvm::StringRef Yaml) {
lldb_private::ReadYAMLObjectFile(const llvm::Twine &yaml_name, const auto *Info = testing::UnitTest::GetInstance()->current_test_info();
llvm::SmallString<128> &object_file) { assert(Info);
std::string yaml = GetInputFilePath(yaml_name); llvm::SmallString<128> Name;
llvm::StringRef args[] = {YAML2OBJ, yaml}; int FD;
llvm::StringRef obj_ref = object_file; if (std::error_code EC = llvm::sys::fs::createTemporaryFile(
const llvm::Optional<llvm::StringRef> redirects[] = {llvm::None, obj_ref, llvm::Twine(Info->test_case_name()) + "-" + Info->name(), "test", FD,
llvm::None}; Name))
if (llvm::sys::ExecuteAndWait(YAML2OBJ, args, llvm::None, redirects) != 0) return llvm::errorCodeToError(EC);
return llvm::createStringError(llvm::inconvertibleErrorCode(), llvm::FileRemover Remover(Name);
"Error running yaml2obj %s.", yaml.c_str()); {
uint64_t size; llvm::raw_fd_ostream OS(FD, /*shouldClose*/ true);
if (auto ec = llvm::sys::fs::file_size(object_file, size)) llvm::yaml::Input YIn(Yaml);
return llvm::errorCodeToError(ec); if (llvm::Error E = llvm::yaml::convertYAML(YIn, OS))
if (size == 0) return std::move(E);
return llvm::createStringError( }
llvm::inconvertibleErrorCode(), return TestFile(Name, std::move(Remover));
"Empty object file created from yaml2obj %s.", yaml.c_str()); }
return llvm::Error::success();
llvm::Expected<TestFile> TestFile::fromYamlFile(const llvm::Twine &Name) {
auto BufferOrError =
llvm::MemoryBuffer::getFile(GetInputFilePath(Name), /*FileSize*/ -1,
/*RequiresNullTerminator*/ false);
if (!BufferOrError)
return llvm::errorCodeToError(BufferOrError.getError());
return fromYaml(BufferOrError.get()->getBuffer());
}
TestFile::~TestFile() {
if (!Name)
return;
if (std::error_code EC =
llvm::sys::fs::remove(*Name, /*IgnoreNonExisting*/ false))
GTEST_LOG_(WARNING) << "Failed to delete `" << Name->c_str()
<< "`: " << EC.message();
} }

View File

@ -12,6 +12,7 @@
#include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallString.h"
#include "llvm/ADT/Twine.h" #include "llvm/ADT/Twine.h"
#include "llvm/Support/Error.h" #include "llvm/Support/Error.h"
#include "llvm/Support/FileUtilities.h"
#include <string> #include <string>
#define ASSERT_NO_ERROR(x) \ #define ASSERT_NO_ERROR(x) \
@ -27,8 +28,28 @@
namespace lldb_private { namespace lldb_private {
std::string GetInputFilePath(const llvm::Twine &name); std::string GetInputFilePath(const llvm::Twine &name);
llvm::Error ReadYAMLObjectFile(const llvm::Twine &yaml_name,
llvm::SmallString<128> &obj); class TestFile {
public:
static llvm::Expected<TestFile> fromYaml(llvm::StringRef Yaml);
static llvm::Expected<TestFile> fromYamlFile(const llvm::Twine &Name);
TestFile(TestFile &&RHS) : Name(std::move(RHS.Name)) {
RHS.Name = llvm::None;
}
~TestFile();
llvm::StringRef name() { return *Name; }
private:
TestFile(llvm::StringRef Name, llvm::FileRemover &&Remover) : Name(Name) {
Remover.releaseFile();
}
void operator=(const TestFile &) = delete;
llvm::Optional<std::string> Name;
};
} }
#endif #endif