diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp
index 0beda80..ee9cecd 100644
--- a/lib/CodeGen/ELFWriter.cpp
+++ b/lib/CodeGen/ELFWriter.cpp
@@ -37,7 +37,6 @@
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetMachine.h"
-#include "llvm/Target/TargetObjInfo.h"
 #include "llvm/Support/Mangler.h"
 #include "llvm/Support/Streams.h"
 using namespace llvm;
@@ -54,20 +53,8 @@
     ELFWriter::ELFSection *ES;  // Section to write to.
     std::vector<unsigned char> *OutBuffer;
     size_t FnStart;
-
-    /// Target machine description.
-    ///
-    TargetMachine &TM;
-
-    /// Target object writer info.
-    ///
-    const TargetObjInfo *TOI;
   public:
-    ELFCodeEmitter(ELFWriter &ew, TargetMachine &tm)
-      : EW(ew), OutBuffer(0), TM(tm) {
-      // Create the target object info object for this target.
-      TOI = TM.getTargetObjInfo();
-    }
+    ELFCodeEmitter(ELFWriter &ew) : EW(ew), OutBuffer(0) {}
 
     void startFunction(MachineFunction &F);
     bool finishFunction(MachineFunction &F);
@@ -126,7 +113,7 @@
 
   // Add padding zeros to the end of the buffer to make sure that the
   // function will start on the correct byte alignment within the section.
-  TOI->align(*OutBuffer, Align);
+  ELFWriter::align(*OutBuffer, Align);
 
   FnStart = OutBuffer->size();
 }
@@ -178,11 +165,8 @@
   isLittleEndian = TM.getTargetData()->isLittleEndian();
 
   // Create the machine code emitter object for this target.
-  MCE = new ELFCodeEmitter(*this, TM);
+  MCE = new ELFCodeEmitter(*this);
   NumSections = 0;
