| #!/bin/sh |
| |
| # Script to process llvm-dwarfdump --debug-line output and create a normalized table |
| # Usage: process-debug-line.sh <debug-line.txt> |
| # |
| # Output format: CU_FILE LINE COLUMN FILE_NAME [additional_info] |
| # This strips addresses to make rows unique and adds context about which CU and file each line belongs to |
| |
| if [ $# -ne 1 ]; then |
| echo "Usage: $0 <debug-line.txt>" >&2 |
| exit 1 |
| fi |
| |
| debug_line_file="$1" |
| |
| if [ ! -f "$debug_line_file" ]; then |
| echo "Error: File '$debug_line_file' not found" >&2 |
| exit 1 |
| fi |
| |
| awk ' |
| BEGIN { |
| cu_count = 0 |
| current_cu_file = "" |
| # Initialize file names array |
| for (i = 0; i < 100; i++) { |
| current_file_names[i] = "" |
| } |
| } |
| |
| # Track debug_line sections (new CU) |
| /^debug_line\[/ { |
| cu_count++ |
| current_cu_file = "" |
| # Clear file names array for new CU |
| for (i = 0; i < 100; i++) { |
| current_file_names[i] = "" |
| } |
| next |
| } |
| |
| # Capture file names and their indices |
| /^file_names\[.*\]:/ { |
| # Extract file index using simple string operations |
| line_copy = $0 |
| gsub(/file_names\[/, "", line_copy) |
| gsub(/\]:.*/, "", line_copy) |
| gsub(/[ \t]/, "", line_copy) |
| file_index = line_copy |
| |
| getline # Read the next line which contains the actual filename |
| # Extract filename from name: "filename" format |
| if (match($0, /name:[ \t]*"/)) { |
| filename = $0 |
| gsub(/.*name:[ \t]*"/, "", filename) |
| gsub(/".*/, "", filename) |
| current_file_names[file_index] = filename |
| |
| # Extract basename for main CU file (first .c/.cpp/.cc file we see) |
| if (current_cu_file == "" && match(filename, /\.(c|cpp|cc)$/)) { |
| cu_filename = filename |
| gsub(/.*\//, "", cu_filename) |
| current_cu_file = cu_filename |
| } |
| } |
| next |
| } |
| |
| # Process line table entries |
| /^0x[0-9a-f]+/ { |
| # Parse the line entry: Address Line Column File ISA Discriminator OpIndex Flags |
| if (NF >= 4) { |
| line = $2 |
| column = $3 |
| file_index = $4 |
| |
| # Get the filename for this file index |
| filename = current_file_names[file_index] |
| if (filename == "") { |
| filename = "UNKNOWN_FILE_" file_index |
| } else { |
| # Extract just the basename |
| basename = filename |
| gsub(/.*\//, "", basename) |
| filename = basename |
| } |
| |
| # Build additional info (flags, etc.) |
| additional_info = "" |
| for (i = 8; i <= NF; i++) { |
| if (additional_info != "") { |
| additional_info = additional_info " " |
| } |
| additional_info = additional_info $i |
| } |
| |
| # Output normalized row: CU_FILE LINE COLUMN FILE_NAME [additional_info] |
| printf "%s %s %s %s", current_cu_file, line, column, filename |
| if (additional_info != "") { |
| printf " %s", additional_info |
| } |
| printf "\n" |
| } |
| } |
| ' "$debug_line_file" |