diff --git a/libc/tools/gensyscalls.py b/libc/tools/gensyscalls.py
index 9b6dc81..b307486 100755
--- a/libc/tools/gensyscalls.py
+++ b/libc/tools/gensyscalls.py
@@ -8,7 +8,6 @@
 import commands
 import filecmp
 import glob
-import logging
 import os.path
 import re
 import shutil
@@ -478,8 +477,6 @@
 
         self.syscalls.append(t)
 
-        logging.debug(t)
-
     def parse_open_file(self, fp):
         for line in fp:
             self.lineno += 1
@@ -489,64 +486,47 @@
             self.parse_line(line)
 
     def parse_file(self, file_path):
-        logging.debug("parse_file: %s" % file_path)
         with open(file_path) as fp:
             self.parse_open_file(fp)
 
 
-class State:
-    def __init__(self):
-        self.syscalls = []
+def main(arch):
+    parser = SysCallsTxtParser()
+    parser.parse_file(os.path.join(bionic_libc, "SYSCALLS.TXT"))
 
+    for syscall in parser.syscalls:
+        syscall["__NR_name"] = make__NR_name(syscall["name"])
 
-    def process_file(self, input):
-        parser = SysCallsTxtParser()
-        parser.parse_file(input)
-        self.syscalls = parser.syscalls
-        parser = None
+        if syscall.has_key("arm"):
+            syscall["asm-arm"] = add_footer(32, arm_eabi_genstub(syscall), syscall)
 
-        for syscall in self.syscalls:
-            syscall["__NR_name"] = make__NR_name(syscall["name"])
+        if syscall.has_key("arm64"):
+            syscall["asm-arm64"] = add_footer(64, arm64_genstub(syscall), syscall)
 
-            if syscall.has_key("arm"):
-                syscall["asm-arm"] = add_footer(32, arm_eabi_genstub(syscall), syscall)
+        if syscall.has_key("x86"):
+            if syscall["socketcall_id"] >= 0:
+                syscall["asm-x86"] = add_footer(32, x86_genstub_socketcall(syscall), syscall)
+            else:
+                syscall["asm-x86"] = add_footer(32, x86_genstub(syscall), syscall)
+        elif syscall["socketcall_id"] >= 0:
+            E("socketcall_id for dispatch syscalls is only supported for x86 in '%s'" % t)
+            return
 
-            if syscall.has_key("arm64"):
-                syscall["asm-arm64"] = add_footer(64, arm64_genstub(syscall), syscall)
+        if syscall.has_key("mips"):
+            syscall["asm-mips"] = add_footer(32, mips_genstub(syscall), syscall)
 
-            if syscall.has_key("x86"):
-                if syscall["socketcall_id"] >= 0:
-                    syscall["asm-x86"] = add_footer(32, x86_genstub_socketcall(syscall), syscall)
-                else:
-                    syscall["asm-x86"] = add_footer(32, x86_genstub(syscall), syscall)
-            elif syscall["socketcall_id"] >= 0:
-                E("socketcall_id for dispatch syscalls is only supported for x86 in '%s'" % t)
-                return
+        if syscall.has_key("mips64"):
+            syscall["asm-mips64"] = add_footer(64, mips64_genstub(syscall), syscall)
 
-            if syscall.has_key("mips"):
-                syscall["asm-mips"] = add_footer(32, mips_genstub(syscall), syscall)
+        if syscall.has_key("x86_64"):
+            syscall["asm-x86_64"] = add_footer(64, x86_64_genstub(syscall), syscall)
 
-            if syscall.has_key("mips64"):
-                syscall["asm-mips64"] = add_footer(64, mips64_genstub(syscall), syscall)
+    print("/* Generated by gensyscalls.py. Do not edit. */\n")
+    print("#include <private/bionic_asm.h>\n")
+    for syscall in parser.syscalls:
+        if syscall.has_key("asm-%s" % arch):
+            print(syscall["asm-%s" % arch])
 
-            if syscall.has_key("x86_64"):
-                syscall["asm-x86_64"] = add_footer(64, x86_64_genstub(syscall), syscall)
-
-
-    def regenerate(self):
-        for arch in all_arches:
-            filename = '%s/arch-%s/syscalls.S' % (bionic_libc, arch)
-            fp = open(filename, 'w')
-            fp.write("/* Generated by gensyscalls.py. Do not edit. */\n")
-            fp.write("#include <private/bionic_asm.h>\n")
-            for syscall in self.syscalls:
-                if syscall.has_key("asm-%s" % arch):
-                    fp.write(syscall["asm-%s" % arch])
-            fp.close()
-
-logging.basicConfig(level=logging.INFO)
 
 if __name__ == "__main__":
-    state = State()
-    state.process_file(os.path.join(bionic_libc, "SYSCALLS.TXT"))
-    state.regenerate()
+    main(sys.argv[1])
