svn commit: r346433 - stable/12/contrib/elftoolchain/libdwarf

Mark Johnston markj at FreeBSD.org
Sat Apr 20 10:58:34 UTC 2019


Author: markj
Date: Sat Apr 20 10:58:33 2019
New Revision: 346433
URL: https://svnweb.freebsd.org/changeset/base/346433

Log:
  MFC r345593:
  Prepend DW_AT_comp_dir to relative line number directory table entries.

Modified:
  stable/12/contrib/elftoolchain/libdwarf/libdwarf_lineno.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/contrib/elftoolchain/libdwarf/libdwarf_lineno.c
==============================================================================
--- stable/12/contrib/elftoolchain/libdwarf/libdwarf_lineno.c	Sat Apr 20 10:56:56 2019	(r346432)
+++ stable/12/contrib/elftoolchain/libdwarf/libdwarf_lineno.c	Sat Apr 20 10:58:33 2019	(r346433)
@@ -33,9 +33,10 @@ _dwarf_lineno_add_file(Dwarf_LineInfo li, uint8_t **p,
     Dwarf_Error *error, Dwarf_Debug dbg)
 {
 	Dwarf_LineFile lf;
-	const char *dirname;
+	FILE *filepath;
+	const char *incdir;
 	uint8_t *src;
-	int slen;
+	size_t slen;
 
 	src = *p;
 
@@ -54,20 +55,33 @@ _dwarf_lineno_add_file(Dwarf_LineInfo li, uint8_t **p,
 		return (DW_DLE_DIR_INDEX_BAD);
 	}
 
-	/* Make full pathname if need. */
+	/* Make a full pathname if needed. */
 	if (*lf->lf_fname != '/') {
-		dirname = compdir;
+		filepath = open_memstream(&lf->lf_fullpath, &slen);
+		if (filepath == NULL) {
+			free(lf);
+			DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY);
+			return (DW_DLE_MEMORY);
+		}
+
 		if (lf->lf_dirndx > 0)
-			dirname = li->li_incdirs[lf->lf_dirndx - 1];
-		if (dirname != NULL) {
-			slen = strlen(dirname) + strlen(lf->lf_fname) + 2;
-			if ((lf->lf_fullpath = malloc(slen)) == NULL) {
-				free(lf);
-				DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY);
-				return (DW_DLE_MEMORY);
-			}
-			snprintf(lf->lf_fullpath, slen, "%s/%s", dirname,
-			    lf->lf_fname);
+			incdir = li->li_incdirs[lf->lf_dirndx - 1];
+		else
+			incdir = NULL;
+
+		/*
+		 * Prepend the compilation directory if the directory table
+		 * entry is relative.
+		 */
+		if (incdir == NULL || *incdir != '/')
+			fprintf(filepath, "%s/", compdir);
+		if (incdir != NULL)
+			fprintf(filepath, "%s/", incdir);
+		fprintf(filepath, "%s", lf->lf_fname);
+		if (fclose(filepath) != 0) {
+			free(lf);
+			DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY);
+			return (DW_DLE_MEMORY);
 		}
 	}
 


More information about the svn-src-all mailing list