-
-  // Create the target object info object for this target.
-  TOI = TM.getTargetObjInfo();
 }
 
 ELFWriter::~ELFWriter() {
@@ -197,36 +181,36 @@
   // Local alias to shortenify coming code.
   std::vector<unsigned char> &FH = FileHeader;
 
-  TOI->outbyte(FH, 0x7F);                     // EI_MAG0
-  TOI->outbyte(FH, 'E');                      // EI_MAG1
-  TOI->outbyte(FH, 'L');                      // EI_MAG2
-  TOI->outbyte(FH, 'F');                      // EI_MAG3
-  TOI->outbyte(FH, is64Bit ? 2 : 1);          // EI_CLASS
-  TOI->outbyte(FH, isLittleEndian ? 1 : 2);   // EI_DATA
-  TOI->outbyte(FH, 1);                        // EI_VERSION
-  FH.resize(16);                              // EI_PAD up to 16 bytes.
+  outbyte(FH, 0x7F);                     // EI_MAG0
+  outbyte(FH, 'E');                      // EI_MAG1
+  outbyte(FH, 'L');                      // EI_MAG2
+  outbyte(FH, 'F');                      // EI_MAG3
+  outbyte(FH, is64Bit ? 2 : 1);          // EI_CLASS
+  outbyte(FH, isLittleEndian ? 1 : 2);   // EI_DATA
+  outbyte(FH, 1);                        // EI_VERSION
+  FH.resize(16);                         // EI_PAD up to 16 bytes.
 
   // This should change for shared objects.
-  TOI->outhalf(FH, 1);               // e_type = ET_REL
-  TOI->outhalf(FH, e_machine);       // e_machine = whatever the target wants
-  TOI->outword(FH, 1);               // e_version = 1
-  TOI->outaddr(FH, 0);               // e_entry = 0 -> no entry point in .o file
-  TOI->outaddr(FH, 0);               // e_phoff = 0 -> no program header for .o
+  outhalf(FH, 1);                 // e_type = ET_REL
+  outhalf(FH, e_machine);         // e_machine = whatever the target wants
+  outword(FH, 1);                 // e_version = 1
+  outaddr(FH, 0);                 // e_entry = 0 -> no entry point in .o file
+  outaddr(FH, 0);                 // e_phoff = 0 -> no program header for .o
 
   ELFHeader_e_shoff_Offset = FH.size();
-  TOI->outaddr(FH, 0);                 // e_shoff
-  TOI->outword(FH, e_flags);           // e_flags = whatever the target wants
+  outaddr(FH, 0);                 // e_shoff
+  outword(FH, e_flags);           // e_flags = whatever the target wants
 
-  TOI->outhalf(FH, is64Bit ? 64 : 52); // e_ehsize = ELF header size
-  TOI->outhalf(FH, 0);                 // e_phentsize = prog header entry size
-  TOI->outhalf(FH, 0);                 // e_phnum     = # prog header entries=0
-  TOI->outhalf(FH, is64Bit ? 64 : 40); // e_shentsize = sect hdr entry size
+  outhalf(FH, is64Bit ? 64 : 52); // e_ehsize = ELF header size
+  outhalf(FH, 0);                 // e_phentsize = prog header entry size
+  outhalf(FH, 0);                 // e_phnum     = # prog header entries = 0
+  outhalf(FH, is64Bit ? 64 : 40); // e_shentsize = sect hdr entry size
 
 
   ELFHeader_e_shnum_Offset = FH.size();
-  TOI->outhalf(FH, 0);                 // e_shnum     = # of section header ents
+  outhalf(FH, 0);                 // e_shnum     = # of section header ents
   ELFHeader_e_shstrndx_Offset = FH.size();
-  TOI->outhalf(FH, 0);                 // e_shstrndx  = Section # of '.shstrtab'
+  outhalf(FH, 0);                 // e_shstrndx  = Section # of '.shstrtab'
 
   // Add the null section, which is required to be first in the file.
   getSection("", 0, 0);
@@ -368,7 +352,7 @@
   DataBuffer &StrTabBuf = StrTab.SectionData;
 
   // Set the zero'th symbol to a null byte, as required.
-  TOI->outbyte(StrTabBuf, 0);
+  outbyte(StrTabBuf, 0);
   SymbolTable[0].NameIdx = 0;
   unsigned Index = 1;
   for (unsigned i = 1, e = SymbolTable.size(); i != e; ++i) {
@@ -405,22 +389,22 @@
   if (!is64Bit) {   // 32-bit and 64-bit formats are shuffled a bit.
     for (unsigned i = 0, e = SymbolTable.size(); i != e; ++i) {
       ELFSym &Sym = SymbolTable[i];
-      TOI->outword(SymTabBuf, Sym.NameIdx);
-      TOI->outaddr32(SymTabBuf, Sym.Value);
-      TOI->outword(SymTabBuf, Sym.Size);
-      TOI->outbyte(SymTabBuf, Sym.Info);
-      TOI->outbyte(SymTabBuf, Sym.Other);
-      TOI->outhalf(SymTabBuf, Sym.SectionIdx);
+      outword(SymTabBuf, Sym.NameIdx);
+      outaddr32(SymTabBuf, Sym.Value);
+      outword(SymTabBuf, Sym.Size);
+      outbyte(SymTabBuf, Sym.Info);
+      outbyte(SymTabBuf, Sym.Other);
+      outhalf(SymTabBuf, Sym.SectionIdx);
     }
   } else {
     for (unsigned i = 0, e = SymbolTable.size(); i != e; ++i) {
       ELFSym &Sym = SymbolTable[i];
-      TOI->outword(SymTabBuf, Sym.NameIdx);
-      TOI->outbyte(SymTabBuf, Sym.Info);
-      TOI->outbyte(SymTabBuf, Sym.Other);
-      TOI->outhalf(SymTabBuf, Sym.SectionIdx);
-      TOI->outaddr64(SymTabBuf, Sym.Value);
-      TOI->outxword(SymTabBuf, Sym.Size);
+      outword(SymTabBuf, Sym.NameIdx);
+      outbyte(SymTabBuf, Sym.Info);
+      outbyte(SymTabBuf, Sym.Other);
+      outhalf(SymTabBuf, Sym.SectionIdx);
+      outaddr64(SymTabBuf, Sym.Value);
+      outxword(SymTabBuf, Sym.Size);
     }
   }
 
@@ -436,7 +420,7 @@
 
   // Now that we know which section number is the .shstrtab section, update the
   // e_shstrndx entry in the ELF header.
-  TOI->fixhalf(FileHeader, SHStrTab.SectionIdx, ELFHeader_e_shstrndx_Offset);
+  fixhalf(FileHeader, SHStrTab.SectionIdx, ELFHeader_e_shstrndx_Offset);
 
   // Set the NameIdx of each section in the string table and emit the bytes for
   // the string table.
@@ -487,11 +471,11 @@
 
   // Now that we know where all of the sections will be emitted, set the e_shnum
   // entry in the ELF header.
-  TOI->fixhalf(FileHeader, NumSections, ELFHeader_e_shnum_Offset);
+  fixhalf(FileHeader, NumSections, ELFHeader_e_shnum_Offset);
 
   // Now that we know the offset in the file of the section table, update the
   // e_shoff address in the ELF header.
-  TOI->fixaddr(FileHeader, FileOff, ELFHeader_e_shoff_Offset);
+  fixaddr(FileHeader, FileOff, ELFHeader_e_shoff_Offset);
 
   // Now that we know all of the data in the file header, emit it and all of the
   // sections!
@@ -513,16 +497,16 @@
     O.write((char*)&S.SectionData[0], S.SectionData.size());
     FileOff += S.SectionData.size();
 
-    TOI->outword(Table, S.NameIdx); // sh_name - Symbol table name idx
-    TOI->outword(Table, S.Type);    // sh_type - Section contents & semantics
-    TOI->outword(Table, S.Flags);   // sh_flags - Section flags
-    TOI->outaddr(Table, S.Addr);    // sh_addr - The mem addr this section is in
-    TOI->outaddr(Table, S.Offset);  // sh_offset - Offset from the file start
-    TOI->outword(Table, S.Size);    // sh_size - The section size
-    TOI->outword(Table, S.Link);    // sh_link - Section header table index link
-    TOI->outword(Table, S.Info);    // sh_info - Auxillary information
-    TOI->outword(Table, S.Align);   // sh_addralign - Alignment of section
-    TOI->outword(Table, S.EntSize); // sh_entsize - Size of entries in the sect
+    outword(Table, S.NameIdx);  // sh_name - Symbol table name idx
+    outword(Table, S.Type);     // sh_type - Section contents & semantics
+    outword(Table, S.Flags);    // sh_flags - Section flags.
+    outaddr(Table, S.Addr);     // sh_addr - The mem addr this section is in.
+    outaddr(Table, S.Offset);   // sh_offset - Offset from the file start.
+    outword(Table, S.Size);     // sh_size - The section size.
+    outword(Table, S.Link);     // sh_link - Section header table index link.
+    outword(Table, S.Info);     // sh_info - Auxillary information.
+    outword(Table, S.Align);    // sh_addralign - Alignment of section.
+    outword(Table, S.EntSize);  // sh_entsize - Size of entries in the section.
 
     SectionList.pop_front();
   }
diff --git a/lib/CodeGen/MachOWriter.cpp b/lib/CodeGen/MachOWriter.cpp
index 0a8825a..49c7457 100644
--- a/lib/CodeGen/MachOWriter.cpp
+++ b/lib/CodeGen/MachOWriter.cpp
@@ -32,11 +32,11 @@
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
 #include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Target/TargetJITInfo.h"
-#include "llvm/Target/TargetObjInfo.h"
 #include "llvm/Support/Mangler.h"
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/Streams.h"
 #include <algorithm>
+
 using namespace llvm;
 
 //===----------------------------------------------------------------------===//
@@ -49,14 +49,6 @@
   class MachOCodeEmitter : public MachineCodeEmitter {
     MachOWriter &MOW;
 
-    /// Target machine description.
-    ///
-    TargetMachine &TM;
-
-    /// Target object writer info.
-    ///
-    const TargetObjInfo *TOI;
-
     /// Relocations - These are the relocations that the function needs, as
     /// emitted.
     std::vector<MachineRelocation> Relocations;
@@ -79,10 +71,7 @@
     std::vector<intptr_t> MBBLocations;
     
   public:
-    MachOCodeEmitter(MachOWriter &mow, TargetMachine &tm) : MOW(mow), TM(tm) {
-      // Create the target object info object for this target.
-      TOI = TM.getTargetObjInfo();
-    }
+    MachOCodeEmitter(MachOWriter &mow) : MOW(mow) {}
 
     virtual void startFunction(MachineFunction &F);
     virtual bool finishFunction(MachineFunction &F);
@@ -174,7 +163,7 @@
   
   // Get a symbol for the function to add to the symbol table
   const GlobalValue *FuncV = F.getFunction();
-  MachOSym FnSym(FuncV, MOW.Mang->getValueName(FuncV), MOS->Index, TM);
+  MachOSym FnSym(FuncV, MOW.Mang->getValueName(FuncV), MOS->Index, MOW.TM);
 
   // Emit constant pool to appropriate section(s)
   emitConstantPool(F.getConstantPool());
@@ -222,7 +211,7 @@
   if (CP.empty()) return;
 
   // FIXME: handle PIC codegen
-  bool isPIC = TM.getRelocationModel() == Reloc::PIC_;
+  bool isPIC = MOW.TM.getRelocationModel() == Reloc::PIC_;
   assert(!isPIC && "PIC codegen not yet handled for mach-o jump tables!");
 
   // Although there is no strict necessity that I am aware of, we will do what
@@ -234,7 +223,7 @@
   // "giant object for PIC" optimization.
   for (unsigned i = 0, e = CP.size(); i != e; ++i) {
     const Type *Ty = CP[i].getType();
-    unsigned Size = TM.getTargetData()->getTypeSize(Ty);
+    unsigned Size = MOW.TM.getTargetData()->getTypeSize(Ty);
 
     MachOWriter::MachOSection *Sec = MOW.getConstSection(Ty);
     CPLocations.push_back(Sec->SectionData.size());
@@ -247,10 +236,10 @@
     // FIXME: need alignment?
     // FIXME: share between here and AddSymbolToSection?
     for (unsigned j = 0; j < Size; ++j)
-      TOI->outbyte(Sec->SectionData, 0);
+      MOW.outbyte(Sec->SectionData, 0);
 
     MOW.InitMem(CP[i].Val.ConstVal, &Sec->SectionData[0], CPLocations[i],
-                TM.getTargetData(), Sec->Relocations);
+                MOW.TM.getTargetData(), Sec->Relocations);
   }
 }
 
