This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
[Bug libc/3350] New: Move nested function to a static one so we avoid generating a trampoline.
- From: "robert at linuxfromscratch dot org" <sourceware-bugzilla at sourceware dot org>
- To: glibc-bugs at sources dot redhat dot com
- Date: 11 Oct 2006 21:42:10 -0000
- Subject: [Bug libc/3350] New: Move nested function to a static one so we avoid generating a trampoline.
- Reply-to: sourceware-bugzilla at sourceware dot org
The following patch fixes issues with some modified Linux kernels:
diff -Naur glibc-2.5.orig/iconv/iconvconfig.c glibc-2.5/iconv/iconvconfig.c
--- glibc-2.5.orig/iconv/iconvconfig.c 2006-09-21 03:57:30.000000000 +0000
+++ glibc-2.5/iconv/iconvconfig.c 2006-10-11 21:36:18.000000000 +0000
@@ -1011,6 +1011,38 @@
module name offset
(following last entry with step count 0)
*/
+
+/* Function to insert the names. */
+/* Made non-nested to avoid trampoline.
+ * Requires hash_table and hash_size to be made global,
+ * but since the caller (write_output) is called once
+ * in the only thread there should be no problem */
+static struct hash_entry *hash_table;
+static size_t hash_size;
+static void
+name_insert (const void *nodep, VISIT value, int level)
+ {
+ struct name *name;
+ unsigned int idx;
+ unsigned int hval2;
+
+ if (value != leaf && value != postorder)
+ return;
+
+ name = *(struct name **) nodep;
+ idx = name->hashval % hash_size;
+ hval2 = 1 + name->hashval % (hash_size - 2);
+
+ while (hash_table[idx].string_offset != 0)
+ if ((idx += hval2) >= hash_size)
+ idx -= hash_size;
+
+ hash_table[idx].string_offset = strtaboffset (name->strent);
+
+ assert (name->module_idx != -1);
+ hash_table[idx].module_idx = name->module_idx;
+ }
+
static int
write_output (void)
{
@@ -1018,8 +1050,6 @@
char *string_table;
size_t string_table_size;
struct gconvcache_header header;
- struct hash_entry *hash_table;
- size_t hash_size;
struct module_entry *module_table;
char *extra_table;
char *cur_extra_table;
@@ -1032,30 +1062,6 @@
char tmpfname[(output_file == NULL ? sizeof finalname : output_file_len + 1)
+ strlen (".XXXXXX")];
- /* Function to insert the names. */
- auto void
- name_insert (const void *nodep, VISIT value, int level)
- {
- struct name *name;
- unsigned int idx;
- unsigned int hval2;
-
- if (value != leaf && value != postorder)
- return;
-
- name = *(struct name **) nodep;
- idx = name->hashval % hash_size;
- hval2 = 1 + name->hashval % (hash_size - 2);
-
- while (hash_table[idx].string_offset != 0)
- if ((idx += hval2) >= hash_size)
- idx -= hash_size;
-
- hash_table[idx].string_offset = strtaboffset (name->strent);
-
- assert (name->module_idx != -1);
- hash_table[idx].module_idx = name->module_idx;
- }
/* Open the output file. */
if (output_file == NULL)
--
Summary: Move nested function to a static one so we avoid
generating a trampoline.
Product: glibc
Version: unspecified
Status: NEW
Severity: normal
Priority: P2
Component: libc
AssignedTo: drepper at redhat dot com
ReportedBy: robert at linuxfromscratch dot org
CC: glibc-bugs at sources dot redhat dot com
http://sourceware.org/bugzilla/show_bug.cgi?id=3350
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.