# REQUIRES: x86, zlib
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/gdb-index.s -o %t2.o
# RUN: ld.lld --gdb-index %t1.o %t2.o -o %t

# RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=DISASM
# RUN: llvm-dwarfdump -gdb-index %t | FileCheck %s --check-prefix=DWARF

## Drop .debug_gnu_pubnames and .debug_gnu_pubtypes.
## Also drop their relocation sections if --emit-relocs is specified.
# RUN: ld.lld --gdb-index --emit-relocs %t1.o %t2.o -o %t1
# RUN: llvm-readelf --sections %t1 | FileCheck %s --check-prefix=SECTION

# SECTION-NOT: .debug_gnu_pubnames
# SECTION-NOT: .debug_gnu_pubtypes

# RUN: llvm-mc -compress-debug-sections=zlib -filetype=obj -triple=x86_64-pc-linux \
# RUN:   %p/Inputs/gdb-index.s -o %t2.o
# RUN: ld.lld --gdb-index %t1.o %t2.o -o %t

# RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=DISASM
# RUN: llvm-dwarfdump -gdb-index %t | FileCheck %s --check-prefix=DWARF
# RUN: llvm-readelf -S %t | FileCheck %s --check-prefix=SECTION

# RUN: %if zstd %{ llvm-mc -compress-debug-sections=zlib -filetype=obj -triple=x86_64 %p/Inputs/gdb-index.s -o %t2.o %}
# RUN: %if zstd %{ ld.lld --gdb-index %t1.o %t2.o -o %t %}
# RUN: %if zstd %{ llvm-objdump -d %t | FileCheck %s --check-prefix=DISASM %}
# RUN: %if zstd %{ llvm-dwarfdump --gdb-index %t | FileCheck %s --check-prefix=DWARF %}
# RUN: %if zstd %{ llvm-readelf -S %t | FileCheck %s --check-prefix=SECTION %}

# DISASM:       Disassembly of section .text:
# DISASM-EMPTY:
# DISASM:       <entrypoint>:
# DISASM-CHECK:   201000: 90 nop
# DISASM-CHECK:   201001: cc int3
# DISASM-CHECK:   201002: cc int3
# DISASM-CHECK:   201003: cc int3
# DISASM:       <aaaaaaaaaaaaaaaa>:
# DISASM-CHECK:   201004: 90 nop
# DISASM-CHECK:   201005: 90 nop

# DWARF:      .gdb_index contents:
# DWARF-NEXT:    Version = 7
# DWARF:       CU list offset = 0x18, has 2 entries:
# DWARF-NEXT:    0: Offset = 0x0, Length = 0x34
# DWARF-NEXT:    1: Offset = 0x34, Length = 0x34
# DWARF:       Address area offset = 0x38, has 2 entries:
# DWARF-NEXT:    Low/High address = [0x201120, 0x201121) (Size: 0x1), CU id = 0
# DWARF-NEXT:    Low/High address = [0x201124, 0x201126) (Size: 0x2), CU id = 1
# DWARF:       Symbol table offset = 0x60, size = 1024, filled slots:
# DWARF-NEXT:    512: Name offset = 0x1c, CU vector offset = 0x0
# DWARF-NEXT:      String name: aaaaaaaaaaaaaaaa, CU vector index: 0
# DWARF-NEXT:    754: Name offset = 0x38, CU vector offset = 0x10
# DWARF-NEXT:      String name: int, CU vector index: 2
# DWARF-NEXT:    822: Name offset = 0x2d, CU vector offset = 0x8
# DWARF-NEXT:      String name: entrypoint, CU vector index: 1
# DWARF:       Constant pool offset = 0x2060, has 3 CU vectors:
# DWARF-NEXT:    0(0x0): 0x30000001
# DWARF-NEXT:    1(0x8): 0x30000000
# DWARF-NEXT:    2(0x10): 0x90000000 0x90000001

# RUN: ld.lld --gdb-index --no-gdb-index %t1.o %t2.o -o %t2
# RUN: llvm-readobj --sections %t2 | FileCheck -check-prefix=NOGDB %s
# NOGDB-NOT: Name: .gdb_index

## The following section contents are created by this using gcc 7.1.0:
## echo 'int entrypoint() { return 0; }' | gcc -gsplit-dwarf -xc++ -S -o- -

.text
.Ltext0:
.globl entrypoint
.type entrypoint, @function
entrypoint:
 nop
.Letext0:

.section .debug_info,"",@progbits
.long 0x30
.value 0x4
.long 0
.byte 0x8
.uleb128 0x1
.quad .Ltext0
.quad .Letext0-.Ltext0
.long 0
.long 0
.long 0
.long 0
.byte 0x63
.byte 0x88
.byte 0xb4
.byte 0x61
.byte 0xaa
.byte 0xb6
.byte 0xb0
.byte 0x67

.section .debug_abbrev,"",@progbits
.uleb128 0x1
.uleb128 0x11
.byte 0
.uleb128 0x11
.uleb128 0x1
.uleb128 0x12
.uleb128 0x7
.uleb128 0x10
.uleb128 0x17
.uleb128 0x2130
.uleb128 0xe
.uleb128 0x1b
.uleb128 0xe
.uleb128 0x2134
.uleb128 0x19
.uleb128 0x2133
.uleb128 0x17
.uleb128 0x2131
.uleb128 0x7
.byte 0
.byte 0
.byte 0

.section .debug_gnu_pubnames,"",@progbits
.long 0x1e
.value 0x2
.long .debug_info
.long 0x33
.long 0x18
.byte 0x30
.string "entrypoint"
.long 0

.section .debug_gnu_pubtypes,"",@progbits
.long 0x17
.value 0x2
.long .debug_info
.long 0x33
.long 0x2b
.byte 0x90
.string "int"
.long 0