@@ -261,7 +250,7 @@
   if (JT.empty()) return;
 
   // FIXME: handle PIC codegen
-  bool isPIC = TM.getRelocationModel() == Reloc::PIC_;
+  bool isPIC = MOW.TM.getRelocationModel() == Reloc::PIC_;
   assert(!isPIC && "PIC codegen not yet handled for mach-o jump tables!");
 
   MachOWriter::MachOSection *Sec = MOW.getJumpTableSection();
@@ -278,7 +267,7 @@
       MR.setResultPointer((void *)JTLocations[i]);
       MR.setConstantVal(TextSecIndex);
       Sec->Relocations.push_back(MR);
-      TOI->outaddr(Sec->SectionData, 0);
+      MOW.outaddr(Sec->SectionData, 0);
     }
   }
   // FIXME: remove when we have unified size + output buffer
@@ -294,10 +283,7 @@
   isLittleEndian = TM.getTargetData()->isLittleEndian();
 
   // Create the machine code emitter object for this target.
-  MCE = new MachOCodeEmitter(*this, tm);
-
-  // Create the target object info object for this target.
-  TOI = TM.getTargetObjInfo();
+  MCE = new MachOCodeEmitter(*this);
 }
 
 MachOWriter::~MachOWriter() {
@@ -326,7 +312,7 @@
     // FIXME: remove when we have unified size + output buffer
     unsigned AlignedSize = Sec->size - OrigSize;
     for (unsigned i = 0; i < AlignedSize; ++i)
-      TOI->outbyte(Sec->SectionData, 0);
+      outbyte(Sec->SectionData, 0);
   }
   // Record the offset of the symbol, and then allocate space for it.
   // FIXME: remove when we have unified size + output buffer
