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:
parent
cc0ba28cf0
commit
a2e270fa70
|
@ -15,8 +15,3 @@ add_lldb_unittest(LLDBCoreTests
|
|||
LINK_COMPONENTS
|
||||
Support
|
||||
)
|
||||
|
||||
set(test_inputs
|
||||
mangled-function-names.yaml
|
||||
)
|
||||
add_unittest_inputs(LLDBCoreTests "${test_inputs}")
|
||||
|
|
|
@ -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
|
||||
...
|
|
@ -56,15 +56,113 @@ TEST(MangledTest, NameIndexes_FindFunctionSymbols) {
|
|||
ObjectFileELF::Initialize();
|
||||
SymbolFileSymtab::Initialize();
|
||||
|
||||
llvm::SmallString<128> Obj;
|
||||
ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile(
|
||||
"mangled-function-names-%%%%%%", "obj", Obj));
|
||||
llvm::FileRemover Deleter(Obj);
|
||||
ASSERT_THAT_ERROR(ReadYAMLObjectFile("mangled-function-names.yaml", Obj),
|
||||
llvm::Succeeded());
|
||||
auto ExpectedFile = TestFile::fromYaml(R"(
|
||||
--- !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
|
||||
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)};
|
||||
Spec.GetSymbolFileSpec().SetFile(Obj, FileSpec::Style::native);
|
||||
ModuleSpec Spec{FileSpec(ExpectedFile->name())};
|
||||
auto M = std::make_shared<Module>(Spec);
|
||||
|
||||
auto Count = [M](const char *Name, FunctionNameType Type) -> int {
|
||||
|
|
|
@ -11,6 +11,5 @@ add_lldb_unittest(ObjectFileELFTests
|
|||
|
||||
set(test_inputs
|
||||
early-section-headers.so
|
||||
sections-resolve-consistently.yaml
|
||||
)
|
||||
add_unittest_inputs(ObjectFileELFTests "${test_inputs}")
|
||||
|
|
|
@ -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
|
||||
...
|
|
@ -48,16 +48,65 @@ protected:
|
|||
};
|
||||
|
||||
TEST_F(ObjectFileELFTest, SectionsResolveConsistently) {
|
||||
llvm::SmallString<128> obj;
|
||||
ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile(
|
||||
"sections-resolve-consistently-%%%%%%", "obj", obj));
|
||||
llvm::FileRemover remover(obj);
|
||||
ASSERT_THAT_ERROR(
|
||||
ReadYAMLObjectFile("sections-resolve-consistently.yaml", obj),
|
||||
llvm::Succeeded());
|
||||
auto ExpectedFile = TestFile::fromYaml(R"(
|
||||
--- !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
|
||||
...
|
||||
)");
|
||||
ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
|
||||
|
||||
ModuleSpec spec{FileSpec(obj)};
|
||||
spec.GetSymbolFileSpec().SetFile(obj, FileSpec::Style::native);
|
||||
ModuleSpec spec{FileSpec(ExpectedFile->name())};
|
||||
spec.GetSymbolFileSpec().SetFile(ExpectedFile->name(),
|
||||
FileSpec::Style::native);
|
||||
auto module_sp = std::make_shared<Module>(spec);
|
||||
SectionList *list = module_sp->GetSectionList();
|
||||
ASSERT_NE(nullptr, list);
|
||||
|
|
|
@ -18,7 +18,6 @@ add_lldb_unittest(SymbolTests
|
|||
)
|
||||
|
||||
set(test_inputs
|
||||
basic-call-frame-info.yaml
|
||||
inlined-functions.yaml
|
||||
)
|
||||
add_unittest_inputs(SymbolTests "${test_inputs}")
|
||||
|
|
|
@ -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
|
||||
...
|
|
@ -87,14 +87,152 @@ static UnwindPlan::Row GetExpectedRow2() {
|
|||
|
||||
void DWARFCallFrameInfoTest::TestBasic(DWARFCallFrameInfo::Type type,
|
||||
llvm::StringRef symbol) {
|
||||
llvm::SmallString<128> obj;
|
||||
ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile(
|
||||
"basic-call-frame-info-%%%%%%", "obj", obj));
|
||||
llvm::FileRemover obj_remover(obj);
|
||||
ASSERT_THAT_ERROR(ReadYAMLObjectFile("basic-call-frame-info.yaml", obj),
|
||||
llvm::Succeeded());
|
||||
auto ExpectedFile = TestFile::fromYaml(R"(
|
||||
--- !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
|
||||
...
|
||||
)");
|
||||
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();
|
||||
ASSERT_NE(nullptr, list);
|
||||
|
||||
|
|
|
@ -33,13 +33,7 @@ using namespace lldb;
|
|||
|
||||
class LineEntryTest : public testing::Test {
|
||||
public:
|
||||
void SetUp() override {
|
||||
FileSystem::Initialize();
|
||||
HostInfo::Initialize();
|
||||
ObjectFileMachO::Initialize();
|
||||
SymbolFileDWARF::Initialize();
|
||||
ClangASTContext::Initialize();
|
||||
}
|
||||
void SetUp() override;
|
||||
|
||||
void TearDown() override {
|
||||
ClangASTContext::Terminate();
|
||||
|
@ -50,42 +44,30 @@ public:
|
|||
}
|
||||
|
||||
protected:
|
||||
llvm::Expected<ModuleSP> GetModule();
|
||||
llvm::Expected<LineEntry> GetLineEntryForLine(uint32_t line);
|
||||
llvm::Optional<TestFile> m_file;
|
||||
ModuleSP m_module_sp;
|
||||
};
|
||||
|
||||
llvm::Expected<ModuleSP> LineEntryTest::GetModule() {
|
||||
if (m_module_sp)
|
||||
return m_module_sp;
|
||||
|
||||
llvm::SmallString<128> obj;
|
||||
if (auto ec = llvm::sys::fs::createTemporaryFile("source-%%%%%%", "obj", obj))
|
||||
return llvm::errorCodeToError(ec);
|
||||
llvm::FileRemover obj_remover(obj);
|
||||
if (auto error = ReadYAMLObjectFile("inlined-functions.yaml", obj))
|
||||
return llvm::Error(std::move(error));
|
||||
|
||||
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;
|
||||
void LineEntryTest::SetUp() {
|
||||
FileSystem::Initialize();
|
||||
HostInfo::Initialize();
|
||||
ObjectFileMachO::Initialize();
|
||||
SymbolFileDWARF::Initialize();
|
||||
ClangASTContext::Initialize();
|
||||
auto ExpectedFile = TestFile::fromYamlFile("inlined-functions.yaml");
|
||||
ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
|
||||
m_file.emplace(std::move(*ExpectedFile));
|
||||
m_module_sp = std::make_shared<Module>(ModuleSpec(FileSpec(m_file->name())));
|
||||
}
|
||||
|
||||
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 exact = true;
|
||||
SymbolContextList sc_comp_units;
|
||||
SymbolContextList sc_line_entries;
|
||||
FileSpec file_spec("inlined-functions.cpp");
|
||||
module->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
|
||||
m_module_sp->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
|
||||
lldb::eSymbolContextCompUnit,
|
||||
sc_comp_units);
|
||||
if (sc_comp_units.GetSize() == 0)
|
||||
|
|
|
@ -8,7 +8,5 @@ add_lldb_library(lldbUtilityHelpers
|
|||
|
||||
LINK_COMPONENTS
|
||||
Support
|
||||
ObjectYAML
|
||||
)
|
||||
|
||||
add_dependencies(lldbUtilityHelpers yaml2obj)
|
||||
add_definitions(-DYAML2OBJ="$<TARGET_FILE:yaml2obj>")
|
|
@ -8,9 +8,14 @@
|
|||
|
||||
#include "TestUtilities.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ObjectYAML/yaml2obj.h"
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/Program.h"
|
||||
#include "llvm/Support/YAMLTraits.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
using namespace lldb_private;
|
||||
|
||||
extern const char *TestMainArgv0;
|
||||
|
||||
|
@ -21,23 +26,39 @@ std::string lldb_private::GetInputFilePath(const llvm::Twine &name) {
|
|||
return result.str();
|
||||
}
|
||||
|
||||
llvm::Error
|
||||
lldb_private::ReadYAMLObjectFile(const llvm::Twine &yaml_name,
|
||||
llvm::SmallString<128> &object_file) {
|
||||
std::string yaml = GetInputFilePath(yaml_name);
|
||||
llvm::StringRef args[] = {YAML2OBJ, yaml};
|
||||
llvm::StringRef obj_ref = object_file;
|
||||
const llvm::Optional<llvm::StringRef> redirects[] = {llvm::None, obj_ref,
|
||||
llvm::None};
|
||||
if (llvm::sys::ExecuteAndWait(YAML2OBJ, args, llvm::None, redirects) != 0)
|
||||
return llvm::createStringError(llvm::inconvertibleErrorCode(),
|
||||
"Error running yaml2obj %s.", yaml.c_str());
|
||||
uint64_t size;
|
||||
if (auto ec = llvm::sys::fs::file_size(object_file, size))
|
||||
return llvm::errorCodeToError(ec);
|
||||
if (size == 0)
|
||||
return llvm::createStringError(
|
||||
llvm::inconvertibleErrorCode(),
|
||||
"Empty object file created from yaml2obj %s.", yaml.c_str());
|
||||
return llvm::Error::success();
|
||||
llvm::Expected<TestFile> TestFile::fromYaml(llvm::StringRef Yaml) {
|
||||
const auto *Info = testing::UnitTest::GetInstance()->current_test_info();
|
||||
assert(Info);
|
||||
llvm::SmallString<128> Name;
|
||||
int FD;
|
||||
if (std::error_code EC = llvm::sys::fs::createTemporaryFile(
|
||||
llvm::Twine(Info->test_case_name()) + "-" + Info->name(), "test", FD,
|
||||
Name))
|
||||
return llvm::errorCodeToError(EC);
|
||||
llvm::FileRemover Remover(Name);
|
||||
{
|
||||
llvm::raw_fd_ostream OS(FD, /*shouldClose*/ true);
|
||||
llvm::yaml::Input YIn(Yaml);
|
||||
if (llvm::Error E = llvm::yaml::convertYAML(YIn, OS))
|
||||
return std::move(E);
|
||||
}
|
||||
return TestFile(Name, std::move(Remover));
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Support/Error.h"
|
||||
#include "llvm/Support/FileUtilities.h"
|
||||
#include <string>
|
||||
|
||||
#define ASSERT_NO_ERROR(x) \
|
||||
|
@ -27,8 +28,28 @@
|
|||
|
||||
namespace lldb_private {
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue