diff --git a/sim/ppc/gen-icache.c b/sim/ppc/gen-icache.c
index 4efc7392705a..c10735c1764b 100644
--- a/sim/ppc/gen-icache.c
+++ b/sim/ppc/gen-icache.c
@@ -21,6 +21,7 @@
 
 #include "misc.h"
 #include "lf.h"
+#include "lf-ppc.h"
 #include "table.h"
 
 #include "filter.h"
@@ -44,7 +45,7 @@ print_icache_function_header(lf *file,
 			     int is_function_definition)
 {
   lf_printf(file, "\n");
-  lf_print_function_type(file, ICACHE_FUNCTION_TYPE, "EXTERN_ICACHE", " ");
+  lf_print__function_type(file, ICACHE_FUNCTION_TYPE, "EXTERN_ICACHE", " ");
   print_function_name(file,
 		      basename,
 		      expanded_bits,
@@ -111,7 +112,7 @@ print_icache_extraction(lf *file,
   }
   else {
     if (file_name != NULL)
-      lf_print__external_reference(file, line_nr, file_name);
+      lf_print__external_ref(file, line_nr, file_name);
     lf_printf(file, "%s const %s ATTRIBUTE_UNUSED = ",
 	      entry_type == NULL ? "unsigned" : entry_type,
 	      entry_name);
@@ -344,7 +345,7 @@ print_icache_body(lf *file,
     }
   }
 
-  lf_print__internal_reference(file);
+  lf_print__internal_ref(file);
 
   if ((code & generate_with_insn_in_icache)) {
     lf_printf(file, "\n");
@@ -499,7 +500,7 @@ print_icache_function(lf *file,
 
   /* generate code to enter decoded instruction into the icache */
   lf_printf(file, "\n");
-  lf_print_function_type(file, ICACHE_FUNCTION_TYPE, "EXTERN_ICACHE", "\n");
+  lf_print__function_type(file, ICACHE_FUNCTION_TYPE, "EXTERN_ICACHE", "\n");
   indent = print_function_name(file,
 			       instruction->file_entry->fields[insn_name],
 			       expanded_bits,
@@ -623,7 +624,7 @@ print_icache_internal_function_declaration(insn_table *table,
   ASSERT((code & generate_with_icache) != 0);
   if (it_is("internal", function->fields[insn_flags])) {
     lf_printf(file, "\n");
-    lf_print_function_type(file, ICACHE_FUNCTION_TYPE, "PSIM_INLINE_ICACHE",
+    lf_print__function_type(file, ICACHE_FUNCTION_TYPE, "PSIM_INLINE_ICACHE",
 			   "\n");
     print_function_name(file,
 			function->fields[insn_name],
@@ -643,7 +644,7 @@ print_icache_internal_function_definition(insn_table *table,
   ASSERT((code & generate_with_icache) != 0);
   if (it_is("internal", function->fields[insn_flags])) {
     lf_printf(file, "\n");
-    lf_print_function_type(file, ICACHE_FUNCTION_TYPE, "PSIM_INLINE_ICACHE",
+    lf_print__function_type(file, ICACHE_FUNCTION_TYPE, "PSIM_INLINE_ICACHE",
 			   "\n");
     print_function_name(file,
 			function->fields[insn_name],
@@ -668,7 +669,7 @@ print_icache_internal_function_definition(insn_table *table,
       lf_printf(file, ";\n");
     }
     
-    lf_print__internal_reference(file);
+    lf_print__internal_ref(file);
     lf_indent(file, -2);
     lf_printf(file, "}\n");
   }
diff --git a/sim/ppc/gen-idecode.c b/sim/ppc/gen-idecode.c
index 5d2253500594..55c62906735a 100644
--- a/sim/ppc/gen-idecode.c
+++ b/sim/ppc/gen-idecode.c
@@ -19,6 +19,7 @@
 
 #include "misc.h"
 #include "lf.h"
+#include "lf-ppc.h"
 #include "table.h"
 
 #include "filter.h"
@@ -1217,7 +1218,7 @@ print_jump_internal_function(insn_table *table,
     lf_indent(file, +2);
     lf_printf(file, "const unsigned_word cia = nia;\n");
     lf_print__c_code(file, function->annex);
-    lf_print__internal_reference(file);
+    lf_print__internal_ref(file);
     lf_printf(file, "error(\"Internal function must longjump\\n\");\n");
     lf_indent(file, -2);
     lf_printf(file, "}\n");
@@ -1447,7 +1448,7 @@ print_idecode_run_function_header(lf *file,
 {
   int indent;
   lf_printf(file, "\n");
-  lf_print_function_type(file, "void", "PSIM_INLINE_IDECODE", (is_definition ? " " : "\n"));
+  lf_print__function_type(file, "void", "PSIM_INLINE_IDECODE", (is_definition ? " " : "\n"));
   indent = lf_putstr(file, (can_stop ? "idecode_run_until_stop" : "idecode_run"));
   if (is_definition)
     lf_putstr(file, "\n");
diff --git a/sim/ppc/gen-model.c b/sim/ppc/gen-model.c
index 11a533b2d93a..e763d4eadd4b 100644
--- a/sim/ppc/gen-model.c
+++ b/sim/ppc/gen-model.c
@@ -20,6 +20,7 @@
 
 #include "misc.h"
 #include "lf.h"
+#include "lf-ppc.h"
 #include "table.h"
 
 #include "filter.h"
@@ -39,7 +40,7 @@ model_c_or_h_data(insn_table *table,
   if (data->annex) {
     table_entry_print_cpp_line_nr(file, data);
     lf_print__c_code(file, data->annex);
-    lf_print__internal_reference(file);
+    lf_print__internal_ref(file);
     lf_printf(file, "\n");
   }
 }
@@ -55,7 +56,7 @@ model_c_or_h_function(insn_table *entry,
     ERROR("Model function type not specified for %s", function->fields[function_name]);
   }
   lf_printf(file, "\n");
-  lf_print_function_type(file, function->fields[function_type], prefix, " ");
+  lf_print__function_type(file, function->fields[function_type], prefix, " ");
   lf_printf(file, "%s\n(%s);\n",
 	    function->fields[function_name],
 	    function->fields[function_param]);
@@ -117,42 +118,42 @@ gen_model_h(insn_table *table, lf *file)
   }
 
   if (!model_create_p) {
-    lf_print_function_type(file, "model_data *", "INLINE_MODEL", " ");
+    lf_print__function_type(file, "model_data *", "INLINE_MODEL", " ");
     lf_printf(file, "model_create\n");
     lf_printf(file, "(cpu *processor);\n");
     lf_printf(file, "\n");
   }
 
   if (!model_init_p) {
-    lf_print_function_type(file, "void", "INLINE_MODEL", " ");
+    lf_print__function_type(file, "void", "INLINE_MODEL", " ");
     lf_printf(file, "model_init\n");
     lf_printf(file, "(model_data *model_ptr);\n");
     lf_printf(file, "\n");
   }
 
   if (!model_halt_p) {
-    lf_print_function_type(file, "void", "INLINE_MODEL", " ");
+    lf_print__function_type(file, "void", "INLINE_MODEL", " ");
     lf_printf(file, "model_halt\n");
     lf_printf(file, "(model_data *model_ptr);\n");
     lf_printf(file, "\n");
   }
 
   if (!model_mon_info_p) {
-    lf_print_function_type(file, "model_print *", "INLINE_MODEL", " ");
+    lf_print__function_type(file, "model_print *", "INLINE_MODEL", " ");
     lf_printf(file, "model_mon_info\n");
     lf_printf(file, "(model_data *model_ptr);\n");
     lf_printf(file, "\n");
   }
 
   if (!model_mon_info_free_p) {
-    lf_print_function_type(file, "void", "INLINE_MODEL", " ");
+    lf_print__function_type(file, "void", "INLINE_MODEL", " ");
     lf_printf(file, "model_mon_info_free\n");
     lf_printf(file, "(model_data *model_ptr,\n");
     lf_printf(file, " model_print *info_ptr);\n");
     lf_printf(file, "\n");
   }
 
-  lf_print_function_type(file, "void", "INLINE_MODEL", " ");
+  lf_print__function_type(file, "void", "INLINE_MODEL", " ");
   lf_printf(file, "model_set\n");
   lf_printf(file, "(const char *name);\n");
 }
@@ -207,7 +208,7 @@ model_c_function(insn_table *table,
   }
   else {
     lf_printf(file, "\n");
-    lf_print_function_type(file, function->fields[function_type], prefix, "\n");
+    lf_print__function_type(file, function->fields[function_type], prefix, "\n");
     lf_printf(file, "%s(%s)\n",
 	      function->fields[function_name],
 	      function->fields[function_param]);
@@ -220,7 +221,7 @@ model_c_function(insn_table *table,
     lf_indent(file, -2);
   }
   lf_printf(file, "}\n");
-  lf_print__internal_reference(file);
+  lf_print__internal_ref(file);
   lf_printf(file, "\n");
 }
 
@@ -279,7 +280,7 @@ gen_model_c(insn_table *table, lf *file)
   }
 
   if (!model_create_p) {
-    lf_print_function_type(file, "model_data *", "INLINE_MODEL", "\n");
+    lf_print__function_type(file, "model_data *", "INLINE_MODEL", "\n");
     lf_printf(file, "model_create(cpu *processor)\n");
     lf_printf(file, "{\n");
     lf_printf(file, "  return (model_data *)0;\n");
@@ -288,7 +289,7 @@ gen_model_c(insn_table *table, lf *file)
   }
 
   if (!model_init_p) {
-    lf_print_function_type(file, "void", "INLINE_MODEL", "\n");
+    lf_print__function_type(file, "void", "INLINE_MODEL", "\n");
     lf_printf(file, "model_init(model_data *model_ptr)\n");
     lf_printf(file, "{\n");
     lf_printf(file, "}\n");
@@ -296,7 +297,7 @@ gen_model_c(insn_table *table, lf *file)
   }
 
   if (!model_halt_p) {
-    lf_print_function_type(file, "void", "INLINE_MODEL", "\n");
+    lf_print__function_type(file, "void", "INLINE_MODEL", "\n");
     lf_printf(file, "model_halt(model_data *model_ptr)\n");
     lf_printf(file, "{\n");
     lf_printf(file, "}\n");
@@ -304,7 +305,7 @@ gen_model_c(insn_table *table, lf *file)
   }
 
   if (!model_mon_info_p) {
-    lf_print_function_type(file, "model_print *", "INLINE_MODEL", "\n");
+    lf_print__function_type(file, "model_print *", "INLINE_MODEL", "\n");
     lf_printf(file, "model_mon_info(model_data *model_ptr)\n");
     lf_printf(file, "{\n");
     lf_printf(file, "  return (model_print *)0;\n");
@@ -313,7 +314,7 @@ gen_model_c(insn_table *table, lf *file)
   }
 
   if (!model_mon_info_free_p) {
-    lf_print_function_type(file, "void", "INLINE_MODEL", "\n");
+    lf_print__function_type(file, "void", "INLINE_MODEL", "\n");
     lf_printf(file, "model_mon_info_free(model_data *model_ptr,\n");
     lf_printf(file, "                    model_print *info_ptr)\n");
     lf_printf(file, "{\n");
@@ -359,7 +360,7 @@ gen_model_c(insn_table *table, lf *file)
   lf_printf(file, "#endif\n");
   lf_printf(file, "\n");
 
-  lf_print_function_type(file, "void", "INLINE_MODEL", "\n");
+  lf_print__function_type(file, "void", "INLINE_MODEL", "\n");
   lf_printf(file, "model_set(const char *name)\n");
   lf_printf(file, "{\n");
   if (models) {
diff --git a/sim/ppc/gen-semantics.c b/sim/ppc/gen-semantics.c
index b0646fa83871..587080b5f64e 100644
--- a/sim/ppc/gen-semantics.c
+++ b/sim/ppc/gen-semantics.c
@@ -21,6 +21,7 @@
 
 #include "misc.h"
 #include "lf.h"
+#include "lf-ppc.h"
 #include "table.h"
 #include "filter.h"
 
@@ -43,7 +44,7 @@ print_semantic_function_header(lf *file,
 {
   int indent;
   lf_printf(file, "\n");
-  lf_print_function_type(file, SEMANTIC_FUNCTION_TYPE, "PSIM_EXTERN_SEMANTICS",
+  lf_print__function_type(file, SEMANTIC_FUNCTION_TYPE, "PSIM_EXTERN_SEMANTICS",
 			 (is_function_definition ? "\n" : " "));
   indent = print_function_name(file,
 			       basename,
@@ -138,17 +139,17 @@ print_semantic_body(lf *file,
     lf_print__c_code(file, instruction->file_entry->annex);
     lf_indent(file, -2);
     lf_printf(file, "}\n");
-    lf_print__internal_reference(file);
+    lf_print__internal_ref(file);
   }
   else if (it_is("nop", instruction->file_entry->fields[insn_flags])) {
-    lf_print__internal_reference(file);
+    lf_print__internal_ref(file);
   }
   else {
     /* abort so it is implemented now */
     table_entry_print_cpp_line_nr(file, instruction->file_entry);
     lf_putstr(file, "error(\"%s:%d:0x%08lx:%s unimplemented\\n\",\n");
     lf_printf(file, "      itable[MY_INDEX].file, itable[MY_INDEX].line_nr, (long)cia, itable[MY_INDEX].name);\n");
-    lf_print__internal_reference(file);
+    lf_print__internal_ref(file);
   }
 }
 
diff --git a/sim/ppc/gen-support.c b/sim/ppc/gen-support.c
index 85ab497e20e9..0c2b28a42b07 100644
--- a/sim/ppc/gen-support.c
+++ b/sim/ppc/gen-support.c
@@ -19,6 +19,7 @@
 
 #include "misc.h"
 #include "lf.h"
+#include "lf-ppc.h"
 #include "table.h"
 #include "filter.h"
 
@@ -37,7 +38,7 @@ print_support_function_name(lf *file,
 			    int is_function_definition)
 {
   if (it_is("internal", function->fields[insn_flags])) {
-    lf_print_function_type(file, SEMANTIC_FUNCTION_TYPE, "PSIM_INLINE_SUPPORT",
+    lf_print__function_type(file, SEMANTIC_FUNCTION_TYPE, "PSIM_INLINE_SUPPORT",
 			   (is_function_definition ? "\n" : " "));
     print_function_name(file,
 			function->fields[function_name],
@@ -49,7 +50,7 @@ print_support_function_name(lf *file,
     lf_printf(file, "\n");
   }
   else {
-    lf_print_function_type(file,
+    lf_print__function_type(file,
 			   function->fields[function_type],
 			   "PSIM_INLINE_SUPPORT",
 			   (is_function_definition ? "\n" : " "));
@@ -110,7 +111,7 @@ support_c_function(insn_table *table,
   }
   lf_indent(file, -2);
   lf_printf(file, "}\n");
-  lf_print__internal_reference(file);
+  lf_print__internal_ref(file);
   lf_printf(file, "\n");
 }
 
diff --git a/sim/ppc/igen.c b/sim/ppc/igen.c
index 264d8086874a..1e6951d8e66a 100644
--- a/sim/ppc/igen.c
+++ b/sim/ppc/igen.c
@@ -158,12 +158,12 @@ print_itrace(lf *file,
 	     table_entry *file_entry,
 	     int idecode)
 {
-  lf_print__external_reference(file, file_entry->line_nr, file_entry->file_name);
+  lf_print__external_ref(file, file_entry->line_nr, file_entry->file_name);
   lf_printf(file, "ITRACE(trace_%s, (\"%s %s\\n\"));\n",
 	    (idecode ? "idecode" : "semantics"),
 	    (idecode ? "idecode" : "semantics"),
 	    file_entry->fields[insn_name]);
-  lf_print__internal_reference(file);
+  lf_print__internal_ref(file);
 }
 
 
@@ -201,7 +201,7 @@ gen_semantics_h(insn_table *table,
     
   }
   else {
-    lf_print__this_file_is_empty(file);
+    lf_print__this_file_is_empty(file, "generating jumps");
   }
 }
 
@@ -250,7 +250,7 @@ gen_semantics_c(insn_table *table,
     
   }
   else {
-    lf_print__this_file_is_empty(file);
+    lf_print__this_file_is_empty(file, "generating jump engine");
   }
 }
 
@@ -287,7 +287,7 @@ gen_icache_h(insn_table *table,
     
   }
   else {
-    lf_print__this_file_is_empty(file);
+    lf_print__this_file_is_empty(file, "generating jump engine");
   }
 }
 
@@ -331,7 +331,7 @@ gen_icache_c(insn_table *table,
     
   }
   else {
-    lf_print__this_file_is_empty(file);
+    lf_print__this_file_is_empty(file, "generating jump engine");
   }
 }
 
diff --git a/sim/ppc/lf-ppc.c b/sim/ppc/lf-ppc.c
new file mode 100644
index 000000000000..469f0fbe4958
--- /dev/null
+++ b/sim/ppc/lf-ppc.c
@@ -0,0 +1,66 @@
+/*  This file is part of the program psim.
+
+    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+    */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lf.h"
+#include "lf-ppc.h"
+
+int
+lf_print__c_code(lf *file,
+		 const char *code)
+{
+  int nr = 0;
+  const char *chp = code;
+  int in_bit_field = 0;
+  while (*chp != '\0') {
+    if (*chp == '\t')
+      chp++;
+    if (*chp == '#')
+      lf_indent_suppress(file);
+    while (*chp != '\0' && *chp != '\n') {
+      if (chp[0] == '{' && !isspace(chp[1])) {
+	in_bit_field = 1;
+	nr += lf_putchr(file, '_');
+      }
+      else if (in_bit_field && chp[0] == ':') {
+	nr += lf_putchr(file, '_');
+      }
+      else if (in_bit_field && *chp == '}') {
+	nr += lf_putchr(file, '_');
+	in_bit_field = 0;
+      }
+      else {
+	nr += lf_putchr(file, *chp);
+      }
+      chp++;
+    }
+    if (in_bit_field)
+      ERROR("bit field paren miss match some where\n");
+    if (*chp == '\n') {
+      nr += lf_putchr(file, '\n');
+      chp++;
+    }
+  }
+  nr += lf_putchr(file, '\n');
+  return nr;
+}
diff --git a/sim/ppc/lf-ppc.h b/sim/ppc/lf-ppc.h
new file mode 100644
index 000000000000..7a31950badca
--- /dev/null
+++ b/sim/ppc/lf-ppc.h
@@ -0,0 +1,33 @@
+/*  This file is part of the program psim.
+
+    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+    */
+
+#ifndef PPC_LF_H
+#define PPC_LF_H
+
+/* LF: Line Numbered Output Stream */
+
+#include "lf.h"
+
+/* TODO: Convert to igen/table.c table_print_code.  */
+
+extern int lf_print__c_code
+(lf *file,
+ const char *code);
+
+#endif /* PPC_LF_H */
diff --git a/sim/ppc/lf.c b/sim/ppc/lf.c
deleted file mode 100644
index 9deb2d2bb523..000000000000
--- a/sim/ppc/lf.c
+++ /dev/null
@@ -1,495 +0,0 @@
-/*  This file is part of the program psim.
-
-    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, see <http://www.gnu.org/licenses/>.
-
-    */
-
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <ctype.h>
-
-#include "misc.h"
-#include "lf.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-struct _lf {
-  FILE *stream;
-  int line_nr; /* nr complete lines written, curr line is line_nr+1 */
-  int indent;
-  int line_blank;
-  const char *name;		/* Output name with diagnostics.  */
-  const char *filename;		/* Output filename.  */
-  char *tmpname;		/* Temporary output filename.  */
-  const char *program;
-  lf_file_references references;
-  lf_file_type type;
-};
-
-
-lf *
-lf_open(const char *name,
-	const char *real_name,
-	lf_file_references references,
-	lf_file_type type,
-	const char *program)
-{
-  /* create a file object */
-  lf *new_lf = ZALLOC(lf);
-  ASSERT(new_lf != NULL);
-  new_lf->references = references;
-  new_lf->type = type;
-  new_lf->name = (real_name == NULL ? name : real_name);
-  new_lf->filename = name;
-  new_lf->program = program;
-  /* attach to stdout if pipe */
-  if (!strcmp(name, "-")) {
-    new_lf->stream = stdout;
-  }
-  else {
-    /* create a new file */
-    char *tmpname = zalloc (strlen (name) + 5);
-    sprintf (tmpname, "%s.tmp", name);
-    new_lf->filename = name;
-    new_lf->tmpname = tmpname;
-    new_lf->stream = fopen(tmpname, "w+");
-    if (new_lf->stream == NULL) {
-      perror(name);
-      exit(1);
-    }
-  }
-  return new_lf;
-}
-
-
-void
-lf_close(lf *file)
-{
-  FILE *fp;
-  bool update = true;
-
-  /* If we wrote to stdout, no house keeping needed.  */
-  if (file->stream == stdout)
-    return;
-
-  /* Rename the temp file to the real file if it's changed.  */
-  fp = fopen (file->filename, "r");
-  if (fp != NULL)
-    {
-      off_t len;
-
-      fseek (fp, 0, SEEK_END);
-      len = ftell (fp);
-
-      if (len == ftell (file->stream))
-	{
-	  off_t off;
-	  size_t cnt;
-	  char *oldbuf = zalloc (len);
-	  char *newbuf = zalloc (len);
-
-	  rewind (fp);
-	  off = 0;
-	  while ((cnt = fread (oldbuf + off, 1, len - off, fp)) > 0)
-	    off += cnt;
-	  ASSERT (off == len);
-
-	  rewind (file->stream);
-	  off = 0;
-	  while ((cnt = fread (newbuf + off, 1, len - off, file->stream)) > 0)
-	    off += cnt;
-	  ASSERT (off == len);
-
-	  if (memcmp (oldbuf, newbuf, len) == 0)
-	    update = false;
-	}
-
-      fclose (fp);
-    }
-
-  if (fclose (file->stream))
-    {
-      perror ("lf_close.fclose");
-      exit (1);
-    }
-
-  if (update)
-    {
-      if (rename (file->tmpname, file->filename) != 0)
-	{
-	  perror ("lf_close.rename");
-	  exit (1);
-	}
-    }
-  else
-    {
-      if (remove (file->tmpname) != 0)
-	{
-	  perror ("lf_close.unlink");
-	  exit (1);
-	}
-    }
-
-  free (file->tmpname);
-  free (file);
-}
-
-
-int
-lf_putchr(lf *file,
-	  const char chr)
-{
-  int nr = 0;
-  if (chr == '\n') {
-    file->line_nr += 1;
-    file->line_blank = 1;
-  }
-  else if (file->line_blank) {
-    int pad;
-    for (pad = file->indent; pad > 0; pad--)
-      putc(' ', file->stream);
-    nr += file->indent;
-    file->line_blank = 0;
-  }
-  putc(chr, file->stream);
-  nr += 1;
-  return nr;
-}
-
-void
-lf_indent_suppress(lf *file)
-{
-  file->line_blank = 0;
-}
-
-
-int
-lf_putstr(lf *file,
-	  const char *string)
-{
-  int nr = 0;
-  const char *chp;
-  if (string != NULL) {
-    for (chp = string; *chp != '\0'; chp++) {
-      nr += lf_putchr(file, *chp);
-    }
-  }
-  return nr;
-}
-
-static int
-do_lf_putunsigned(lf *file,
-	      unsigned u)
-{
-  int nr = 0;
-  if (u > 0) {
-    nr += do_lf_putunsigned(file, u / 10);
-    nr += lf_putchr(file, (u % 10) + '0');
-  }
-  return nr;
-}
-
-
-int
-lf_putint(lf *file,
-	  int decimal)
-{
-  int nr = 0;
-  if (decimal == 0)
-    nr += lf_putchr(file, '0');
-  else if (decimal < 0) {
-    nr += lf_putchr(file, '-');
-    nr += do_lf_putunsigned(file, -decimal);
-  }
-  else if (decimal > 0) {
-    nr += do_lf_putunsigned(file, decimal);
-  }
-  else
-    ASSERT(0);
-  return nr;
-}
-
-
-int
-lf_printf(lf *file,
-	  const char *fmt,
-	  ...)
-{
-  int nr = 0;
-  char buf[1024];
-  va_list ap;
-
-  va_start(ap, fmt);
-  vsprintf(buf, fmt, ap);
-  /* FIXME - this is really stuffed but so is vsprintf() on a sun! */
-  ASSERT(strlen(buf) > 0 && strlen(buf) < sizeof(buf));
-  nr += lf_putstr(file, buf);
-  va_end(ap);
-  return nr;
-}
-
-
-int
-lf_print__c_code(lf *file,
-		 const char *code)
-{
-  int nr = 0;
-  const char *chp = code;
-  int in_bit_field = 0;
-  while (*chp != '\0') {
-    if (*chp == '\t')
-      chp++;
-    if (*chp == '#')
-      lf_indent_suppress(file);
-    while (*chp != '\0' && *chp != '\n') {
-      if (chp[0] == '{' && !isspace(chp[1])) {
-	in_bit_field = 1;
-	nr += lf_putchr(file, '_');
-      }
-      else if (in_bit_field && chp[0] == ':') {
-	nr += lf_putchr(file, '_');
-      }
-      else if (in_bit_field && *chp == '}') {
-	nr += lf_putchr(file, '_');
-	in_bit_field = 0;
-      }
-      else {
-	nr += lf_putchr(file, *chp);
-      }
-      chp++;
-    }
-    if (in_bit_field)
-      ERROR("bit field paren miss match some where\n");
-    if (*chp == '\n') {
-      nr += lf_putchr(file, '\n');
-      chp++;
-    }
-  }
-  nr += lf_putchr(file, '\n');
-  return nr;
-}
-
-
-int
-lf_print__external_reference(lf *file,
-			     int line_nr,
-			     const char *file_name)
-{
-  int nr = 0;
-  switch (file->references) {
-  case lf_include_references:
-    lf_indent_suppress(file);
-    nr += lf_putstr(file, "#line ");
-    nr += lf_putint(file, line_nr);
-    nr += lf_putstr(file, " \"");
-    nr += lf_putstr(file, file_name);
-    nr += lf_putstr(file, "\"\n");
-    break;
-  case lf_omit_references:
-    break;
-  }
-  return nr;
-}
-
-int
-lf_print__internal_reference(lf *file)
-{
-  int nr = 0;
-  nr += lf_print__external_reference(file, file->line_nr+2, file->name);
-  /* line_nr == last_line, want to number from next */
-  return nr;
-}
-
-void
-lf_indent(lf *file, int delta)
-{
-  file->indent += delta;
-}
-
-
-int
-lf_print__gnu_copyleft(lf *file)
-{
-  int nr = 0;
-  switch (file->type) {
-  case lf_is_c:
-  case lf_is_h:
-    nr += lf_printf(file, "\n\
-/*  This file is part of the program psim.\n\
-\n\
-    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>\n\
-\n\
-    This program is free software; you can redistribute it and/or modify\n\
-    it under the terms of the GNU General Public License as published by\n\
-    the Free Software Foundation; either version 3 of the License, or\n\
-    (at your option) any later version.\n\
-\n\
-    This program is distributed in the hope that it will be useful,\n\
-    but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
-    GNU General Public License for more details.\n\
-\n\
-    You should have received a copy of the GNU General Public License\n\
-    along with this program; if not, see <http://www.gnu.org/licenses/>.\n\
-\n\
-    --\n\
-\n\
-    This file was generated by the program %s */\n\
-", filter_filename(file->program));
-    break;
-  default:
-    ASSERT(0);
-    break;
-  }
-  return nr;
-}
-
-
-int
-lf_putbin(lf *file, int decimal, int width)
-{
-  int nr = 0;
-  int bit;
-  ASSERT(width > 0);
-  for (bit = 1 << (width-1); bit != 0; bit >>= 1) {
-    if (decimal & bit)
-      nr += lf_putchr(file, '1');
-    else
-      nr += lf_putchr(file, '0');
-  }
-  return nr;
-}
-
-int
-lf_print__this_file_is_empty(lf *file)
-{
-  int nr = 0;
-  switch (file->type) {
-  case lf_is_c:
-  case lf_is_h:
-    nr += lf_printf(file,
-		    "/* This generated file (%s) is intentionally left blank */\n",
-		    file->name);
-    break;
-  default:
-    ASSERT(0);
-  }
-  return nr;
-}
-
-int
-lf_print__ucase_filename(lf *file)
-{
-  int nr = 0;
-  const char *chp = file->name;
-  while (*chp != '\0') {
-    char ch = *chp;
-    if (islower(ch)) {
-      nr += lf_putchr(file, toupper(ch));
-    }
-    else if (ch == '.')
-      nr += lf_putchr(file, '_');
-    else
-      nr += lf_putchr(file, ch);
-    chp++;
-  }
-  return nr;
-}
-
-int
-lf_print__file_start(lf *file)
-{
-  int nr = 0;
-  switch (file->type) {
-  case lf_is_h:
-  case lf_is_c:
-    nr += lf_print__gnu_copyleft(file);
-    nr += lf_printf(file, "\n");
-    nr += lf_printf(file, "#ifndef _");
-    nr += lf_print__ucase_filename(file);
-    nr += lf_printf(file, "_\n");
-    nr += lf_printf(file, "#define _");
-    nr += lf_print__ucase_filename(file);
-    nr += lf_printf(file, "_\n");
-    nr += lf_printf(file, "\n");
-    break;
-  default:
-    ASSERT(0);
-  }
-  return nr;
-}
-
-
-int
-lf_print__file_finish(lf *file)
-{
-  int nr = 0;
-  switch (file->type) {
-  case lf_is_h:
-  case lf_is_c:
-    nr += lf_printf(file, "\n");
-    nr += lf_printf(file, "#endif /* _");
-    nr += lf_print__ucase_filename(file);
-    nr += lf_printf(file, "_*/\n");
-    break;
-  default:
-    ASSERT(0);
-  }
-  return nr;
-}
-
-
-int
-lf_print_function_type(lf *file,
-		       const char *type,
-		       const char *prefix,
-		       const char *trailing_space)
-{
-  int nr = 0;
-  nr += lf_printf(file, "%s\\\n(%s)", prefix, type);
-  if (trailing_space != NULL)
-    nr += lf_printf(file, "%s", trailing_space);
-#if 0
-  const char *type_pointer = strrchr(type, '*');
-  int type_pointer_offset = (type_pointer != NULL
-			     ? type_pointer - type
-			     : 0);
-  if (type_pointer == NULL) {
-    lf_printf(file, "%s %s", type, prefix);
-  }
-  else {
-    char *munged_type = (char*)zalloc(strlen(type)
-				      + strlen(prefix)
-				      + strlen(" * ")
-				      + 1);
-    strcpy(munged_type, type);
-    munged_type[type_pointer_offset] = '\0';
-    if (type_pointer_offset > 0 && type[type_pointer_offset-1] != ' ')
-      strcat(munged_type, " ");
-    strcat(munged_type, prefix);
-    strcat(munged_type, " ");
-    strcat(munged_type, type + type_pointer_offset);
-    lf_printf(file, "%s", munged_type);
-    free(munged_type);
-  }
-  if (trailing_space != NULL && type_pointer_offset < strlen(type) - 1)
-    lf_printf(file, trailing_space);
-#endif
-  return nr;
-}
-
diff --git a/sim/ppc/lf.h b/sim/ppc/lf.h
deleted file mode 100644
index f1c41a93c442..000000000000
--- a/sim/ppc/lf.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*  This file is part of the program psim.
-
-    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
- 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, see <http://www.gnu.org/licenses/>.
- 
-    */
-
-
-/* LF: Line Numbered Output Stream */
-
-#include "ansidecl.h"
-
-typedef struct _lf lf;
-
-typedef enum {
-  lf_is_h,
-  lf_is_c,
-  lf_is_text,
-} lf_file_type;
-
-
-typedef enum {
-  lf_include_references,
-  lf_omit_references,
-} lf_file_references;
-
-
-/* Open the file NAME for writing.  REAL_NAME is to be included in any
-   line number outputs.  The output of line number information can be
-   suppressed with LINE_NUMBERS */
-
-extern lf *lf_open
-(const char *name,
- const char *real_name,
- lf_file_references file_references,
- lf_file_type type,
- const char *program);
-
-extern void lf_close
-(lf *file);
-
-
-/* Basic output functions */
-
-extern int lf_putchr
-(lf *file,
- const char ch);
-
-extern int lf_putstr
-(lf *file,
- const char *string);
-
-extern int lf_putint
-(lf *file,
- int decimal);
-
-extern int lf_putbin
-(lf *file,
- int decimal,
- int width);
-
-extern int lf_printf
-(lf *file,
- const char *fmt,
- ...) ATTRIBUTE_PRINTF_2;
-
-
-/* Indentation control.
-
-   lf_indent_suppress suppresses indentation on the next line (current
-   line if that has not yet been started) */
-
-extern void lf_indent_suppress
-(lf *file);
-
-extern void lf_indent
-(lf *file,
- int delta);
-
-
-/* Print generic text: */
-
-
-extern int lf_print__gnu_copyleft
-(lf *file);
-
-extern int lf_print__file_start
-(lf *file);
-
-extern int lf_print__this_file_is_empty
-(lf *file);
-
-extern int lf_print__file_finish
-(lf *file);
-
-extern int lf_print__internal_reference
-(lf *file);
-
-extern int lf_print__external_reference
-(lf *file,
- int line_nr,
- const char *file_name);
-
-extern int lf_print__ucase_filename
-(lf *file);
-
-/* Tab prefix is suppressed */
-
-extern int lf_print__c_code
-(lf *file,
- const char *code);
-
-
-extern int lf_print_function_type
-(lf *file,
- const char *type,
- const char *prefix,
- const char *trailing_space);
diff --git a/sim/ppc/local.mk b/sim/ppc/local.mk
index f6da1c213385..d872014d1b56 100644
--- a/sim/ppc/local.mk
+++ b/sim/ppc/local.mk
@@ -100,7 +100,7 @@ MOSTLYCLEANFILES += %D%/defines.h %D%/stamp-defines
 EXTRA_LIBRARIES += %D%/libigen.a
 %C%_libigen_a_SOURCES = \
 	%D%/table.c \
-	%D%/lf.c \
+	%D%/lf-ppc.c \
 	%D%/dumpf.c \
 	%D%/ld-decode.c \
 	%D%/ld-cache.c \
@@ -114,6 +114,7 @@ EXTRA_LIBRARIES += %D%/libigen.a
 	%D%/gen-support.c
 %C%_libigen_a_LIBADD = \
 	igen/filter_host.o \
+	igen/lf.o \
 	igen/misc.o
 
 %C%_igen_SOURCES = %D%/igen.c
diff --git a/sim/ppc/table.c b/sim/ppc/table.c
index 5cac56eec9b9..94f04921deb7 100644
--- a/sim/ppc/table.c
+++ b/sim/ppc/table.c
@@ -341,7 +341,7 @@ extern void
 table_entry_print_cpp_line_nr(lf *file,
 			      table_entry *entry)
 {
-  lf_print__external_reference(file, entry->line_nr, entry->file_name);
+  lf_print__external_ref(file, entry->line_nr, entry->file_name);
 }
 
 
