gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / incremental-dump.cc
index e59b1c5f5b1d2431c7e1085de649e4327fc8de70..1b561ae9680ffd62fdf7efd61010e17aaf254129 100644 (file)
@@ -1,6 +1,6 @@
 // incremental.cc -- incremental linking test/debug tool
 
-// Copyright 2009, 2010 Free Software Foundation, Inc.
+// Copyright (C) 2009-2020 Free Software Foundation, Inc.
 // Written by Rafael Avila de Espindola <rafael.espindola@gmail.com>
 
 // This file is part of gold.
@@ -52,6 +52,9 @@ find_input_containing_global(
     unsigned int* symndx)
 {
   typedef Incremental_inputs_reader<size, big_endian> Inputs_reader;
+  static const unsigned int global_sym_entry_size =
+      Incremental_inputs_reader<size, big_endian>::global_sym_entry_size;
+
   for (unsigned int i = 0; i < incremental_inputs.input_file_count(); ++i)
     {
       typename Inputs_reader::Incremental_input_entry_reader input_file =
@@ -63,7 +66,8 @@ find_input_containing_global(
       if (offset >= input_file.get_symbol_offset(0)
           && offset < input_file.get_symbol_offset(nsyms))
        {
-         *symndx = (offset - input_file.get_symbol_offset(0)) / 16;
+         *symndx = ((offset - input_file.get_symbol_offset(0))
+                    / global_sym_entry_size);
          return input_file;
        }
     }
@@ -73,50 +77,26 @@ find_input_containing_global(
 template<int size, bool big_endian>
 static void
 dump_incremental_inputs(const char* argv0, const char* filename,
-                       Incremental_binary* inc)
+                       Sized_incremental_binary<size, big_endian>* inc)
 {
-  bool t;
-  unsigned int inputs_shndx;
-  unsigned int isymtab_shndx;
-  unsigned int irelocs_shndx;
-  unsigned int igot_plt_shndx;
-  unsigned int istrtab_shndx;
   typedef Incremental_binary::Location Location;
   typedef Incremental_binary::View View;
   typedef Incremental_inputs_reader<size, big_endian> Inputs_reader;
   typedef typename Inputs_reader::Incremental_input_entry_reader Entry_reader;
 
-  // Find the .gnu_incremental_inputs, _symtab, _relocs, and _strtab sections.
-
-  t = inc->find_incremental_inputs_sections(&inputs_shndx, &isymtab_shndx,
-                                           &irelocs_shndx, &igot_plt_shndx,
-                                           &istrtab_shndx);
-  if (!t)
+  if (!inc->has_incremental_info())
     {
       fprintf(stderr, "%s: %s: no .gnu_incremental_inputs section\n", argv0,
               filename);
       exit(1);
     }
 
-  elfcpp::Elf_file<size, big_endian, Incremental_binary> elf_file(inc);
-
-  // Get a view of the .gnu_incremental_inputs section.
-
-  Location inputs_location(elf_file.section_contents(inputs_shndx));
-  View inputs_view(inc->view(inputs_location));
-
-  // Get the .gnu_incremental_strtab section as a string table.
-
-  Location istrtab_location(elf_file.section_contents(istrtab_shndx));
-  View istrtab_view(inc->view(istrtab_location));
-  elfcpp::Elf_strtab istrtab(istrtab_view.data(), istrtab_location.data_size);
-
   // Create a reader object for the .gnu_incremental_inputs section.
 
   Incremental_inputs_reader<size, big_endian>
-      incremental_inputs(inputs_view.data(), istrtab);
+      incremental_inputs(inc->inputs_reader());
 
-  if (incremental_inputs.version() != 1)
+  if (incremental_inputs.version() != 2)
     {
       fprintf(stderr, "%s: %s: unknown incremental version %d\n", argv0,
               filename, incremental_inputs.version());
@@ -153,23 +133,32 @@ dump_incremental_inputs(const char* argv0, const char* filename,
             mtime.nanoseconds,
             ctime(&mtime.seconds));
 
+      printf("    Serial Number: %d\n", input_file.arg_serial());
+      printf("    In System Directory: %s\n",
+            input_file.is_in_system_directory() ? "true" : "false");
+
       Incremental_input_type input_type = input_file.type();
       printf("    Type: ");
       switch (input_type)
        {
        case INCREMENTAL_INPUT_OBJECT:
-         printf("Object\n");
-         printf("    Input section count: %d\n",
-                input_file.get_input_section_count());
-         printf("    Symbol count: %d\n",
-                input_file.get_global_symbol_count());
-         break;
        case INCREMENTAL_INPUT_ARCHIVE_MEMBER:
-         printf("Archive member\n");
+         printf("%s\n", (input_type == INCREMENTAL_INPUT_OBJECT
+                         ? "Object" : "Archive member"));
          printf("    Input section count: %d\n",
                 input_file.get_input_section_count());
-         printf("    Symbol count: %d\n",
+         printf("    Global symbol count: %d\n",
                 input_file.get_global_symbol_count());
+         printf("    Local symbol offset: %d\n",
+                input_file.get_local_symbol_offset());
+         printf("    Local symbol count: %d\n",
+                input_file.get_local_symbol_count());
+         printf("    First dynamic reloc: %d\n",
+                input_file.get_first_dyn_reloc());
+         printf("    Dynamic reloc count: %d\n",
+                input_file.get_dyn_reloc_count());
+         printf("    COMDAT group count: %d\n",
+                input_file.get_comdat_group_count());
          break;
        case INCREMENTAL_INPUT_ARCHIVE:
          printf("Archive\n");
@@ -179,6 +168,10 @@ dump_incremental_inputs(const char* argv0, const char* filename,
          break;
        case INCREMENTAL_INPUT_SHARED_LIBRARY:
          printf("Shared library\n");
+         printf("    As needed: %s\n",
+                input_file.as_needed() ? "true" : "false");
+         printf("    soname: %s\n",
+                input_file.get_soname());
          printf("    Symbol count: %d\n",
                 input_file.get_global_symbol_count());
          break;
@@ -219,52 +212,23 @@ dump_incremental_inputs(const char* argv0, const char* filename,
        {
          typename Entry_reader::Input_section_info info(
              input_file.get_input_section(shndx));
-         printf("    %3d  %6d  %8lld  %8lld  %s\n", shndx,
+         printf("    %3d  %6d  %8lld  %8lld  %s\n", shndx + 1,
                 info.output_shndx,
                 static_cast<long long>(info.sh_offset),
                 static_cast<long long>(info.sh_size),
                 info.name);
        }
-    }
 
-  printf("\nGlobal symbols per input file:\n");
-  for (unsigned int i = 0; i < incremental_inputs.input_file_count(); ++i)
-    {
-      Entry_reader input_file(incremental_inputs.input_file(i));
-
-      if (input_file.type() != INCREMENTAL_INPUT_OBJECT
-         && input_file.type() != INCREMENTAL_INPUT_ARCHIVE_MEMBER)
-       continue;
-
-      const char* objname = input_file.filename();
-      if (objname == NULL)
-       {
-         fprintf(stderr,"%s: %s: failed to get file name for object %u\n",
-                 argv0, filename, i);
-         exit(1);
-       }
-
-      printf("[%d] %s\n", i, objname);
-
-      unsigned int nsyms = input_file.get_global_symbol_count();
-      if (nsyms > 0)
-       printf("    %6s  %8s  %8s  %8s  %8s\n",
-              "outndx", "offset", "chain", "#relocs", "rbase");
-      for (unsigned int symndx = 0; symndx < nsyms; ++symndx)
-       {
-         typename Entry_reader::Global_symbol_info info(
-             input_file.get_global_symbol_info(symndx));
-         printf("    %6d  %8d  %8d  %8d  %8d\n",
-                info.output_symndx,
-                input_file.get_symbol_offset(symndx),
-                info.next_offset,
-                info.reloc_count,
-                info.reloc_offset);
-       }
+      unsigned int ncomdat = input_file.get_comdat_group_count();
+      for (unsigned int i = 0; i < ncomdat; ++i)
+       printf("    Comdat group: %s\n",
+              input_file.get_comdat_group_signature(i));
     }
 
   // Get a view of the .symtab section.
 
+  elfcpp::Elf_file<size, big_endian, Incremental_binary> elf_file(inc);
+
   unsigned int symtab_shndx = elf_file.find_section_by_type(elfcpp::SHT_SYMTAB);
   if (symtab_shndx == elfcpp::SHN_UNDEF)  // Not found.
     {
@@ -288,16 +252,6 @@ dump_incremental_inputs(const char* argv0, const char* filename,
   View strtab_view(inc->view(strtab_location));
   elfcpp::Elf_strtab strtab(strtab_view.data(), strtab_location.data_size);
 
-  // Get a view of the .gnu_incremental_symtab section.
-
-  Location isymtab_location(elf_file.section_contents(isymtab_shndx));
-  View isymtab_view(inc->view(isymtab_location));
-
-  // Get a view of the .gnu_incremental_relocs section.
-
-  Location irelocs_location(elf_file.section_contents(irelocs_shndx));
-  View irelocs_view(inc->view(irelocs_location));
-
   // The .gnu_incremental_symtab section contains entries that parallel
   // the global symbols of the main symbol table.  The sh_info field
   // of the main symbol table's section header tells us how many global
@@ -306,16 +260,86 @@ dump_incremental_inputs(const char* argv0, const char* filename,
   // use the size of the .gnu_incremental_symtab section to deduce
   // the number of global symbols + forced-local symbols there are
   // in the symbol table.
+  Incremental_symtab_reader<big_endian> isymtab(inc->symtab_reader());
+  Incremental_relocs_reader<size, big_endian> irelocs(inc->relocs_reader());
   unsigned int sym_size = elfcpp::Elf_sizes<size>::sym_size;
   unsigned int nsyms = symtab_location.data_size / sym_size;
-  unsigned int nglobals = isymtab_location.data_size / 4;
+  unsigned int nglobals = isymtab.symbol_count();
   unsigned int first_global = nsyms - nglobals;
-  unsigned const char* sym_p = symtab_view.data() + first_global * sym_size;
-  unsigned const char* isym_p = isymtab_view.data();
+  unsigned const char* sym_p;
+
+  printf("\nGlobal symbols per input file:\n");
+  for (unsigned int i = 0; i < incremental_inputs.input_file_count(); ++i)
+    {
+      Entry_reader input_file(incremental_inputs.input_file(i));
 
-  Incremental_symtab_reader<big_endian> isymtab(isymtab_view.data());
-  Incremental_relocs_reader<size, big_endian> irelocs(irelocs_view.data());
+      if (input_file.type() != INCREMENTAL_INPUT_OBJECT
+         && input_file.type() != INCREMENTAL_INPUT_ARCHIVE_MEMBER
+         && input_file.type() != INCREMENTAL_INPUT_SHARED_LIBRARY)
+       continue;
+
+      const char* objname = input_file.filename();
+      if (objname == NULL)
+       {
+         fprintf(stderr,"%s: %s: failed to get file name for object %u\n",
+                 argv0, filename, i);
+         exit(1);
+       }
 
+      printf("[%d] %s\n", i, objname);
+
+      unsigned int nsyms = input_file.get_global_symbol_count();
+      if (nsyms > 0)
+       printf("    %6s  %6s  %8s  %8s  %8s  %8s\n",
+              "outndx", "shndx", "offset", "chain", "#relocs", "rbase");
+      if (input_file.type() == INCREMENTAL_INPUT_SHARED_LIBRARY)
+       {
+         for (unsigned int symndx = 0; symndx < nsyms; ++symndx)
+           {
+             bool is_def;
+             bool is_copy;
+             unsigned int output_symndx =
+                 input_file.get_output_symbol_index(symndx, &is_def, &is_copy);
+             sym_p = symtab_view.data() + output_symndx * sym_size;
+             elfcpp::Sym<size, big_endian> sym(sym_p);
+             const char* symname;
+             if (!strtab.get_c_string(sym.get_st_name(), &symname))
+               symname = "<unknown>";
+             printf("    %6d  %6s  %8s  %8s  %8s  %8s  %-5s  %s\n",
+                    output_symndx,
+                    "", "", "", "", "",
+                    is_copy ? "COPY" : (is_def ? "DEF" : "UNDEF"),
+                    symname);
+           }
+       }
+      else
+       {
+         for (unsigned int symndx = 0; symndx < nsyms; ++symndx)
+           {
+             Incremental_global_symbol_reader<big_endian> info(
+                 input_file.get_global_symbol_reader(symndx));
+             unsigned int output_symndx = info.output_symndx();
+             sym_p = symtab_view.data() + output_symndx * sym_size;
+             elfcpp::Sym<size, big_endian> sym(sym_p);
+             const char* symname;
+             if (!strtab.get_c_string(sym.get_st_name(), &symname))
+               symname = "<unknown>";
+             printf("    %6d  %6d  %8d  %8d  %8d  %8d  %-5s  %s\n",
+                    output_symndx,
+                    info.shndx() == -1U ? -1 : info.shndx(),
+                    input_file.get_symbol_offset(symndx),
+                    info.next_offset(),
+                    info.reloc_count(),
+                    info.reloc_offset(),
+                    (info.shndx() == -1U
+                     ? "BASE"
+                     : info.shndx() == 0 ? "UNDEF" : "DEF"),
+                    symname);
+           }
+       }
+    }
+
+  sym_p = symtab_view.data() + first_global * sym_size;
   printf("\nGlobal symbol table:\n");
   for (unsigned int i = 0; i < nglobals; i++)
     {
@@ -331,19 +355,19 @@ dump_incremental_inputs(const char* argv0, const char* filename,
          Entry_reader input_file =
              find_input_containing_global<size, big_endian>(incremental_inputs,
                                                             offset, &sym_ndx);
-         typename Entry_reader::Global_symbol_info sym_info(
-             input_file.get_global_symbol_info(sym_ndx));
+         Incremental_global_symbol_reader<big_endian> sym_info(
+             input_file.get_global_symbol_reader(sym_ndx));
          printf("    %s (first reloc: %d, reloc count: %d)",
-                input_file.filename(), sym_info.reloc_offset,
-                sym_info.reloc_count);
-         if (sym_info.output_symndx != first_global + i)
-           printf(" ** wrong output symndx (%d) **", sym_info.output_symndx);
+                input_file.filename(), sym_info.reloc_offset(),
+                sym_info.reloc_count());
+         if (sym_info.output_symndx() != first_global + i)
+           printf(" ** wrong output symndx (%d) **", sym_info.output_symndx());
          printf("\n");
          // Dump the relocations from this input file for this symbol.
-         unsigned int r_off = sym_info.reloc_offset;
-         for (unsigned int j = 0; j < sym_info.reloc_count; j++)
+         unsigned int r_off = sym_info.reloc_offset();
+         for (unsigned int j = 0; j < sym_info.reloc_count(); j++)
            {
-             printf("      %4d  relocation type %3d  shndx %d"
+             printf("      %4d  relocation type %3d  shndx %2d"
                     "  offset %016llx  addend %016llx  %s\n",
                     r_off,
                     irelocs.get_r_type(r_off),
@@ -353,18 +377,12 @@ dump_incremental_inputs(const char* argv0, const char* filename,
                     symname);
              r_off += irelocs.reloc_size;
            }
-         offset = sym_info.next_offset;
+         offset = sym_info.next_offset();
        }
       sym_p += sym_size;
-      isym_p += 4;
     }
 
-  // Get a view of the .gnu_incremental_got_plt section.
-
-  Location igot_plt_location(elf_file.section_contents(igot_plt_shndx));
-  View igot_plt_view(inc->view(igot_plt_location));
-
-  Incremental_got_plt_reader<big_endian> igot_plt(igot_plt_view.data());
+  Incremental_got_plt_reader<big_endian> igot_plt(inc->got_plt_reader());
   unsigned int ngot = igot_plt.get_got_entry_count();
   unsigned int nplt = igot_plt.get_plt_entry_count();
   
@@ -372,24 +390,26 @@ dump_incremental_inputs(const char* argv0, const char* filename,
   for (unsigned int i = 0; i < ngot; ++i)
     {
       unsigned int got_type = igot_plt.get_got_type(i);
-      unsigned int got_desc = igot_plt.get_got_desc(i);
+      unsigned int got_symndx = igot_plt.get_got_symndx(i);
+      unsigned int got_input_index = igot_plt.get_got_input_index(i);
       printf("[%d] type %02x, ", i, got_type & 0x7f);
-      if (got_type == 0x7f)
+      if ((got_type & 0x7f) == 0x7f)
        printf("reserved");
       else if (got_type & 0x80)
        {
-         Entry_reader input_file = incremental_inputs.input_file(got_desc);
+         Entry_reader input_file =
+             incremental_inputs.input_file(got_input_index);
          const char* objname = input_file.filename();
-         printf("local: %s (%d)", objname, got_desc);
+         printf("local: %s (%d)", objname, got_symndx);
        }
       else
        {
-         sym_p = symtab_view.data() + got_desc * sym_size;
+         sym_p = symtab_view.data() + got_symndx * sym_size;
          elfcpp::Sym<size, big_endian> sym(sym_p);
          const char* symname;
          if (!strtab.get_c_string(sym.get_st_name(), &symname))
            symname = "<unknown>";
-         printf("global %s (%d)", symname, got_desc);
+         printf("global %s (%d)", symname, got_symndx);
        }
       printf("\n");
     }
@@ -443,10 +463,10 @@ main(int argc, char** argv)
 
   Output_file* file = new Output_file(filename);
 
-  bool t = file->open_for_modification();
+  bool t = file->open_base_file(NULL, false);
   if (!t)
     {
-      fprintf(stderr, "%s: open_for_modification(%s): %s\n", argv[0], filename,
+      fprintf(stderr, "%s: open_base_file(%s): %s\n", argv[0], filename,
               strerror(errno));
       return 1;
     }
@@ -464,22 +484,30 @@ main(int argc, char** argv)
     {
 #ifdef HAVE_TARGET_32_LITTLE
     case Parameters::TARGET_32_LITTLE:
-      dump_incremental_inputs<32, false>(argv[0], filename, inc);
+      dump_incremental_inputs<32, false>(
+          argv[0], filename,
+          static_cast<Sized_incremental_binary<32, false>*>(inc));
       break;
 #endif
 #ifdef HAVE_TARGET_32_BIG
     case Parameters::TARGET_32_BIG:
-      dump_incremental_inputs<32, true>(argv[0], filename, inc);
+      dump_incremental_inputs<32, true>(
+         argv[0], filename,
+          static_cast<Sized_incremental_binary<32, true>*>(inc));
       break;
 #endif
 #ifdef HAVE_TARGET_64_LITTLE
     case Parameters::TARGET_64_LITTLE:
-      dump_incremental_inputs<64, false>(argv[0], filename, inc);
+      dump_incremental_inputs<64, false>(
+         argv[0], filename,
+          static_cast<Sized_incremental_binary<64, false>*>(inc));
       break;
 #endif
 #ifdef HAVE_TARGET_64_BIG
     case Parameters::TARGET_64_BIG:
-      dump_incremental_inputs<64, true>(argv[0], filename, inc);
+      dump_incremental_inputs<64, true>(
+         argv[0], filename,
+          static_cast<Sized_incremental_binary<64, true>*>(inc));
       break;
 #endif
     default:
This page took 0.028272 seconds and 4 git commands to generate.