From efa19bfde4d57f33974cac17dfddb18f6f460f43 Mon Sep 17 00:00:00 2001
From: Jan Beulich <jbeulich@novell.com>
Date: Mon, 27 Jul 2009 10:04:25 +0000
Subject: [PATCH] gas/ 2009-07-27  Jan Beulich  <jbeulich@novell.com>

	* obj-elf.c (elf_file_symbol): Replace symbol name set up by
	symbol_new() with the passed in, unmodified one.

gas/testsuite/
2009-07-27  Jan Beulich  <jbeulich@novell.com>

	* gas/elf/file.[ds]: New.
	* gas/elf/elf.exp: Run new test.
---
 gas/ChangeLog                 |  5 +++++
 gas/config/obj-elf.c          | 11 +++++++++++
 gas/testsuite/ChangeLog       |  5 +++++
 gas/testsuite/gas/elf/elf.exp | 14 ++++++++++++++
 gas/testsuite/gas/elf/file.d  | 18 ++++++++++++++++++
 gas/testsuite/gas/elf/file.s  | 29 +++++++++++++++++++++++++++++
 6 files changed, 82 insertions(+)
 create mode 100644 gas/testsuite/gas/elf/file.d
 create mode 100644 gas/testsuite/gas/elf/file.s

diff --git a/gas/ChangeLog b/gas/ChangeLog
index ffeb31c487..122b42724c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-27  Jan Beulich  <jbeulich@novell.com>
+
+	* obj-elf.c (elf_file_symbol): Replace symbol name set up by
+	symbol_new() with the passed in, unmodified one.
+
 2009-07-27  M R Swami Reddy <MR.Swami.Reddy@nsc.com>
 
 	* config/tc-cr16.c (md_apply_fix): Put the addend value alone in to
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index f85267bb77..51cd3a9ff1 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -260,9 +260,20 @@ elf_file_symbol (const char *s, int appfile)
       || (symbol_rootP->bsym->flags & BSF_FILE) == 0)
     {
       symbolS *sym;
+      unsigned int name_length;
 
       sym = symbol_new (s, absolute_section, 0, NULL);
       symbol_set_frag (sym, &zero_address_frag);
+
+      name_length = strlen (s);
+      if (name_length > strlen (S_GET_NAME (sym)))
+	{
+	  obstack_grow (&notes, s, name_length + 1);
+	  S_SET_NAME (sym, obstack_finish (&notes));
+	}
+      else
+	strcpy ((char *) S_GET_NAME (sym), s);
+
       symbol_get_bfdsym (sym)->flags |= BSF_FILE;
 
       if (symbol_rootP != sym)
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 2769e04c40..ebe6b7ee41 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-27  Jan Beulich  <jbeulich@novell.com>
+
+	* gas/elf/file.[ds]: New.
+	* gas/elf/elf.exp: Run new test.
+
 2009-07-25  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* gas/i386/l1om.d: New.
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 454aa60491..65245f4e8a 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -82,6 +82,20 @@ if { ([istarget "*-*-*elf*"]
 	&& ![istarget "am3*-*-*"]} then {    
       run_dump_test "ehopt0"
     }
+    case $target_triplet in {
+	{ m68k-*-* m68[03]??-*-* } {
+	    run_dump_test "file" { { as "--defsym m68k=1" } }
+	}
+	{ mmix-*-* } {
+	    run_dump_test "file" { { as "--defsym mmix=1" } }
+	}
+	{ xtensa*-*-* } {
+	    run_dump_test "file" { { as "--rename-section file.s=file.c" } }
+	}
+	default {
+	    run_dump_test "file"
+	}
+    }
     run_dump_test "group0a" 
     run_dump_test "group0b" 
     run_dump_test "group1a" 
diff --git a/gas/testsuite/gas/elf/file.d b/gas/testsuite/gas/elf/file.d
new file mode 100644
index 0000000000..1e98186354
--- /dev/null
+++ b/gas/testsuite/gas/elf/file.d
@@ -0,0 +1,18 @@
+#objdump: -t
+#name: .file file names
+
+.*: .*
+
+SYMBOL TABLE:
+#...
+0+ l[ ]*df \*ABS\*[ 	]+0+ file\.s
+0+ l[ ]*df \*ABS\*[ 	]+0+ slash/data
+0+ l[ ]*df \*ABS\*[ 	]+0+ \{braces\}
+0+ l[ ]*df \*ABS\*[ 	]+0+ \[brackets\]
+0+ l[ ]*df \*ABS\*[ 	]+0+ /dir/file\.s
+0+ l[ ]*df \*ABS\*[ 	]+0+ :colon
+0+ l[ ]*df \*ABS\*[ 	]+0+ UPPER
+0+ l[ ]*df \*ABS\*[ 	]+0+ lower
+0+ l[ ]*df \*ABS\*[ 	]+0+ hash\#
+0+ l[ ]*df \*ABS\*[ 	]+0+ ~tilde
+#pass
diff --git a/gas/testsuite/gas/elf/file.s b/gas/testsuite/gas/elf/file.s
new file mode 100644
index 0000000000..7718cc7c78
--- /dev/null
+++ b/gas/testsuite/gas/elf/file.s
@@ -0,0 +1,29 @@
+	# delta (m68k sub-target)
+	.file "~tilde"
+
+	# ia64
+	.file "hash#"
+
+	# m68k
+	.ifdef m86k
+	.opt nocase
+	.endif
+	.file "lower"
+	.file "UPPER"
+
+	# mmix
+	.file ":colon"
+	.ifdef mmix
+	.prefix prefix
+	.endif
+	.file "/dir/file.s"
+
+	# ppc/xcoff
+	.file "[brackets]"
+	.file "{braces}"
+
+	# thumb (arm sub-target)
+	.file "slash/data"
+
+	# xtensa (through --rename-section file.s=file.c)
+	.file "file.s"