Blame debugedit-macro.diff

Bernhard M. Wiedemann 1250f9
--- ./tools/debugedit.c.orig	2017-12-15 12:17:02.564975374 +0000
Bernhard M. Wiedemann 1250f9
+++ ./tools/debugedit.c	2017-12-15 12:17:29.058901941 +0000
Bernhard M. Wiedemann 1250f9
@@ -71,6 +71,14 @@
Bernhard M. Wiedemann 1250f9
 #define DW_FORM_ref_udata	0x15
Bernhard M. Wiedemann 1250f9
 #define DW_FORM_indirect	0x16
Bernhard M. Wiedemann 1250f9
 
Bernhard M. Wiedemann 1250f9
+#define DW_MACRO_GNU_define	1
Bernhard M. Wiedemann 1250f9
+#define DW_MACRO_GNU_undef	2
Bernhard M. Wiedemann 1250f9
+#define DW_MACRO_GNU_start_file	3
Bernhard M. Wiedemann 1250f9
+#define DW_MACRO_GNU_end_file	4
Bernhard M. Wiedemann 1250f9
+#define DW_MACRO_GNU_define_indirect 5
Bernhard M. Wiedemann 1250f9
+#define DW_MACRO_GNU_undef_indirect 6
Bernhard M. Wiedemann 1250f9
+#define DW_MACRO_GNU_transparent_include 7
Bernhard M. Wiedemann 1250f9
+
Bernhard M. Wiedemann 1250f9
 /* Unfortunately strtab manipulation functions were only officially added
Bernhard M. Wiedemann 1250f9
    to elfutils libdw in 0.167.  Before that there were internal unsupported
Bernhard M. Wiedemann 1250f9
    ebl variants.  While libebl.h isn't supported we'll try to use it anyway
Bernhard M. Wiedemann 1250f9
@@ -2209,6 +2217,67 @@ edit_dwarf2 (DSO *dso)
Bernhard M. Wiedemann 1250f9
 		}
Bernhard M. Wiedemann 1250f9
 	    }
Bernhard M. Wiedemann 1250f9
 
Bernhard M. Wiedemann 1250f9
+	  /* the macro section also contains offsets into the str section,
Bernhard M. Wiedemann 1250f9
+	   * so we need to update those as well if we update the strings
Bernhard M. Wiedemann 1250f9
+	   */
Bernhard M. Wiedemann 1250f9
+	  if (need_strp_update && debug_sections[DEBUG_MACRO].data)
Bernhard M. Wiedemann 1250f9
+	    {
Bernhard M. Wiedemann 1250f9
+	      ptr = debug_sections[DEBUG_MACRO].data;
Bernhard M. Wiedemann 1250f9
+	      endsec = ptr + debug_sections[DEBUG_MACRO].size;
Bernhard M. Wiedemann 1250f9
+	      int op = 0, macro_version, macro_flags;
Bernhard M. Wiedemann 1250f9
+	      
Bernhard M. Wiedemann 1250f9
+	      while (ptr < endsec)
Bernhard M. Wiedemann 1250f9
+		{
Bernhard M. Wiedemann 1250f9
+		  if (!op)
Bernhard M. Wiedemann 1250f9
+		    {
Bernhard M. Wiedemann 1250f9
+		      macro_version = read_16 (ptr);
Bernhard M. Wiedemann 1250f9
+		      macro_flags = read_8 (ptr);
Bernhard M. Wiedemann 1250f9
+		      if (macro_version != 4 || (macro_flags & ~2) != 0)
Bernhard M. Wiedemann 1250f9
+			error (1, 0, "unhandled .debug_macro version/flags");
Bernhard M. Wiedemann 1250f9
+		      if ((macro_flags & 2) != 0)
Bernhard M. Wiedemann 1250f9
+			ptr += 4;
Bernhard M. Wiedemann 1250f9
+		    }
Bernhard M. Wiedemann 1250f9
+		  op = read_8 (ptr);
Bernhard M. Wiedemann 1250f9
+		  if (!op)
Bernhard M. Wiedemann 1250f9
+		    continue;
Bernhard M. Wiedemann 1250f9
+		  switch(op)
Bernhard M. Wiedemann 1250f9
+		    {
Bernhard M. Wiedemann 1250f9
+		    case DW_MACRO_GNU_define:
Bernhard M. Wiedemann 1250f9
+		    case DW_MACRO_GNU_undef:
Bernhard M. Wiedemann 1250f9
+		      read_uleb128 (ptr);
Bernhard M. Wiedemann 1250f9
+		      ptr = (unsigned char *) strchr ((char *) ptr, '\0') + 1;
Bernhard M. Wiedemann 1250f9
+		      break;
Bernhard M. Wiedemann 1250f9
+		    case DW_MACRO_GNU_start_file:
Bernhard M. Wiedemann 1250f9
+		      read_uleb128 (ptr);
Bernhard M. Wiedemann 1250f9
+		      read_uleb128 (ptr);
Bernhard M. Wiedemann 1250f9
+		      break;
Bernhard M. Wiedemann 1250f9
+		    case DW_MACRO_GNU_define_indirect:
Bernhard M. Wiedemann 1250f9
+		    case DW_MACRO_GNU_undef_indirect:
Bernhard M. Wiedemann 1250f9
+		      read_uleb128 (ptr);
Bernhard M. Wiedemann 1250f9
+		      if (phase == 0)
Bernhard M. Wiedemann 1250f9
+			{
Bernhard M. Wiedemann 1250f9
+			  size_t idx = read_32 (ptr);
Bernhard M. Wiedemann 1250f9
+			  record_existing_string_entry_idx (&dso->strings, idx);
Bernhard M. Wiedemann 1250f9
+			}
Bernhard M. Wiedemann 1250f9
+		      else
Bernhard M. Wiedemann 1250f9
+			{
Bernhard M. Wiedemann 1250f9
+			  struct stridxentry *entry;
Bernhard M. Wiedemann 1250f9
+			  size_t idx, new_idx;
Bernhard M. Wiedemann 1250f9
+			  idx = do_read_32 (ptr);
Bernhard M. Wiedemann 1250f9
+			  entry = string_find_entry (&dso->strings, idx);
Bernhard M. Wiedemann 1250f9
+			  new_idx = strent_offset (entry->entry);
Bernhard M. Wiedemann 1250f9
+			  write_32 (ptr, new_idx);
Bernhard M. Wiedemann 1250f9
+			}
Bernhard M. Wiedemann 1250f9
+		      break;
Bernhard M. Wiedemann 1250f9
+		    case DW_MACRO_GNU_transparent_include:
Bernhard M. Wiedemann 1250f9
+		      ptr += 4;
Bernhard M. Wiedemann 1250f9
+		      break;
Bernhard M. Wiedemann 1250f9
+		    default:
Bernhard M. Wiedemann 1250f9
+		      break;
Bernhard M. Wiedemann 1250f9
+		    }
Bernhard M. Wiedemann 1250f9
+		}
Bernhard M. Wiedemann 1250f9
+	    }
Bernhard M. Wiedemann 1250f9
+
Bernhard M. Wiedemann 1250f9
 	  /* Same for the debug_str section. Make sure everything is
Bernhard M. Wiedemann 1250f9
 	     in place for phase 1 updating of debug_info
Bernhard M. Wiedemann 1250f9
 	     references. */
Bernhard M. Wiedemann 1250f9
@@ -2238,6 +2307,8 @@ edit_dwarf2 (DSO *dso)
Bernhard M. Wiedemann 1250f9
 	 new strp, strings and/or linep offsets.  */
Bernhard M. Wiedemann 1250f9
       if (need_strp_update || need_string_replacement || need_stmt_update)
Bernhard M. Wiedemann 1250f9
 	dirty_section (DEBUG_INFO);
Bernhard M. Wiedemann 1250f9
+      if (need_strp_update)
Bernhard M. Wiedemann 1250f9
+	dirty_section (DEBUG_MACRO);
Bernhard M. Wiedemann 1250f9
 
Bernhard M. Wiedemann 1250f9
       /* Update any debug_info relocations addends we might have touched. */
Bernhard M. Wiedemann 1250f9
       if (relbuf != NULL && reltype == SHT_RELA)