]> granicus.if.org Git - yasm/commitdiff
Implement DWARF2 .file "foo.c" (sans file number) so that it actually sets
authorPeter Johnson <peter@tortall.net>
Wed, 1 Feb 2006 07:01:47 +0000 (07:01 -0000)
committerPeter Johnson <peter@tortall.net>
Wed, 1 Feb 2006 07:01:47 +0000 (07:01 -0000)
the source filename stored in the object file (as GAS does).  The internals
of this move the source and object filename data into the yasm_object
structure and simplify the dbgfmt and objfmt interfaces to remove this
information from function parameters.

* section.c (yasm_object_create): Add src_filename and obj_filename params.
(yasm_object_set_source_fn, yasm_object_get_source_fn)
(yasm_object_get_object_fn): New.
* section.h: Prototype.

* objfmt.h (yasm_objfmt_create): Remove in_filename param.
(yasm_objfmt_output): Remove obj_filename param.
* bin-objfmt.c, dbg-objfmt.c, coff-objfmt.c, xdf-objfmt.c: Update.
* elf-objfmt.c: Update.
* elf.c (elf_strtab_entry_set_str): New ELF support function.
* elf.h (elf_strtab_entry_set_str): Prototype.

* dbgfmt.h (yasm_dbgfmt_create): Remove in_filename and obj_filename params.
* null-dbgfmt.c, stabs-dbgfmt.c, dwarf2-dbgfmt.c: Update.

* dwarf2-dbgfmt.c (dwarf2_dbgfmt_directive): Implement .file "foo.c".

* yasm.c (main): Update to match yasm_object, objfmt and dbgfmt changes.

svn path=/trunk/yasm/; revision=1356

18 files changed:
frontends/yasm/yasm.c
libyasm/dbgfmt.h
libyasm/objfmt.h
libyasm/section.c
libyasm/section.h
modules/dbgfmts/dwarf2/dwarf2-dbgfmt.c
modules/dbgfmts/dwarf2/tests/pass32/dwarf32_testhd.hex
modules/dbgfmts/dwarf2/tests/pass64/dwarf64_leb128.hex
modules/dbgfmts/dwarf2/tests/passwin64/dwarfwin64_testhd.hex
modules/dbgfmts/null/null-dbgfmt.c
modules/dbgfmts/stabs/stabs-dbgfmt.c
modules/objfmts/bin/bin-objfmt.c
modules/objfmts/coff/coff-objfmt.c
modules/objfmts/dbg/dbg-objfmt.c
modules/objfmts/elf/elf-objfmt.c
modules/objfmts/elf/elf.c
modules/objfmts/elf/elf.h
modules/objfmts/xdf/xdf-objfmt.c

index b212910a741c124857d2841cce8d166b01e54d58..f943b2d6502fb0a2965cd119736017ac54892ed4 100644 (file)
@@ -406,8 +406,20 @@ main(int argc, char *argv[])
        return EXIT_SUCCESS;
     }
 
+    /* determine the object filename if not specified */
+    if (!obj_filename) {
+       if (in == stdin)
+           /* Default to yasm.out if no obj filename specified */
+           obj_filename = yasm__xstrdup("yasm.out");
+       else
+           /* replace (or add) extension */
+           obj_filename = replace_extension(in_filename,
+                                            cur_objfmt_module->extension,
+                                            "yasm.out");
+    }
+
     /* Create object */
-    object = yasm_object_create();
+    object = yasm_object_create(in_filename, obj_filename);
     yasm_linemap_set(yasm_object_get_linemap(object), in_filename, 1, 1);
 
     /* Default to x86 as the architecture */
@@ -525,21 +537,8 @@ main(int argc, char *argv[])
        return EXIT_FAILURE;
     }
 
-    /* determine the object filename if not specified */
-    if (!obj_filename) {
-       if (in == stdin)
-           /* Default to yasm.out if no obj filename specified */
-           obj_filename = yasm__xstrdup("yasm.out");
-       else
-           /* replace (or add) extension */
-           obj_filename = replace_extension(in_filename,
-                                            cur_objfmt_module->extension,
-                                            "yasm.out");
-    }
-
     /* Initialize the object format */
