-#define INITIAL_STATE \
- /* Initialize as per DWARF2.0 standard. */ \
- 0, /* address */ \
- 1, /* file */ \
- 1, /* line */ \
- 0, /* column */ \
- DWARF2_LINE_DEFAULT_IS_STMT, /* is_stmt */ \
- 0, /* basic_block */ \
- 1 /* empty_sequence */
-
-static struct
- {
- /* state machine state as per DWARF2 manual: */
- struct dwarf2_sm
- {
- addressT addr;
- unsigned int filenum;
- unsigned int line;
- unsigned int column;
- unsigned int
- is_stmt : 1,
- basic_block : 1,
- empty_sequence : 1; /* current code sequence has no DWARF2 directives? */
- }
- sm;
-
- unsigned int
- any_dwarf2_directives : 1; /* did we emit any DWARF2 line debug directives? */
-
- fragS * frag; /* frag that "addr" is relative to */
- segT text_seg; /* text segment "addr" is relative to */
- subsegT text_subseg;
- segT line_seg; /* ".debug_line" segment */
- int last_filename; /* index of last filename that was used */
- int num_filenames; /* index of last filename in use */
- int filename_len; /* length of the filename array */
- struct
- {
- int dir; /* valid after gen_dir_list() only */
- char *name; /* full path before gen_dir_list(), filename afterwards */
- }
- *file;
-
- struct dwarf2_line_info current; /* current source info: */
-
- /* counters for statistical purposes: */
- unsigned int num_line_entries;
- unsigned int opcode_hist[256]; /* histogram of opcode frequencies */
- }
-ls =
- {
- {
- INITIAL_STATE
- },
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- NULL,
- { NULL, 0, 0, 0, 0 },
- 0,
- {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- }
- };
-
-
-/* Function prototypes: */
-static void out_uleb128 PARAMS ((addressT));
-static void out_sleb128 PARAMS ((offsetT));
-static void gen_addr_line PARAMS ((int, addressT));
-static void reset_state_machine PARAMS ((void));
-static void out_set_addr PARAMS ((addressT));
-static void out_end_sequence PARAMS ((void));
-static int get_filenum PARAMS ((int, char *));
-static void gen_dir_list PARAMS ((void));
-static void gen_file_list PARAMS ((void));
-static void print_stats PARAMS ((unsigned long));
-
-
-#define out_byte(byte) FRAG_APPEND_1_CHAR(byte)
-#define out_opcode(opc) (out_byte ((opc)), ++ls.opcode_hist[(opc) & 0xff])
-
-/* Output an unsigned "little-endian base 128" number. */
+struct line_entry {
+ struct line_entry *next;
+ symbolS *label;
+ struct dwarf2_line_info loc;
+};
+
+struct line_subseg {
+ struct line_subseg *next;
+ subsegT subseg;
+ struct line_entry *head;
+ struct line_entry **ptail;
+};
+
+struct line_seg {
+ struct line_seg *next;
+ segT seg;
+ struct line_subseg *head;
+ symbolS *text_start;
+ symbolS *text_end;
+};
+
+/* Collects data for all line table entries during assembly. */
+static struct line_seg *all_segs;
+/* Hash used to quickly lookup a segment by name, avoiding the need to search
+ through the all_segs list. */
+static struct hash_control *all_segs_hash;
+static struct line_seg **last_seg_ptr;
+
+struct file_entry {
+ const char *filename;
+ unsigned int dir;
+};
+
+/* Table of files used by .debug_line. */
+static struct file_entry *files;
+static unsigned int files_in_use;
+static unsigned int files_allocated;
+
+/* Table of directories used by .debug_line. */
+static char **dirs;
+static unsigned int dirs_in_use;
+static unsigned int dirs_allocated;
+
+/* TRUE when we've seen a .loc directive recently. Used to avoid
+ doing work when there's nothing to do. */
+bfd_boolean dwarf2_loc_directive_seen;
+
+/* TRUE when we're supposed to set the basic block mark whenever a
+ label is seen. */
+bfd_boolean dwarf2_loc_mark_labels;
+
+/* Current location as indicated by the most recent .loc directive. */
+static struct dwarf2_line_info current = {
+ 1, 1, 0, 0,
+ DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0,
+ 0
+};
+
+/* The size of an address on the target. */
+static unsigned int sizeof_address;
+\f
+static unsigned int get_filenum (const char *, unsigned int);
+
+#ifndef TC_DWARF2_EMIT_OFFSET
+#define TC_DWARF2_EMIT_OFFSET generic_dwarf2_emit_offset
+
+/* Create an offset to .dwarf2_*. */
+