@@ -343,7 +329,7 @@
   
   // Allocate space in the section for the global.
   for (unsigned i = 0; i < Size; ++i)
-    TOI->outbyte(Sec->SectionData, 0);
+    outbyte(Sec->SectionData, 0);
 }
 
 void MachOWriter::EmitGlobal(GlobalVariable *GV) {
@@ -456,15 +442,15 @@
   // Step #3: write the header to the file
   // Local alias to shortenify coming code.
   DataBuffer &FH = Header.HeaderData;
-  TOI->outword(FH, Header.magic);
-  TOI->outword(FH, Header.cputype);
-  TOI->outword(FH, Header.cpusubtype);
-  TOI->outword(FH, Header.filetype);
-  TOI->outword(FH, Header.ncmds);
-  TOI->outword(FH, Header.sizeofcmds);
-  TOI->outword(FH, Header.flags);
+  outword(FH, Header.magic);
+  outword(FH, Header.cputype);
+  outword(FH, Header.cpusubtype);
+  outword(FH, Header.filetype);
+  outword(FH, Header.ncmds);
+  outword(FH, Header.sizeofcmds);
+  outword(FH, Header.flags);
   if (is64Bit)
-    TOI->outword(FH, Header.reserved);
+    outword(FH, Header.reserved);
   
   // Step #4: Finish filling in the segment load command and write it out
   for (std::vector<MachOSection*>::iterator I = SectionList.begin(),
@@ -474,17 +460,17 @@
   SEG.vmsize = SEG.filesize;
   SEG.fileoff = Header.cmdSize(is64Bit) + Header.sizeofcmds;
   
-  TOI->outword(FH, SEG.cmd);
-  TOI->outword(FH, SEG.cmdsize);
-  TOI->outstring(FH, SEG.segname, 16);
-  TOI->outaddr(FH, SEG.vmaddr);
-  TOI->outaddr(FH, SEG.vmsize);
-  TOI->outaddr(FH, SEG.fileoff);
-  TOI->outaddr(FH, SEG.filesize);
-  TOI->outword(FH, SEG.maxprot);
-  TOI->outword(FH, SEG.initprot);
-  TOI->outword(FH, SEG.nsects);
-  TOI->outword(FH, SEG.flags);
+  outword(FH, SEG.cmd);
+  outword(FH, SEG.cmdsize);
+  outstring(FH, SEG.segname, 16);
+  outaddr(FH, SEG.vmaddr);
+  outaddr(FH, SEG.vmsize);
+  outaddr(FH, SEG.fileoff);
+  outaddr(FH, SEG.filesize);
+  outword(FH, SEG.maxprot);
+  outword(FH, SEG.initprot);
+  outword(FH, SEG.nsects);
+  outword(FH, SEG.flags);
   
   // Step #5: Finish filling in the fields of the MachOSections 
   uint64_t currentAddr = 0;
@@ -511,19 +497,19 @@
     currentAddr += MOS->nreloc * 8;
     
     // write the finalized section command to the output buffer
-    TOI->outstring(FH, MOS->sectname, 16);
-    TOI->outstring(FH, MOS->segname, 16);
-    TOI->outaddr(FH, MOS->addr);
-    TOI->outaddr(FH, MOS->size);
-    TOI->outword(FH, MOS->offset);
-    TOI->outword(FH, MOS->align);
-    TOI->outword(FH, MOS->reloff);
-    TOI->outword(FH, MOS->nreloc);
-    TOI->outword(FH, MOS->flags);
-    TOI->outword(FH, MOS->reserved1);
-    TOI->outword(FH, MOS->reserved2);
+    outstring(FH, MOS->sectname, 16);
+    outstring(FH, MOS->segname, 16);
+    outaddr(FH, MOS->addr);
+    outaddr(FH, MOS->size);
+    outword(FH, MOS->offset);
+    outword(FH, MOS->align);
+    outword(FH, MOS->reloff);
+    outword(FH, MOS->nreloc);
+    outword(FH, MOS->flags);
+    outword(FH, MOS->reserved1);
+    outword(FH, MOS->reserved2);
     if (is64Bit)
-      TOI->outword(FH, MOS->reserved3);
+      outword(FH, MOS->reserved3);
   }
   
   // Step #7: Emit the symbol table to temporary buffers, so that we know the
@@ -535,36 +521,36 @@
   SymTab.nsyms   = SymbolTable.size();
   SymTab.stroff  = SymTab.symoff + SymT.size();
   SymTab.strsize = StrT.size();
-  TOI->outword(FH, SymTab.cmd);
-  TOI->outword(FH, SymTab.cmdsize);
-  TOI->outword(FH, SymTab.symoff);
-  TOI->outword(FH, SymTab.nsyms);
-  TOI->outword(FH, SymTab.stroff);
-  TOI->outword(FH, SymTab.strsize);
+  outword(FH, SymTab.cmd);
+  outword(FH, SymTab.cmdsize);
+  outword(FH, SymTab.symoff);
+  outword(FH, SymTab.nsyms);
+  outword(FH, SymTab.stroff);
+  outword(FH, SymTab.strsize);
 
   // FIXME: set DySymTab fields appropriately
   // We should probably just update these in BufferSymbolAndStringTable since
   // thats where we're partitioning up the different kinds of symbols.
-  TOI->outword(FH, DySymTab.cmd);
-  TOI->outword(FH, DySymTab.cmdsize);
-  TOI->outword(FH, DySymTab.ilocalsym);
-  TOI->outword(FH, DySymTab.nlocalsym);
-  TOI->outword(FH, DySymTab.iextdefsym);
-  TOI->outword(FH, DySymTab.nextdefsym);
-  TOI->outword(FH, DySymTab.iundefsym);
-  TOI->outword(FH, DySymTab.nundefsym);
-  TOI->outword(FH, DySymTab.tocoff);
-  TOI->outword(FH, DySymTab.ntoc);
-  TOI->outword(FH, DySymTab.modtaboff);
-  TOI->outword(FH, DySymTab.nmodtab);
-  TOI->outword(FH, DySymTab.extrefsymoff);
-  TOI->outword(FH, DySymTab.nextrefsyms);
-  TOI->outword(FH, DySymTab.indirectsymoff);
-  TOI->outword(FH, DySymTab.nindirectsyms);
-  TOI->outword(FH, DySymTab.extreloff);
-  TOI->outword(FH, DySymTab.nextrel);
-  TOI->outword(FH, DySymTab.locreloff);
-  TOI->outword(FH, DySymTab.nlocrel);
+  outword(FH, DySymTab.cmd);
+  outword(FH, DySymTab.cmdsize);
+  outword(FH, DySymTab.ilocalsym);
+  outword(FH, DySymTab.nlocalsym);
+  outword(FH, DySymTab.iextdefsym);
+  outword(FH, DySymTab.nextdefsym);
+  outword(FH, DySymTab.iundefsym);
+  outword(FH, DySymTab.nundefsym);
+  outword(FH, DySymTab.tocoff);
+  outword(FH, DySymTab.ntoc);
+  outword(FH, DySymTab.modtaboff);
+  outword(FH, DySymTab.nmodtab);
+  outword(FH, DySymTab.extrefsymoff);
+  outword(FH, DySymTab.nextrefsyms);
+  outword(FH, DySymTab.indirectsymoff);
+  outword(FH, DySymTab.nindirectsyms);
+  outword(FH, DySymTab.extreloff);
+  outword(FH, DySymTab.nextrel);
+  outword(FH, DySymTab.locreloff);
+  outword(FH, DySymTab.nlocrel);
   
   O.write((char*)&FH[0], FH.size());
 }
@@ -641,7 +627,7 @@
   
   // Write out a leading zero byte when emitting string table, for n_strx == 0
   // which means an empty string.
-  TOI->outbyte(StrT, 0);
+  outbyte(StrT, 0);
 
   // The order of the string table is:
   // 1. strings for external symbols
@@ -654,7 +640,7 @@
       I->n_strx = 0;
     } else {
       I->n_strx = StrT.size();
-      TOI->outstring(StrT, I->GVName, I->GVName.length()+1);
+      outstring(StrT, I->GVName, I->GVName.length()+1);
     }
   }
 
@@ -668,11 +654,11 @@
       I->n_value += GVSection[GV]->addr;
          
     // Emit nlist to buffer
-    TOI->outword(SymT, I->n_strx);
-    TOI->outbyte(SymT, I->n_type);
-    TOI->outbyte(SymT, I->n_sect);
-    TOI->outhalf(SymT, I->n_desc);
-    TOI->outaddr(SymT, I->n_value);
+    outword(SymT, I->n_strx);
+    outbyte(SymT, I->n_type);
+    outbyte(SymT, I->n_sect);
+    outhalf(SymT, I->n_desc);
+    outaddr(SymT, I->n_value);
   }
 }
 