-    cur_objfmt = yasm_objfmt_create(cur_objfmt_module, in_filename, object,
-                                   cur_arch);
+    cur_objfmt = yasm_objfmt_create(cur_objfmt_module, object, cur_arch);
     if (!cur_objfmt) {
        print_error(
            _("%s: object format `%s' does not support architecture `%s' machine `%s'"),
@@ -557,8 +556,7 @@ main(int argc, char *argv[])
     def_sect = yasm_objfmt_add_default_section(cur_objfmt, object);
 
     /* Initialize the debug format */
-    cur_dbgfmt = yasm_dbgfmt_create(cur_dbgfmt_module, in_filename,
-                                   obj_filename, object, cur_objfmt,
+    cur_dbgfmt = yasm_dbgfmt_create(cur_dbgfmt_module, object, cur_objfmt,
                                    cur_arch);
     if (!cur_dbgfmt) {
        print_error(
index c355a8b6f17bef4b44c44b586713cfe48d76f5b7..323b538ab3ee7766ab9af2af45b6337ecc3f7cb3 100644 (file)
@@ -55,16 +55,13 @@ typedef struct yasm_dbgfmt_module {
     /** Create debug format.
      * Module-level implementation of yasm_dbgfmt_create().
      * The filenames are provided solely for informational purposes.
-     * \param in_filename   primary input filename
-     * \param obj_filename  object filename
      * \param object       object
      * \param of           object format in use
      * \param a                    architecture in use
      * \return NULL if object format does not provide needed support.
      */
     /*@null@*/ /*@only@*/ yasm_dbgfmt * (*create)
-       (const char *in_filename, const char *obj_filename,
-        yasm_object *object, yasm_objfmt *of, yasm_arch *a);
+       (yasm_object *object, yasm_objfmt *of, yasm_arch *a);
 
     /** Module-level implementation of yasm_dbgfmt_destroy().
      * Call yasm_dbgfmt_destroy() instead of calling this function.
@@ -94,16 +91,13 @@ const char *yasm_dbgfmt_keyword(const yasm_dbgfmt *dbgfmt);
  * format functions.  The filenames are provided solely for informational
  * purposes.
  * \param module       debug format module
- * \param in_filename   primary input filename
- * \param obj_filename  object filename
  * \param object       object to generate debugging information for
  * \param of           object format in use
  * \param a            architecture in use
  * \return NULL if object format does not provide needed support.
  */
 /*@null@*/ /*@only@*/ yasm_dbgfmt *yasm_dbgfmt_create
-    (const yasm_dbgfmt_module *module, const char *in_filename,
-     const char *obj_filename, yasm_object *object, yasm_objfmt *of,
+    (const yasm_dbgfmt_module *module, yasm_object *object, yasm_objfmt *of,
      yasm_arch *a);
 
 /** Cleans up any allocated debug format memory.
@@ -136,8 +130,8 @@ void yasm_dbgfmt_generate(yasm_dbgfmt *dbgfmt);
 #define yasm_dbgfmt_keyword(dbgfmt) \
     (((yasm_dbgfmt_base *)dbgfmt)->module->keyword)
 
-#define yasm_dbgfmt_create(module, in_filename, obj_filename, object, of, a) \
-    module->create(in_filename, obj_filename, object, of, a)
+#define yasm_dbgfmt_create(module, object, of, a) \
+    module->create(object, of, a)
 
 #define yasm_dbgfmt_destroy(dbgfmt) \
     ((yasm_dbgfmt_base *)dbgfmt)->module->destroy(dbgfmt)
index 0bdd64832e80f422c89ee9a1281f3f2b0ce862cd..b988197d9f51a3fd6a946141c4b393e7ad5126e6 100644 (file)
@@ -80,19 +80,17 @@ typedef struct yasm_objfmt_module {
     /** Create object format.
      * Module-level implementation of yasm_objfmt_create().
      * Call yasm_objfmt_create() instead of calling this function.
-     * \param in_filename      main input filename (e.g. "file.asm")
      * \param object           object
      * \param a                        architecture in use
      * \return NULL if architecture/machine combination not supported.
      */
-    /*@null@*/ /*@only@*/ yasm_objfmt * (*create)
-       (const char *in_filename, yasm_object *object, yasm_arch *a);
+    /*@null@*/ /*@only@*/ yasm_objfmt * (*create) (yasm_object *object,
+                                                  yasm_arch *a);
 
     /** Module-level implementation of yasm_objfmt_output().
      * Call yasm_objfmt_output() instead of calling this function.
      */
-    void (*output) (yasm_objfmt *of, FILE *f, const char *obj_filename,
-                   int all_syms, yasm_dbgfmt *df);
+    void (*output) (yasm_objfmt *of, FILE *f, int all_syms, yasm_dbgfmt *df);
 
     /** Module-level implementation of yasm_objfmt_destroy().
      * Call yasm_objfmt_destroy() instead of calling this function.
@@ -139,27 +137,24 @@ typedef struct yasm_objfmt_module {
 
 /** Create object format.
  * \param module       object format module
- * \param in_filename  main input filename (e.g. "file.asm")
  * \param object       object
  * \param a            architecture in use
  * \return NULL if architecture/machine combination not supported.
  */
 /*@null@*/ /*@only@*/ yasm_objfmt *yasm_objfmt_create
-    (const yasm_objfmt_module *module, const char *in_filename,
-     yasm_object *object, yasm_arch *a);
+    (const yasm_objfmt_module *module, yasm_object *object, yasm_arch *a);
 
 /** Write out (post-optimized) sections to the object file.
  * This function may call yasm_symrec_* functions as necessary (including
  * yasm_symrec_traverse()) to retrieve symbolic information.
  * \param objfmt       object format
  * \param f            output object file
- * \param obj_filename output filename (e.g. "file.o")
  * \param all_syms     if nonzero, all symbols should be included in
  *                     the object file
  * \param df           debug format in use
  */
-void yasm_objfmt_output(yasm_objfmt *objfmt, FILE *f, const char *obj_filename,
-                       int all_syms, yasm_dbgfmt *df);
+void yasm_objfmt_output(yasm_objfmt *objfmt, FILE *f, int all_syms,
+                       yasm_dbgfmt *df);
 
 /** Cleans up any allocated object format memory.
  * \param objfmt       object format
@@ -235,12 +230,10 @@ int yasm_objfmt_directive(yasm_objfmt *objfmt, const char *name,
 
 /* Inline macro implementations for objfmt functions */
 
-#define yasm_objfmt_create(module, in_filename, object, a) \
-    module->create(in_filename, object, a)
+#define yasm_objfmt_create(module, object, a)  module->create(object, a)
 
 #define yasm_objfmt_output(objfmt, f, obj_fn, all_syms, df) \
-    ((yasm_objfmt_base *)objfmt)->module->output(objfmt, f, obj_fn, all_syms, \
-                                                df)
+    ((yasm_objfmt_base *)objfmt)->module->output(objfmt, f, all_syms, df)
 #define yasm_objfmt_destroy(objfmt) \
     ((yasm_objfmt_base *)objfmt)->module->destroy(objfmt)
 #define yasm_objfmt_section_switch(objfmt, vpms, oe_vpms, line) \
index 89a4bc3aaaf4d42179c06d99b348083ba740eedc..4a7283af7011336aeaf130356b5986f3a4d8ea58 100644 (file)
@@ -46,6 +46,9 @@
 
 
 struct yasm_object {
+    /*@owned@*/ char *src_filename;
+    /*@owned@*/ char *obj_filename;
+
     yasm_symtab        *symtab;
     yasm_linemap *linemap;
 
@@ -92,10 +95,13 @@ static void yasm_section_destroy(/*@only@*/ yasm_section *sect);
 
 /*@-compdestroy@*/
 yasm_object *
-yasm_object_create(void)
+yasm_object_create(const char *src_filename, const char *obj_filename)
 {
     yasm_object *object = yasm_xmalloc(sizeof(yasm_object));
 
+    object->src_filename = yasm__xstrdup(src_filename);
+    object->obj_filename = yasm__xstrdup(obj_filename);
+
     /* Create empty symtab and linemap */
     object->symtab = yasm_symtab_create();
     object->linemap = yasm_linemap_create();
@@ -198,6 +204,25 @@ yasm_object_create_absolute(yasm_object *object, yasm_expr *start,
 }
 /*@=onlytrans@*/
 
+void
+yasm_object_set_source_fn(yasm_object *object, const char *src_filename)
+{
+    yasm_xfree(object->src_filename);
+    object->src_filename = yasm__xstrdup(src_filename);
+}
+
+const char *
+yasm_object_get_source_fn(const yasm_object *object)
+{
+    return object->src_filename;
+}
+
+const char *
+yasm_object_get_object_fn(const yasm_object *object)
+{
+    return object->obj_filename;
+}
+
 yasm_symtab *
 yasm_object_get_symtab(const yasm_object *object)
 {
index c41321861a1309820e93b4852d0e2d58f3d15c44..c48fae4052255a4e579491228dc0472ce66548cf 100644 (file)
@@ -50,9 +50,12 @@ struct yasm_reloc {
 /** Create a new object.  A default section is created as the first section.
  * An empty symbol table (yasm_symtab) and line mapping (yasm_linemap) are
  * automatically created.
+ * \param src_filename source filename (e.g. "file.asm")
+ * \param obj_filename object filename (e.g. "file.o")
  * \return Newly allocated object.
  */
-/*@only@*/ yasm_object *yasm_object_create(void);
+/*@only@*/ yasm_object *yasm_object_create(const char *src_filename,
+                                          const char *obj_filename);
 
 /** Create a new, or continue an existing, general section.  The section is
  * added to the object if there's not already a section by that name.
@@ -122,6 +125,24 @@ int yasm_object_sections_traverse
 /*@dependent@*/ /*@null@*/ yasm_section *yasm_object_find_general
     (yasm_object *object, const char *name);
 
+/** Change the source filename for an object.
+ * \param object       object
+ * \param src_filename new source filename (e.g. "file.asm")
+ */
+void yasm_object_set_source_fn(yasm_object *object, const char *src_filename);
+
+/** Get an object's source filename.
+ * \param object       object
+ * \return Source filename.
+ */
+const char *yasm_object_get_source_fn(const yasm_object *object);
+
+/** Get an object's object filename.
+ * \param object       object
+ * \return Object filename.
+ */
+const char *yasm_object_get_object_fn(const yasm_object *object);
+
 /** Get an object's symbol table (#yasm_symtab).
  * \param object       object
  * \return Symbol table.
index 2b7c86a16468c24000e22cd115f703feb07d3c7b..a5fc92d374a0f3b1accec78711bfffab0b1a20d9 100644 (file)
@@ -105,7 +105,6 @@ typedef struct yasm_dbgfmt_dwarf2 {
 
     yasm_object *object;
     yasm_symtab *symtab;
-    const char *filename;
     yasm_linemap *linemap;
     yasm_arch *arch;
 
@@ -234,8 +233,7 @@ yasm_dbgfmt_module yasm_dwarf2_LTX_dbgfmt;
 
 
 static /*@null@*/ /*@only@*/ yasm_dbgfmt *
-dwarf2_dbgfmt_create(const char *in_filename, const char *obj_filename,
-                    yasm_object *object, yasm_objfmt *of, yasm_arch *a)
+dwarf2_dbgfmt_create(yasm_object *object, yasm_objfmt *of, yasm_arch *a)
 {
     yasm_dbgfmt_dwarf2 *dbgfmt_dwarf2 =
        yasm_xmalloc(sizeof(yasm_dbgfmt_dwarf2));
@@ -243,7 +241,6 @@ dwarf2_dbgfmt_create(const char *in_filename, const char *obj_filename,
 
     dbgfmt_dwarf2->dbgfmt.module = &yasm_dwarf2_LTX_dbgfmt;
 
-    dbgfmt_dwarf2->filename = in_filename;
     dbgfmt_dwarf2->object = object;
     dbgfmt_dwarf2->symtab = yasm_object_get_symtab(object);
     dbgfmt_dwarf2->linemap = yasm_object_get_linemap(object);
@@ -927,7 +924,7 @@ dwarf2_dbgfmt_directive(yasm_dbgfmt *dbgfmt, const char *name,
 
        if (vp->val) {
            /* Just a bare filename */
-           /* TODO: this should change the in_filename the objfmt uses */
+           yasm_object_set_source_fn(dbgfmt_dwarf2->object, vp->val);
            return 0;
        }
 
index b7fdd3492977da9cfd9f6b216ac832afced74371..edaf1bcbd747277b96c8b173535d0e3efb8af6b6 100644 (file)
@@ -3027,7 +3027,15 @@ e7
 62 
 00 
 00 
-2d 
+74 
+65 
+73 
+74 
+5f 
+68 
+64 
+2e 
+63 
 00 
 6d 
 61 
@@ -5166,14 +5174,6 @@ e7
 00 
 00 
 00 
-00 
-00 
-00 
-00 
-00 
-00 
-00 
-00 
 ee 
 00 
 00 
@@ -5234,7 +5234,7 @@ d4
 0b 
 00 
 00 
-61 
+69 
 02 
 00 
 00 
@@ -5270,7 +5270,7 @@ e6
 00 
 00 
 00 
-38 
+40 
 0e 
 00 
 00 
index 8890ea322577c333fee83b363ca2d37aed117bac..5733368b70f56b8728f6eb3500b781d0581c64be 100644 (file)
@@ -38,7 +38,7 @@
 00 
 00 
 00 
-e
+f
 5c 
 01 
 00 
 00 
 00 
 00 
-2d 
+6c 
+65 
+62 
+31 
+32 
+38 
+5f 
+74 
+65 
+73 
+74 
+2e 
+63 
 00 
 74 
 65 
 00 
 00 
 00 
+00 
+00 
+00 
+00 
 70 
 01 
 00 
@@ -89470,7 +89486,7 @@ be
 00 
 00 
 00 
-0c 
+18 
 28 
 00 
 00 
@@ -89526,7 +89542,7 @@ be
 00 
 00 
 00 
-d4 
+e0 
 e6 
 00 
 00 
index aaf7f7309e5378bcf9d86235da7fae4d7aed1ad8..8c76e4c50ac1e310ed41d9f29d7bf16b7efffd4a 100644 (file)
@@ -4391,15 +4391,15 @@ ff
 00 
 67 
 01 
-2d 
-00 
-00 
-00 
-00 
-00 
-00 
-00 
-00 
+74 
+65 
+73 
+74 
+5f 
+68 
+64 
+2e 
+63 
 00 
 00 
 00 
index 04fbf75d56ef9c00dd1a10f390105b978bfdd6b2..e5c9e4c0ef07e480cd036f652660be7d2e804b4c 100644 (file)
@@ -35,8 +35,7 @@ yasm_dbgfmt_module yasm_null_LTX_dbgfmt;
 
 
 static /*@null@*/ /*@only@*/ yasm_dbgfmt *
-null_dbgfmt_create(const char *in_filename, const char *obj_filename,
-                  yasm_object *object, yasm_objfmt *of, yasm_arch *a)
+null_dbgfmt_create(yasm_object *object, yasm_objfmt *of, yasm_arch *a)
 {
     yasm_dbgfmt_base *dbgfmt = yasm_xmalloc(sizeof(yasm_dbgfmt_base));
     dbgfmt->module = &yasm_null_LTX_dbgfmt;
index 75939fb9fa9130f91b779d1af2887894383461d6..c59b9df4d590af9aa8936eabaeb7770075c5c6a2 100644 (file)
@@ -85,7 +85,6 @@ typedef struct yasm_dbgfmt_stabs {
 
     yasm_object *object;
     yasm_symtab *symtab;
-    const char *filename;
     yasm_linemap *linemap;
     yasm_arch *arch;
 } yasm_dbgfmt_stabs;
@@ -161,12 +160,10 @@ yasm_dbgfmt_module yasm_stabs_LTX_dbgfmt;
 
 
 static /*@null@*/ /*@only@*/ yasm_dbgfmt *
-stabs_dbgfmt_create(const char *in_filename, const char *obj_filename,
-                   yasm_object *object, yasm_objfmt *of, yasm_arch *a)
+stabs_dbgfmt_create(yasm_object *object, yasm_objfmt *of, yasm_arch *a)
 {
     yasm_dbgfmt_stabs *dbgfmt_stabs = yasm_xmalloc(sizeof(yasm_dbgfmt_stabs));
     dbgfmt_stabs->dbgfmt.module = &yasm_stabs_LTX_dbgfmt;
-    dbgfmt_stabs->filename = in_filename;
     dbgfmt_stabs->object = object;
     dbgfmt_stabs->symtab = yasm_object_get_symtab(object);
     dbgfmt_stabs->linemap = yasm_object_get_linemap(object);
@@ -370,7 +367,8 @@ stabs_dbgfmt_generate(yasm_dbgfmt *dbgfmt)
 
     /* initial strtab bytecodes */
     nullbc = stabs_dbgfmt_append_bcstr(info.stabstr, "");
-    filebc = stabs_dbgfmt_append_bcstr(info.stabstr, dbgfmt_stabs->filename);
+    filebc = stabs_dbgfmt_append_bcstr(info.stabstr,
+       yasm_object_get_source_fn(dbgfmt_stabs->object));
 
     stext = yasm_object_find_general(dbgfmt_stabs->object, ".text");
     firstsym = yasm_symtab_use(dbgfmt_stabs->symtab, ".text", 0);
index ed57b67fa7c1813ecd2a274e806e7e678ba76812..645ff8f7d455835ffc8bb4ad08ee1d3e36ba89bb 100644 (file)
@@ -47,8 +47,7 @@ yasm_objfmt_module yasm_bin_LTX_objfmt;
 
 
 static yasm_objfmt *
-bin_objfmt_create(/*@unused@*/ const char *in_filename, yasm_object *object,
-                 yasm_arch *a)
+bin_objfmt_create(yasm_object *object, yasm_arch *a)
 {
     yasm_objfmt_bin *objfmt_bin = yasm_xmalloc(sizeof(yasm_objfmt_bin));
     objfmt_bin->objfmt.module = &yasm_bin_LTX_objfmt;
@@ -240,8 +239,8 @@ bin_objfmt_output_bytecode(yasm_bytecode *bc, /*@null@*/ void *d)
 }
 
 static void
-bin_objfmt_output(yasm_objfmt *objfmt, FILE *f, const char *obj_filename,
-                 /*@unused@*/ int all_syms, /*@unused@*/ yasm_dbgfmt *df)
+bin_objfmt_output(yasm_objfmt *objfmt, FILE *f, /*@unused@*/ int all_syms,
+                 /*@unused@*/ yasm_dbgfmt *df)
 {
     yasm_objfmt_bin *objfmt_bin = (yasm_objfmt_bin *)objfmt;
     /*@observer@*/ /*@null@*/ yasm_section *text, *data, *bss, *prevsect;
index fb866aed141c59b2fd3b37b24a81cb9c1db575b9..0ef6b323e56042a4cb7f46bbe4abb214da844891 100644 (file)
@@ -182,6 +182,8 @@ typedef struct yasm_objfmt_coff {
     yasm_object *object;
     yasm_symtab *symtab;
     /*@dependent@*/ yasm_arch *arch;
+
+    coff_symrec_data *filesym_data;        /* Data for .file symbol */
 } yasm_objfmt_coff;
 
 typedef struct coff_objfmt_output_info {
@@ -239,11 +241,10 @@ coff_objfmt_sym_set_data(yasm_symrec *sym, coff_symrec_sclass sclass,
 }
 
 static yasm_objfmt_coff *
-coff_common_create(const char *in_filename, yasm_object *object, yasm_arch *a)
+coff_common_create(yasm_object *object, yasm_arch *a)
 {
     yasm_objfmt_coff *objfmt_coff = yasm_xmalloc(sizeof(yasm_objfmt_coff));
     yasm_symrec *filesym;
-    coff_symrec_data *data;
 
     objfmt_coff->object = object;
     objfmt_coff->symtab = yasm_object_get_symtab(object);
@@ -260,18 +261,19 @@ coff_common_create(const char *in_filename, yasm_object *object, yasm_arch *a)
     /* FIXME: misuse of NULL bytecode here; it works, but only barely. */
     filesym = yasm_symtab_define_special(objfmt_coff->symtab, ".file",
                                         YASM_SYM_GLOBAL);
-    data = coff_objfmt_sym_set_data(filesym, COFF_SCL_FILE, NULL, 1,
-                                   COFF_SYMTAB_AUX_FILE);
-    data->aux[0].fname = yasm__xstrdup(in_filename);
+    objfmt_coff->filesym_data =
+       coff_objfmt_sym_set_data(filesym, COFF_SCL_FILE, NULL, 1,
+                                COFF_SYMTAB_AUX_FILE);
+    /* Filename is set in coff_objfmt_output */
+    objfmt_coff->filesym_data->aux[0].fname = NULL;
 
     return objfmt_coff;
 }
 
 static yasm_objfmt *
-coff_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
+coff_objfmt_create(yasm_object *object, yasm_arch *a)
 {
-    yasm_objfmt_coff *objfmt_coff =
-       coff_common_create(in_filename, object, a);
+    yasm_objfmt_coff *objfmt_coff = coff_common_create(object, a);
 
     if (objfmt_coff) {
        /* Support x86 and amd64 machines of x86 arch */
@@ -292,10 +294,9 @@ coff_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
 }
 
 static yasm_objfmt *
-win32_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
+win32_objfmt_create(yasm_object *object, yasm_arch *a)
 {
-    yasm_objfmt_coff *objfmt_coff =
-       coff_common_create(in_filename, object, a);
+    yasm_objfmt_coff *objfmt_coff = coff_common_create(object, a);
 
     if (objfmt_coff) {
        /* Support x86 and amd64 machines of x86 arch.
@@ -319,10 +320,9 @@ win32_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
 }
 
 static yasm_objfmt *
-win64_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
+win64_objfmt_create(yasm_object *object, yasm_arch *a)
 {
-    yasm_objfmt_coff *objfmt_coff =
-       coff_common_create(in_filename, object, a);
+    yasm_objfmt_coff *objfmt_coff = coff_common_create(object, a);
 
     if (objfmt_coff) {
        /* Support amd64 machine of x86 arch */
@@ -946,8 +946,8 @@ coff_objfmt_output_str(yasm_symrec *sym, /*@null@*/ void *d)
 }
 
 static void
-coff_objfmt_output(yasm_objfmt *objfmt, FILE *f, const char *obj_filename,
-                  int all_syms, /*@unused@*/ yasm_dbgfmt *df)
+coff_objfmt_output(yasm_objfmt *objfmt, FILE *f, int all_syms,
+                  /*@unused@*/ yasm_dbgfmt *df)
 {
     yasm_objfmt_coff *objfmt_coff = (yasm_objfmt_coff *)objfmt;
     coff_objfmt_output_info info;
@@ -957,6 +957,11 @@ coff_objfmt_output(yasm_objfmt *objfmt, FILE *f, const char *obj_filename,
     unsigned long symtab_count;
     unsigned int flags;
 
+    if (objfmt_coff->filesym_data->aux[0].fname)
+       yasm_xfree(objfmt_coff->filesym_data->aux[0].fname);
+    objfmt_coff->filesym_data->aux[0].fname =
+       yasm__xstrdup(yasm_object_get_source_fn(objfmt_coff->object));
+
     /* Force all syms for win64 because they're needed for relocations.
      * FIXME: Not *all* syms need to be output, only the ones needed for
      * relocation.  Find a way to do that someday.
index 2b8b83a5ac7e2b190871a4a74897bdeba1c0635f..dee201889aed477b35ebe887004c0275f89839d5 100644 (file)
@@ -43,8 +43,7 @@ yasm_objfmt_module yasm_dbg_LTX_objfmt;
 
 
 static yasm_objfmt *
-dbg_objfmt_create(const char *in_filename, yasm_object *object,
-                 yasm_arch *a)
+dbg_objfmt_create(yasm_object *object, yasm_arch *a)
 {
     yasm_objfmt_dbg *objfmt_dbg = yasm_xmalloc(sizeof(yasm_objfmt_dbg));
 
@@ -57,14 +56,12 @@ dbg_objfmt_create(const char *in_filename, yasm_object *object,
        fprintf(stderr, N_("could not open temporary file"));
        return 0;
     }
-    fprintf(objfmt_dbg->dbgfile, "create(\"%s\", %s arch)\n",
-           in_filename, yasm_arch_keyword(a));
+    fprintf(objfmt_dbg->dbgfile, "create(%s arch)\n", yasm_arch_keyword(a));
     return (yasm_objfmt *)objfmt_dbg;
 }
 
 static void
-dbg_objfmt_output(yasm_objfmt *objfmt, FILE *f, const char *obj_filename,
-                 int all_syms, yasm_dbgfmt *df)
+dbg_objfmt_output(yasm_objfmt *objfmt, FILE *f, int all_syms, yasm_dbgfmt *df)
 {
     yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)objfmt;
     char buf[1024];
index efe0ab6dc5bad896ef50be1e069c164ad123046b..8012811a0e70bd5582a879d995404a18e2a42bfc 100644 (file)
@@ -63,6 +63,7 @@ typedef struct yasm_objfmt_elf {
     yasm_symtab *symtab;
     /*@dependent@*/ yasm_arch *arch;
     
+    elf_strtab_entry *file_strtab_entry;/* .file symbol associated string */
     yasm_symrec *dotdotsym;            /* ..sym symbol */
 } yasm_objfmt_elf;
 
@@ -157,9 +158,8 @@ elf_objfmt_append_local_sym(yasm_symrec *sym, /*@null@*/ void *d)
 }
 
 static yasm_objfmt *
-elf_objfmt_create_common(const char *in_filename, yasm_object *object,
-                        yasm_arch *a, yasm_objfmt_module *module,
-                        int bits_pref,
+elf_objfmt_create_common(yasm_object *object, yasm_arch *a,
+                        yasm_objfmt_module *module, int bits_pref,
                         const elf_machine_handler **elf_march_out)
 {
     yasm_objfmt_elf *objfmt_elf = yasm_xmalloc(sizeof(yasm_objfmt_elf));
@@ -186,8 +186,11 @@ elf_objfmt_create_common(const char *in_filename, yasm_object *object,
     /* FIXME: misuse of NULL bytecode here; it works, but only barely. */
     filesym = yasm_symtab_define_label(objfmt_elf->symtab, ".file", NULL, 0,
                                       0);
-    entry = elf_symtab_entry_create(
-       elf_strtab_append_str(objfmt_elf->strtab, in_filename), filesym);
+    /* Put in current input filename; we'll replace it in output() */
+    objfmt_elf->file_strtab_entry =
+       elf_strtab_append_str(objfmt_elf->strtab,
+                             yasm_object_get_source_fn(object));
+    entry = elf_symtab_entry_create(objfmt_elf->file_strtab_entry, filesym);
     yasm_symrec_add_data(filesym, &elf_symrec_data, entry);
     elf_symtab_set_nonzero(entry, NULL, SHN_ABS, STB_LOCAL, STT_FILE, NULL,
                           NULL);
@@ -201,14 +204,14 @@ elf_objfmt_create_common(const char *in_filename, yasm_object *object,
 }
 
 static yasm_objfmt *
-elf_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
+elf_objfmt_create(yasm_object *object, yasm_arch *a)
 {
     const elf_machine_handler *elf_march;
     yasm_objfmt *objfmt;
     yasm_objfmt_elf *objfmt_elf;
 
-    objfmt = elf_objfmt_create_common(in_filename, object, a,
-                                     &yasm_elf_LTX_objfmt, 0, &elf_march);
+    objfmt = elf_objfmt_create_common(object, a, &yasm_elf_LTX_objfmt, 0,
+                                     &elf_march);
     if (objfmt) {
        objfmt_elf = (yasm_objfmt_elf *)objfmt;
        /* Figure out which bitness of object format to use */
@@ -221,17 +224,17 @@ elf_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
 }
 
 static yasm_objfmt *
-elf32_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
+elf32_objfmt_create(yasm_object *object, yasm_arch *a)
 {
-    return elf_objfmt_create_common(in_filename, object, a,
-                                   &yasm_elf32_LTX_objfmt, 32, NULL);
+    return elf_objfmt_create_common(object, a, &yasm_elf32_LTX_objfmt, 32,
+                                   NULL);
 }
 
 static yasm_objfmt *
-elf64_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
+elf64_objfmt_create(yasm_object *object, yasm_arch *a)
 {
-    return elf_objfmt_create_common(in_filename, object, a,
-                                   &yasm_elf64_LTX_objfmt, 64, NULL);
+    return elf_objfmt_create_common(object, a, &yasm_elf64_LTX_objfmt, 64,
+                                   NULL);
 }
 
 static long
@@ -587,8 +590,7 @@ elf_objfmt_output_secthead(yasm_section *sect, /*@null@*/ void *d)
 }
 
 static void
-elf_objfmt_output(yasm_objfmt *objfmt, FILE *f, const char *obj_filename,
-                 int all_syms, yasm_dbgfmt *df)
+elf_objfmt_output(yasm_objfmt *objfmt, FILE *f, int all_syms, yasm_dbgfmt *df)
 {
     yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)objfmt;
     elf_objfmt_output_info info;
@@ -604,6 +606,10 @@ elf_objfmt_output(yasm_objfmt *objfmt, FILE *f, const char *obj_filename,
     info.objfmt_elf = objfmt_elf;
     info.f = f;
 
+    /* Update filename strtab */
+    elf_strtab_entry_set_str(objfmt_elf->file_strtab_entry,
+                            yasm_object_get_source_fn(objfmt_elf->object));
+
     /* Allocate space for Ehdr by seeking forward */
     if (fseek(f, (long)(elf_proghead_get_size()), SEEK_SET) < 0) {
        yasm__error(0, N_("could not seek on output file"));
index bab607f18bd74c6dcbf18e49f9bc100c8fc74b2a..6e4aad2b8f108bf5e3e8da2511030abfd1a3e5cb 100644 (file)
@@ -164,6 +164,14 @@ elf_strtab_entry_create(const char *str)
     return entry;
 }
 
+void
+elf_strtab_entry_set_str(elf_strtab_entry *entry, const char *str)
+{
+    if (entry->str)
+       yasm_xfree(entry->str);
+    entry->str = yasm__xstrdup(str);
+}
+
 elf_strtab_head *
 elf_strtab_create()
 {
index b33bbef2412b8d2e59250d8f35ce357258b38c56..e7e37339d0e8f58074d09526b24d5805b8e86f6a 100644 (file)
@@ -421,6 +421,7 @@ void elf_reloc_entry_destroy(void *entry);
 
 /* strtab functions */
 elf_strtab_entry *elf_strtab_entry_create(const char *str);
+void elf_strtab_entry_set_str(elf_strtab_entry *entry, const char *str);
 elf_strtab_head *elf_strtab_create(void);
 elf_strtab_entry *elf_strtab_append_str(elf_strtab_head *head, const char *str);
 void elf_strtab_destroy(elf_strtab_head *head);
index 737adf33b25b4964973ca9c006212c24b17a6812..8faa4432426893de1d3b8b7286dc0aa2fe08908f 100644 (file)
@@ -128,7 +128,7 @@ yasm_objfmt_module yasm_xdf_LTX_objfmt;
 
 
 static yasm_objfmt *
-xdf_objfmt_create(const char *in_filename, yasm_object *object, yasm_arch *a)
+xdf_objfmt_create(yasm_object *object, yasm_arch *a)
 {
     yasm_objfmt_xdf *objfmt_xdf = yasm_xmalloc(sizeof(yasm_objfmt_xdf));
 
@@ -585,8 +585,8 @@ xdf_objfmt_output_str(yasm_symrec *sym, /*@null@*/ void *d)
 }
 
 static void
-xdf_objfmt_output(yasm_objfmt *objfmt, FILE *f, const char *obj_filename,
-                 int all_syms, /*@unused@*/ yasm_dbgfmt *df)
+xdf_objfmt_output(yasm_objfmt *objfmt, FILE *f, int all_syms,
+                 /*@unused@*/ yasm_dbgfmt *df)
 {
     yasm_objfmt_xdf *objfmt_xdf = (yasm_objfmt_xdf *)objfmt;
     xdf_objfmt_output_info info;