diff --git a/kernel/trunk/asmxygen.py b/kernel/trunk/asmxygen.py
index da21f33207..f3b6b53547 100644
--- a/kernel/trunk/asmxygen.py
+++ b/kernel/trunk/asmxygen.py
@@ -8,150 +8,150 @@ import difflib
# fasm keywords
keywords = [
- "align", "equ", "org", "while", "load", "store", "times", "repeat",
- "display", "err", "assert", "if", "aaa", "aad", "aam", "aas", "adc",
- "add", "addpd", "addps", "addsd", "addss", "addsubpd", "addsubps", "adox",
- "aesdeclast", "aesenc", "aesenclast", "aesimc", "aeskeygenassist", "and",
- "andnpd", "andnps", "andpd", "andps", "arpl", "bextr", "blendpd",
- "blendvpd", "blendvps", "blsi", "blsmsk", "blsr", "bndcl", "bndcn",
- "bndldx", "bndmk", "bndmov", "bndstx", "bound", "bsf", "bsr", "bswap",
- "btc", "btr", "bts", "bzhi", "call", "cbw", "cdq", "cdqe", "clac", "clc",
- "cldemote", "clflush", "clflushopt", "cli", "clts", "clwb", "cmc", "cmova",
- "cmovb", "cmovbe", "cmovc", "cmove", "cmovg", "cmovge", "cmovl", "cmovle",
- "cmovnae", "cmovnb", "cmovnbe", "cmovnc", "cmovne", "cmovng", "cmovnge",
- "cmovnle", "cmovno", "cmovnp", "cmovns", "cmovnz", "cmovo", "cmovp",
- "cmovpo", "cmovs", "cmovz", "cmp", "cmppd", "cmpps", "cmps", "cmpsb",
- "cmpsd", "cmpsq", "cmpss", "cmpsw", "cmpxchg", "cmpxchg16b", "cmpxchg8b",
- "comiss", "cpuid", "cqo", "crc32", "cvtdq2pd", "cvtdq2ps", "cvtpd2dq",
- "cvtpd2ps", "cvtpi2pd", "cvtpi2ps", "cvtps2dq", "cvtps2pd", "cvtps2pi",
- "cvtsd2ss", "cvtsi2sd", "cvtsi2ss", "cvtss2sd", "cvtss2si", "cvttpd2dq",
- "cvttps2dq", "cvttps2pi", "cvttsd2si", "cvttss2si", "cwd", "cwde", "daa",
- "dec", "div", "divpd", "divps", "divsd", "divss", "dppd", "dpps", "emms",
- "extractps", "f2xm1", "fabs", "fadd", "faddp", "fbld", "fbstp", "fchs",
- "fcmova", "fcmovae", "fcmovb", "fcmovbe", "fcmovc", "fcmove", "fcmovg",
- "fcmovl", "fcmovle", "fcmovna", "fcmovnae", "fcmovnb", "fcmovnbe",
- "fcmovne", "fcmovng", "fcmovnge", "fcmovnl", "fcmovnle", "fcmovno",
- "fcmovns", "fcmovnz", "fcmovo", "fcmovp", "fcmovpe", "fcmovpo", "fcmovs",
- "fcom", "fcomi", "fcomip", "fcomp", "fcompp", "fcos", "fdecstp", "fdiv",
- "fdivr", "fdivrp", "ffree", "fiadd", "ficom", "ficomp", "fidiv", "fidivr",
- "fimul", "fincstp", "finit", "fist", "fistp", "fisttp", "fisub", "fisubr",
- "fld1", "fldcw", "fldenv", "fldl2e", "fldl2t", "fldlg2", "fldln2", "fldpi",
- "fmul", "fmulp", "fnclex", "fninit", "fnop", "fnsave", "fnstcw", "fnstenv",
- "fpatan", "fprem", "fprem1", "fptan", "frndint", "frstor", "fsave",
- "fsin", "fsincos", "fsqrt", "fst", "fstcw", "fstenv", "fstp", "fstsw",
- "fsubp", "fsubr", "fsubrp", "ftst", "fucom", "fucomi", "fucomip", "fucomp",
- "fwait", "fxam", "fxch", "fxrstor", "fxsave", "fxtract", "fyl2x",
- "gf2p8affineinvqb", "gf2p8affineqb", "gf2p8mulb", "haddpd", "haddps",
- "hsubpd", "hsubps", "idiv", "imul", "in", "inc", "ins", "insb", "insd",
- "insw", "int", "int1", "int3", "into", "invd", "invlpg", "invpcid", "iret",
- "jmp", "ja", "jae", "jb", "jbe", "jc", "jcxz", "jecxz", "je", "jg", "jge",
- "jle", "jna", "jnae", "jnb", "jnbe", "jnc", "jne", "jng", "jnge", "jnl",
- "jno", "jnp", "jns", "jnz", "jo", "jp", "jpe", "jpo", "js", "jz", "kaddb",
- "kaddq", "kaddw", "kandb", "kandd", "kandnb", "kandnd", "kandnq", "kandnw",
- "kandw", "kmovb", "kmovd", "kmovq", "kmovw", "knotb", "knotd", "knotq",
- "korb", "kord", "korq", "kortestb", "kortestd", "kortestq", "kortestw",
- "kshiftlb", "kshiftld", "kshiftlq", "kshiftlw", "kshiftrb", "kshiftrd",
- "kshiftrw", "ktestb", "ktestd", "ktestq", "ktestw", "kunpckbw", "kunpckdq",
- "kxnorb", "kxnord", "kxnorq", "kxnorw", "kxorb", "kxord", "kxorq", "kxorw",
- "lar", "lddqu", "ldmxcsr", "lds", "lea", "leave", "les", "lfence", "lfs",
- "lgs", "lidt", "lldt", "lmsw", "lock", "lods", "lodsb", "lodsd", "lodsq",
- "loop", "loopa", "loopae", "loopb", "loopbe", "loopc", "loope", "loopg",
- "loopl", "loople", "loopna", "loopnae", "loopnb", "loopnbe", "loopnc",
- "loopng", "loopnge", "loopnl", "loopnle", "loopno", "loopnp", "loopns",
- "loopo", "loopp", "looppe", "looppo", "loops", "loopz", "lsl", "lss",
- "lzcnt", "maskmovdqu", "maskmovq", "maxpd", "maxps", "maxsd", "maxss",
- "minpd", "minps", "minsd", "minss", "monitor", "mov", "movapd", "movaps",
- "movd", "movddup", "movdir64b", "movdiri", "movdq2q", "movdqa", "movdqu",
- "movhpd", "movhps", "movlhps", "movlpd", "movlps", "movmskpd", "movmskps",
- "movntdqa", "movnti", "movntpd", "movntps", "movntq", "movq", "movq",
- "movs", "movsb", "movsd", "movsd", "movshdup", "movsldup", "movsq",
- "movsw", "movsx", "movsxd", "movupd", "movups", "movzx", "mpsadbw", "mul",
- "mulps", "mulsd", "mulss", "mulx", "mwait", "neg", "nop", "not", "or",
- "orps", "out", "outs", "outsb", "outsd", "outsw", "pabsb", "pabsd",
- "pabsw", "packssdw", "packsswb", "packusdw", "packuswb", "paddb", "paddd",
- "paddsb", "paddsw", "paddusb", "paddusw", "paddw", "palignr", "pand",
- "pause", "pavgb", "pavgw", "pblendvb", "pblendw", "pclmulqdq", "pcmpeqb",
- "pcmpeqq", "pcmpeqw", "pcmpestri", "pcmpestrm", "pcmpgtb", "pcmpgtd",
- "pcmpgtw", "pcmpistri", "pcmpistrm", "pdep", "pext", "pextrb", "pextrd",
- "pextrw", "phaddd", "phaddsw", "phaddw", "phminposuw", "phsubd", "phsubsw",
- "pinsrb", "pinsrd", "pinsrq", "pinsrw", "pmaddubsw", "pmaddwd", "pmaxsb",
- "pmaxsq", "pmaxsw", "pmaxub", "pmaxud", "pmaxuq", "pmaxuw", "pminsb",
- "pminsq", "pminsw", "pminub", "pminud", "pminuq", "pminuw", "pmovmskb",
- "pmovzx", "pmuldq", "pmulhrsw", "pmulhuw", "pmulhw", "pmulld", "pmullq",
- "pmuludq", "pop", "popa", "popad", "popcnt", "popf", "popfd", "popfq",
- "prefetchw", "prefetchh", "psadbw", "pshufb", "pshufd", "pshufhw",
- "pshufw", "psignb", "psignd", "psignw", "pslld", "pslldq", "psllq",
- "psrad", "psraq", "psraw", "psrld", "psrldq", "psrlq", "psrlw", "psubb",
- "psubq", "psubsb", "psubsw", "psubusb", "psubusw", "psubw", "ptest",
- "punpckhbw", "punpckhdq", "punpckhqdq", "punpckhwd", "punpcklbw",
- "punpcklqdq", "punpcklwd", "push", "pushw", "pushd", "pusha", "pushad",
- "pushfd", "pushfq", "pxor", "rcl", "rcpps", "rcpss", "rcr", "rdfsbase",
- "rdmsr", "rdpid", "rdpkru", "rdpmc", "rdrand", "rdseed", "rdtsc", "rdtscp",
- "repe", "repne", "repnz", "repz", "ret", "rol", "ror", "rorx", "roundpd",
- "roundsd", "roundss", "rsm", "rsqrtps", "rsqrtss", "sahf", "sal", "sar",
- "sbb", "scas", "scasb", "scasd", "scasw", "seta", "setae", "setb", "setbe",
- "sete", "setg", "setge", "setl", "setle", "setna", "setnae", "setnb",
- "setnc", "setne", "setng", "setnge", "setnl", "setnle", "setno", "setnp",
- "setnz", "seto", "setp", "setpe", "setpo", "sets", "setz", "sfence",
- "sha1msg1", "sha1msg2", "sha1nexte", "sha1rnds4", "sha256msg1",
- "sha256rnds2", "shl", "shld", "shlx", "shr", "shrd", "shrx", "shufpd",
- "sidt", "sldt", "smsw", "sqrtpd", "sqrtps", "sqrtsd", "sqrtss", "stac",
- "std", "sti", "stmxcsr", "stos", "stosb", "stosd", "stosq", "stosw", "str",
- "subpd", "subps", "subsd", "subss", "swapgs", "syscall", "sysenter",
- "sysret", "test", "tpause", "tzcnt", "ucomisd", "ucomiss", "ud",
- "umwait", "unpckhpd", "unpckhps", "unpcklpd", "unpcklps", "valignd",
- "vblendmpd", "vblendmps", "vbroadcast", "vcompresspd", "vcompressps",
- "vcvtpd2udq", "vcvtpd2uqq", "vcvtph2ps", "vcvtps2ph", "vcvtps2qq",
- "vcvtps2uqq", "vcvtqq2pd", "vcvtqq2ps", "vcvtsd2usi", "vcvtss2usi",
- "vcvttpd2udq", "vcvttpd2uqq", "vcvttps2qq", "vcvttps2udq", "vcvttps2uqq",
- "vcvttss2usi", "vcvtudq2pd", "vcvtudq2ps", "vcvtuqq2pd", "vcvtuqq2ps",
- "vcvtusi2ss", "vdbpsadbw", "verr", "verw", "vexpandpd", "vexpandps",
- "vextractf32x4", "vextractf32x8", "vextractf64x2", "vextractf64x4",
- "vextracti32x4", "vextracti32x8", "vextracti64x2", "vextracti64x4",
- "vfixupimmps", "vfixupimmsd", "vfixupimmss", "vfmadd132pd", "vfmadd132ps",
- "vfmadd132ss", "vfmadd213pd", "vfmadd213ps", "vfmadd213sd", "vfmadd213ss",
- "vfmadd231ps", "vfmadd231sd", "vfmadd231ss", "vfmaddsub132pd",
- "vfmaddsub213pd", "vfmaddsub213ps", "vfmaddsub231pd", "vfmaddsub231ps",
- "vfmsub132ps", "vfmsub132sd", "vfmsub132ss", "vfmsub213pd", "vfmsub213ps",
- "vfmsub213ss", "vfmsub231pd", "vfmsub231ps", "vfmsub231sd", "vfmsub231ss",
- "vfmsubadd132ps", "vfmsubadd213pd", "vfmsubadd213ps", "vfmsubadd231pd",
- "vfnmadd132pd", "vfnmadd132ps", "vfnmadd132sd", "vfnmadd132ss",
- "vfnmadd213ps", "vfnmadd213sd", "vfnmadd213ss", "vfnmadd231pd",
- "vfnmadd231sd", "vfnmadd231ss", "vfnmsub132pd", "vfnmsub132ps",
- "vfnmsub132ss", "vfnmsub213pd", "vfnmsub213ps", "vfnmsub213sd",
- "vfnmsub231pd", "vfnmsub231ps", "vfnmsub231sd", "vfnmsub231ss",
- "vfpclassps", "vfpclasssd", "vfpclassss", "vgatherdpd", "vgatherdpd",
- "vgatherdps", "vgatherqpd", "vgatherqpd", "vgatherqps", "vgatherqps",
- "vgetexpps", "vgetexpsd", "vgetexpss", "vgetmantpd", "vgetmantps",
- "vgetmantss", "vinsertf128", "vinsertf32x4", "vinsertf32x8",
- "vinsertf64x4", "vinserti128", "vinserti32x4", "vinserti32x8",
- "vinserti64x4", "vmaskmov", "vmovdqa32", "vmovdqa64", "vmovdqu16",
- "vmovdqu64", "vmovdqu8", "vpblendd", "vpblendmb", "vpblendmd", "vpblendmq",
- "vpbroadcast", "vpbroadcastb", "vpbroadcastd", "vpbroadcastm",
- "vpbroadcastw", "vpcmpb", "vpcmpd", "vpcmpq", "vpcmpub", "vpcmpud",
- "vpcmpuw", "vpcmpw", "vpcompressd", "vpcompressq", "vpconflictd",
- "vperm2f128", "vperm2i128", "vpermb", "vpermd", "vpermi2b", "vpermi2d",
- "vpermi2ps", "vpermi2q", "vpermi2w", "vpermilpd", "vpermilps", "vpermpd",
- "vpermq", "vpermt2b", "vpermt2d", "vpermt2pd", "vpermt2ps", "vpermt2q",
- "vpermw", "vpexpandd", "vpexpandq", "vpgatherdd", "vpgatherdd",
- "vpgatherdq", "vpgatherqd", "vpgatherqd", "vpgatherqq", "vpgatherqq",
- "vplzcntq", "vpmadd52huq", "vpmadd52luq", "vpmaskmov", "vpmovb2m",
- "vpmovdb", "vpmovdw", "vpmovm2b", "vpmovm2d", "vpmovm2q", "vpmovm2w",
- "vpmovqb", "vpmovqd", "vpmovqw", "vpmovsdb", "vpmovsdw", "vpmovsqb",
- "vpmovsqw", "vpmovswb", "vpmovusdb", "vpmovusdw", "vpmovusqb", "vpmovusqd",
- "vpmovuswb", "vpmovw2m", "vpmovwb", "vpmultishiftqb", "vprold", "vprolq",
- "vprolvq", "vprord", "vprorq", "vprorvd", "vprorvq", "vpscatterdd",
- "vpscatterqd", "vpscatterqq", "vpsllvd", "vpsllvq", "vpsllvw", "vpsravd",
- "vpsravw", "vpsrlvd", "vpsrlvq", "vpsrlvw", "vpternlogd", "vpternlogq",
- "vptestmd", "vptestmq", "vptestmw", "vptestnmb", "vptestnmd", "vptestnmq",
- "vrangepd", "vrangeps", "vrangesd", "vrangess", "vrcp14pd", "vrcp14ps",
- "vrcp14ss", "vreducepd", "vreduceps", "vreducesd", "vreducess",
- "vrndscaleps", "vrndscalesd", "vrndscaless", "vrsqrt14pd", "vrsqrt14ps",
- "vrsqrt14ss", "vscalefpd", "vscalefps", "vscalefsd", "vscalefss",
- "vscatterdps", "vscatterqpd", "vscatterqps", "vshuff32x4", "vshuff64x2",
- "vshufi64x2", "vtestpd", "vtestps", "vzeroall", "vzeroupper", "wait",
- "wrfsbase", "wrgsbase", "wrmsr", "wrpkru", "xabort", "xacquire", "xadd",
- "xchg", "xend", "xgetbv", "xlat", "xlatb", "xor", "xorpd", "xorps",
+ "align", "equ", "org", "while", "load", "store", "times", "repeat",
+ "display", "err", "assert", "if", "aaa", "aad", "aam", "aas", "adc",
+ "add", "addpd", "addps", "addsd", "addss", "addsubpd", "addsubps", "adox",
+ "aesdeclast", "aesenc", "aesenclast", "aesimc", "aeskeygenassist", "and",
+ "andnpd", "andnps", "andpd", "andps", "arpl", "bextr", "blendpd",
+ "blendvpd", "blendvps", "blsi", "blsmsk", "blsr", "bndcl", "bndcn",
+ "bndldx", "bndmk", "bndmov", "bndstx", "bound", "bsf", "bsr", "bswap",
+ "btc", "btr", "bts", "bzhi", "call", "cbw", "cdq", "cdqe", "clac", "clc",
+ "cldemote", "clflush", "clflushopt", "cli", "clts", "clwb", "cmc", "cmova",
+ "cmovb", "cmovbe", "cmovc", "cmove", "cmovg", "cmovge", "cmovl", "cmovle",
+ "cmovnae", "cmovnb", "cmovnbe", "cmovnc", "cmovne", "cmovng", "cmovnge",
+ "cmovnle", "cmovno", "cmovnp", "cmovns", "cmovnz", "cmovo", "cmovp",
+ "cmovpo", "cmovs", "cmovz", "cmp", "cmppd", "cmpps", "cmps", "cmpsb",
+ "cmpsd", "cmpsq", "cmpss", "cmpsw", "cmpxchg", "cmpxchg16b", "cmpxchg8b",
+ "comiss", "cpuid", "cqo", "crc32", "cvtdq2pd", "cvtdq2ps", "cvtpd2dq",
+ "cvtpd2ps", "cvtpi2pd", "cvtpi2ps", "cvtps2dq", "cvtps2pd", "cvtps2pi",
+ "cvtsd2ss", "cvtsi2sd", "cvtsi2ss", "cvtss2sd", "cvtss2si", "cvttpd2dq",
+ "cvttps2dq", "cvttps2pi", "cvttsd2si", "cvttss2si", "cwd", "cwde", "daa",
+ "dec", "div", "divpd", "divps", "divsd", "divss", "dppd", "dpps", "emms",
+ "extractps", "f2xm1", "fabs", "fadd", "faddp", "fbld", "fbstp", "fchs",
+ "fcmova", "fcmovae", "fcmovb", "fcmovbe", "fcmovc", "fcmove", "fcmovg",
+ "fcmovl", "fcmovle", "fcmovna", "fcmovnae", "fcmovnb", "fcmovnbe",
+ "fcmovne", "fcmovng", "fcmovnge", "fcmovnl", "fcmovnle", "fcmovno",
+ "fcmovns", "fcmovnz", "fcmovo", "fcmovp", "fcmovpe", "fcmovpo", "fcmovs",
+ "fcom", "fcomi", "fcomip", "fcomp", "fcompp", "fcos", "fdecstp", "fdiv",
+ "fdivr", "fdivrp", "ffree", "fiadd", "ficom", "ficomp", "fidiv", "fidivr",
+ "fimul", "fincstp", "finit", "fist", "fistp", "fisttp", "fisub", "fisubr",
+ "fld1", "fldcw", "fldenv", "fldl2e", "fldl2t", "fldlg2", "fldln2", "fldpi",
+ "fmul", "fmulp", "fnclex", "fninit", "fnop", "fnsave", "fnstcw", "fnstenv",
+ "fpatan", "fprem", "fprem1", "fptan", "frndint", "frstor", "fsave",
+ "fsin", "fsincos", "fsqrt", "fst", "fstcw", "fstenv", "fstp", "fstsw",
+ "fsubp", "fsubr", "fsubrp", "ftst", "fucom", "fucomi", "fucomip", "fucomp",
+ "fwait", "fxam", "fxch", "fxrstor", "fxsave", "fxtract", "fyl2x",
+ "gf2p8affineinvqb", "gf2p8affineqb", "gf2p8mulb", "haddpd", "haddps",
+ "hsubpd", "hsubps", "idiv", "imul", "in", "inc", "ins", "insb", "insd",
+ "insw", "int", "int1", "int3", "into", "invd", "invlpg", "invpcid", "iret",
+ "jmp", "ja", "jae", "jb", "jbe", "jc", "jcxz", "jecxz", "je", "jg", "jge",
+ "jle", "jna", "jnae", "jnb", "jnbe", "jnc", "jne", "jng", "jnge", "jnl",
+ "jno", "jnp", "jns", "jnz", "jo", "jp", "jpe", "jpo", "js", "jz", "kaddb",
+ "kaddq", "kaddw", "kandb", "kandd", "kandnb", "kandnd", "kandnq", "kandnw",
+ "kandw", "kmovb", "kmovd", "kmovq", "kmovw", "knotb", "knotd", "knotq",
+ "korb", "kord", "korq", "kortestb", "kortestd", "kortestq", "kortestw",
+ "kshiftlb", "kshiftld", "kshiftlq", "kshiftlw", "kshiftrb", "kshiftrd",
+ "kshiftrw", "ktestb", "ktestd", "ktestq", "ktestw", "kunpckbw", "kunpckdq",
+ "kxnorb", "kxnord", "kxnorq", "kxnorw", "kxorb", "kxord", "kxorq", "kxorw",
+ "lar", "lddqu", "ldmxcsr", "lds", "lea", "leave", "les", "lfence", "lfs",
+ "lgs", "lidt", "lldt", "lmsw", "lock", "lods", "lodsb", "lodsd", "lodsq",
+ "loop", "loopa", "loopae", "loopb", "loopbe", "loopc", "loope", "loopg",
+ "loopl", "loople", "loopna", "loopnae", "loopnb", "loopnbe", "loopnc",
+ "loopng", "loopnge", "loopnl", "loopnle", "loopno", "loopnp", "loopns",
+ "loopo", "loopp", "looppe", "looppo", "loops", "loopz", "lsl", "lss",
+ "lzcnt", "maskmovdqu", "maskmovq", "maxpd", "maxps", "maxsd", "maxss",
+ "minpd", "minps", "minsd", "minss", "monitor", "mov", "movapd", "movaps",
+ "movd", "movddup", "movdir64b", "movdiri", "movdq2q", "movdqa", "movdqu",
+ "movhpd", "movhps", "movlhps", "movlpd", "movlps", "movmskpd", "movmskps",
+ "movntdqa", "movnti", "movntpd", "movntps", "movntq", "movq", "movq",
+ "movs", "movsb", "movsd", "movsd", "movshdup", "movsldup", "movsq",
+ "movsw", "movsx", "movsxd", "movupd", "movups", "movzx", "mpsadbw", "mul",
+ "mulps", "mulsd", "mulss", "mulx", "mwait", "neg", "nop", "not", "or",
+ "orps", "out", "outs", "outsb", "outsd", "outsw", "pabsb", "pabsd",
+ "pabsw", "packssdw", "packsswb", "packusdw", "packuswb", "paddb", "paddd",
+ "paddsb", "paddsw", "paddusb", "paddusw", "paddw", "palignr", "pand",
+ "pause", "pavgb", "pavgw", "pblendvb", "pblendw", "pclmulqdq", "pcmpeqb",
+ "pcmpeqq", "pcmpeqw", "pcmpestri", "pcmpestrm", "pcmpgtb", "pcmpgtd",
+ "pcmpgtw", "pcmpistri", "pcmpistrm", "pdep", "pext", "pextrb", "pextrd",
+ "pextrw", "phaddd", "phaddsw", "phaddw", "phminposuw", "phsubd", "phsubsw",
+ "pinsrb", "pinsrd", "pinsrq", "pinsrw", "pmaddubsw", "pmaddwd", "pmaxsb",
+ "pmaxsq", "pmaxsw", "pmaxub", "pmaxud", "pmaxuq", "pmaxuw", "pminsb",
+ "pminsq", "pminsw", "pminub", "pminud", "pminuq", "pminuw", "pmovmskb",
+ "pmovzx", "pmuldq", "pmulhrsw", "pmulhuw", "pmulhw", "pmulld", "pmullq",
+ "pmuludq", "pop", "popa", "popad", "popcnt", "popf", "popfd", "popfq",
+ "prefetchw", "prefetchh", "psadbw", "pshufb", "pshufd", "pshufhw",
+ "pshufw", "psignb", "psignd", "psignw", "pslld", "pslldq", "psllq",
+ "psrad", "psraq", "psraw", "psrld", "psrldq", "psrlq", "psrlw", "psubb",
+ "psubq", "psubsb", "psubsw", "psubusb", "psubusw", "psubw", "ptest",
+ "punpckhbw", "punpckhdq", "punpckhqdq", "punpckhwd", "punpcklbw",
+ "punpcklqdq", "punpcklwd", "push", "pushw", "pushd", "pusha", "pushad",
+ "pushfd", "pushfq", "pxor", "rcl", "rcpps", "rcpss", "rcr", "rdfsbase",
+ "rdmsr", "rdpid", "rdpkru", "rdpmc", "rdrand", "rdseed", "rdtsc", "rdtscp",
+ "repe", "repne", "repnz", "repz", "ret", "rol", "ror", "rorx", "roundpd",
+ "roundsd", "roundss", "rsm", "rsqrtps", "rsqrtss", "sahf", "sal", "sar",
+ "sbb", "scas", "scasb", "scasd", "scasw", "seta", "setae", "setb", "setbe",
+ "sete", "setg", "setge", "setl", "setle", "setna", "setnae", "setnb",
+ "setnc", "setne", "setng", "setnge", "setnl", "setnle", "setno", "setnp",
+ "setnz", "seto", "setp", "setpe", "setpo", "sets", "setz", "sfence",
+ "sha1msg1", "sha1msg2", "sha1nexte", "sha1rnds4", "sha256msg1",
+ "sha256rnds2", "shl", "shld", "shlx", "shr", "shrd", "shrx", "shufpd",
+ "sidt", "sldt", "smsw", "sqrtpd", "sqrtps", "sqrtsd", "sqrtss", "stac",
+ "std", "sti", "stmxcsr", "stos", "stosb", "stosd", "stosq", "stosw", "str",
+ "subpd", "subps", "subsd", "subss", "swapgs", "syscall", "sysenter",
+ "sysret", "test", "tpause", "tzcnt", "ucomisd", "ucomiss", "ud",
+ "umwait", "unpckhpd", "unpckhps", "unpcklpd", "unpcklps", "valignd",
+ "vblendmpd", "vblendmps", "vbroadcast", "vcompresspd", "vcompressps",
+ "vcvtpd2udq", "vcvtpd2uqq", "vcvtph2ps", "vcvtps2ph", "vcvtps2qq",
+ "vcvtps2uqq", "vcvtqq2pd", "vcvtqq2ps", "vcvtsd2usi", "vcvtss2usi",
+ "vcvttpd2udq", "vcvttpd2uqq", "vcvttps2qq", "vcvttps2udq", "vcvttps2uqq",
+ "vcvttss2usi", "vcvtudq2pd", "vcvtudq2ps", "vcvtuqq2pd", "vcvtuqq2ps",
+ "vcvtusi2ss", "vdbpsadbw", "verr", "verw", "vexpandpd", "vexpandps",
+ "vextractf32x4", "vextractf32x8", "vextractf64x2", "vextractf64x4",
+ "vextracti32x4", "vextracti32x8", "vextracti64x2", "vextracti64x4",
+ "vfixupimmps", "vfixupimmsd", "vfixupimmss", "vfmadd132pd", "vfmadd132ps",
+ "vfmadd132ss", "vfmadd213pd", "vfmadd213ps", "vfmadd213sd", "vfmadd213ss",
+ "vfmadd231ps", "vfmadd231sd", "vfmadd231ss", "vfmaddsub132pd",
+ "vfmaddsub213pd", "vfmaddsub213ps", "vfmaddsub231pd", "vfmaddsub231ps",
+ "vfmsub132ps", "vfmsub132sd", "vfmsub132ss", "vfmsub213pd", "vfmsub213ps",
+ "vfmsub213ss", "vfmsub231pd", "vfmsub231ps", "vfmsub231sd", "vfmsub231ss",
+ "vfmsubadd132ps", "vfmsubadd213pd", "vfmsubadd213ps", "vfmsubadd231pd",
+ "vfnmadd132pd", "vfnmadd132ps", "vfnmadd132sd", "vfnmadd132ss",
+ "vfnmadd213ps", "vfnmadd213sd", "vfnmadd213ss", "vfnmadd231pd",
+ "vfnmadd231sd", "vfnmadd231ss", "vfnmsub132pd", "vfnmsub132ps",
+ "vfnmsub132ss", "vfnmsub213pd", "vfnmsub213ps", "vfnmsub213sd",
+ "vfnmsub231pd", "vfnmsub231ps", "vfnmsub231sd", "vfnmsub231ss",
+ "vfpclassps", "vfpclasssd", "vfpclassss", "vgatherdpd", "vgatherdpd",
+ "vgatherdps", "vgatherqpd", "vgatherqpd", "vgatherqps", "vgatherqps",
+ "vgetexpps", "vgetexpsd", "vgetexpss", "vgetmantpd", "vgetmantps",
+ "vgetmantss", "vinsertf128", "vinsertf32x4", "vinsertf32x8",
+ "vinsertf64x4", "vinserti128", "vinserti32x4", "vinserti32x8",
+ "vinserti64x4", "vmaskmov", "vmovdqa32", "vmovdqa64", "vmovdqu16",
+ "vmovdqu64", "vmovdqu8", "vpblendd", "vpblendmb", "vpblendmd", "vpblendmq",
+ "vpbroadcast", "vpbroadcastb", "vpbroadcastd", "vpbroadcastm",
+ "vpbroadcastw", "vpcmpb", "vpcmpd", "vpcmpq", "vpcmpub", "vpcmpud",
+ "vpcmpuw", "vpcmpw", "vpcompressd", "vpcompressq", "vpconflictd",
+ "vperm2f128", "vperm2i128", "vpermb", "vpermd", "vpermi2b", "vpermi2d",
+ "vpermi2ps", "vpermi2q", "vpermi2w", "vpermilpd", "vpermilps", "vpermpd",
+ "vpermq", "vpermt2b", "vpermt2d", "vpermt2pd", "vpermt2ps", "vpermt2q",
+ "vpermw", "vpexpandd", "vpexpandq", "vpgatherdd", "vpgatherdd",
+ "vpgatherdq", "vpgatherqd", "vpgatherqd", "vpgatherqq", "vpgatherqq",
+ "vplzcntq", "vpmadd52huq", "vpmadd52luq", "vpmaskmov", "vpmovb2m",
+ "vpmovdb", "vpmovdw", "vpmovm2b", "vpmovm2d", "vpmovm2q", "vpmovm2w",
+ "vpmovqb", "vpmovqd", "vpmovqw", "vpmovsdb", "vpmovsdw", "vpmovsqb",
+ "vpmovsqw", "vpmovswb", "vpmovusdb", "vpmovusdw", "vpmovusqb", "vpmovusqd",
+ "vpmovuswb", "vpmovw2m", "vpmovwb", "vpmultishiftqb", "vprold", "vprolq",
+ "vprolvq", "vprord", "vprorq", "vprorvd", "vprorvq", "vpscatterdd",
+ "vpscatterqd", "vpscatterqq", "vpsllvd", "vpsllvq", "vpsllvw", "vpsravd",
+ "vpsravw", "vpsrlvd", "vpsrlvq", "vpsrlvw", "vpternlogd", "vpternlogq",
+ "vptestmd", "vptestmq", "vptestmw", "vptestnmb", "vptestnmd", "vptestnmq",
+ "vrangepd", "vrangeps", "vrangesd", "vrangess", "vrcp14pd", "vrcp14ps",
+ "vrcp14ss", "vreducepd", "vreduceps", "vreducesd", "vreducess",
+ "vrndscaleps", "vrndscalesd", "vrndscaless", "vrsqrt14pd", "vrsqrt14ps",
+ "vrsqrt14ss", "vscalefpd", "vscalefps", "vscalefsd", "vscalefss",
+ "vscatterdps", "vscatterqpd", "vscatterqps", "vshuff32x4", "vshuff64x2",
+ "vshufi64x2", "vtestpd", "vtestps", "vzeroall", "vzeroupper", "wait",
+ "wrfsbase", "wrgsbase", "wrmsr", "wrpkru", "xabort", "xacquire", "xadd",
+ "xchg", "xend", "xgetbv", "xlat", "xlatb", "xor", "xorpd", "xorps",
"xrstor", "xrstors", "xsave", "xsavec", "xsaveopt", "xsaves", "xsetbv",
]
@@ -166,18 +166,21 @@ fasm_types = [
"du",
]
+
# Add kind flag to identifier in id2kind
def id_add_kind(identifier, kind):
if identifier not in id2kind:
id2kind[identifier] = ''
id2kind[identifier] += kind
+
# Remove kind flag of identifier in id2kind
def id_remove_kind(identifier, kind):
if identifier in id2kind:
if kind in id2kind[identifier]:
id2kind[identifier] = id2kind[identifier].replace(kind, '')
+
# Get kind of an identifier
def id_get_kind(identifier):
if identifier in id2kind:
@@ -185,6 +188,7 @@ def id_get_kind(identifier):
else:
return ''
+
class LegacyAsmReader:
def __init__(self, file):
self.file = file
@@ -196,8 +200,10 @@ class LegacyAsmReader:
return self.lines[self.line_idx]
def curr(self):
- try: return self.lines[self.line_idx][self.i]
- except: return ''
+ try:
+ return self.lines[self.line_idx][self.i]
+ except:
+ return ''
def step(self):
c = self.curr()
@@ -230,13 +236,14 @@ class LegacyAsmReader:
return True
return False
- def location(self):
+ def location(self):
return f"{self.file}:{self.line_idx + 1}"
def skip_spaces(self):
while self.curr().isspace():
self.step()
+
class AsmReaderRecognizingStrings(LegacyAsmReader):
def __init__(self, file):
super().__init__(file)
@@ -247,9 +254,9 @@ class AsmReaderRecognizingStrings(LegacyAsmReader):
c = super().step()
if self.should_recognize_strings and (c == '"' or c == "'"):
# If just now we was at the double or single quotation mark
- # and we aren't in a string yet
- # then say "we are in a string openned with this quotation mark now"
- if self.in_string == None:
+ # and we aren't in a string yet then say
+ # "we are in a string openned with this quotation mark now"
+ if self.in_string is None:
self.in_string = c
# If just now we was at the double or single quotation mark
# and we are in the string entered with the same quotation mark
@@ -258,6 +265,7 @@ class AsmReaderRecognizingStrings(LegacyAsmReader):
self.in_string = None
return c
+
class AsmReaderReadingComments(AsmReaderRecognizingStrings):
def __init__(self, file):
super().__init__(file)
@@ -282,8 +290,11 @@ class AsmReaderReadingComments(AsmReaderRecognizingStrings):
self.status_has_code = True
def update_status(self):
- # If we aren't in a comment and we aren't in a string - say we are now in a comment if ';' met
- if not self.status_has_comment and not self.in_string and self.curr() == ';':
+ # If we aren't in a comment and we aren't in a string -
+ # say we are now in a comment if ';' met
+ if (not self.status_has_comment and
+ not self.in_string and
+ self.curr() == ';'):
self.status_set_has_comment()
# Else if we are in a comment - collect the comment
elif self.status_has_comment:
@@ -305,7 +316,8 @@ class AsmReaderReadingComments(AsmReaderRecognizingStrings):
super().nextline()
# If the line we leave was not a comment-only line
# then forget the collected comment
- # Otherwise the collected comment should be complemented by comment from next line in step()
+ # Otherwise the collected comment should be complemented by
+ # comment from next line in step()
if self.status_has_code:
# But we should preserve comment for the next line
# If previous line set align (cause many functions re documented
@@ -314,9 +326,11 @@ class AsmReaderReadingComments(AsmReaderRecognizingStrings):
self.comment = ''
# Reset the line status (now it's the status of the new line)
self.status_reset()
- # Set new status for this line according to the first character in the line
+ # Set new status for this line according to the
+ # first character in the line
self.update_status()
+
class AsmReaderFetchingIdentifiers(AsmReaderReadingComments):
def __init__(self, file):
super().__init__(file)
@@ -328,10 +342,12 @@ class AsmReaderFetchingIdentifiers(AsmReaderReadingComments):
result += self.step()
return result
+
class AsmReader(AsmReaderFetchingIdentifiers):
def __init__(self, file):
super().__init__(file)
+
def append_file(full_path, contents):
if debug_mode:
if full_path not in output_files:
@@ -342,11 +358,13 @@ def append_file(full_path, contents):
f.write(contents)
f.close()
+
class AsmElement:
def __init__(self, location, name, comment):
global warnings
- # If the element was constructed during this execution then the element is new
+ # If the element was constructed during this execution then
+ # the element is new
self.new = True
self.location = location
self.file = self.location.split(':')[0].replace('\\', '/')
@@ -361,7 +379,7 @@ class AsmElement:
print(f"\n{self.location}: {self.name}")
print(f"{self.comment}")
- def emit(self, dest, doxycomment = '', declaration = ''):
+ def emit(self, dest, doxycomment='', declaration=''):
# Do not emit anything if the symbol is marked as hidden in its comment
if '@dont_give_a_doxygen' in self.comment:
return
@@ -374,19 +392,22 @@ class AsmElement:
if not doxycomment.endswith('\n'):
doxycomment += '\n'
if doxycomment.split('@brief ')[1][0].islower():
- warnings += f"{self.location}: Brief comment starting from lowercase\n"
+ warnings += (f"{self.location}: Brief comment starting from " +
+ "lowercase\n")
# Build contents to emit
contents = ''
contents += '/**\n'
contents += doxycomment
contents += (f"@par Source\n" +
- f"{self.file}:{self.line}\n")
+ f"{self.file}:{self.line}\n")
contents += '*/\n'
contents += declaration
contents += '\n\n'
# Get path to file to emit this
full_path = dest + '/' + self.file
- # Remove the file on first access if it was created by previous generation
+ # Remove the file on first access if it was
+ # created by previous generation
if full_path not in created_files:
if os.path.isfile(full_path):
os.remove(full_path)
@@ -397,6 +418,7 @@ class AsmElement:
append_file(full_path, contents)
+
class AsmVariable(AsmElement):
def __init__(self, location, name, comment, type, init):
super().__init__(location, name, comment)
@@ -422,8 +444,10 @@ class AsmVariable(AsmElement):
# Emit this
super().emit(dest, doxycomment, declaration)
+
class AsmFunction(AsmElement):
- def __init__(self, location, name, comment, calling_convention, args, used_regs):
+ def __init__(self, location, name, comment, calling_convention,
+ args, used_regs):
super().__init__(location, name, comment)
self.calling_convention = calling_convention
self.args = args
@@ -473,6 +497,7 @@ class AsmFunction(AsmElement):
# Emit this
super().emit(dest, doxycomment, declaration)
+
class AsmLabel(AsmElement):
def __init__(self, location, name, comment):
super().__init__(location, name, comment)
@@ -493,6 +518,7 @@ class AsmLabel(AsmElement):
# Emit this
super().emit(dest, doxycomment, declaration)
+
class AsmMacro(AsmElement):
def __init__(self, location, name, comment, args):
super().__init__(location, name, comment)
@@ -526,6 +552,7 @@ class AsmMacro(AsmElement):
# Emit this
super().emit(dest, doxycomment, declaration)
+
class AsmStruct(AsmElement):
def __init__(self, location, name, comment, members):
super().__init__(location, name, comment)
@@ -546,11 +573,13 @@ class AsmStruct(AsmElement):
declaration = f"struct {self.name}" + " {\n"
for member in self.members:
if type(member) == AsmVariable:
- declaration += f'\t{member.type} {member.name}; /**< {member.comment} */\n'
+ declaration += (f'\t{member.type} {member.name}; ' +
+ f'/**< {member.comment} */\n')
declaration += '};'
# Emit this
super().emit(dest, doxycomment, declaration)
+
class AsmUnion(AsmElement):
def __init__(self, location, name, comment, members):
super().__init__(location, name, comment)
@@ -571,16 +600,20 @@ class AsmUnion(AsmElement):
# Emit this
super().emit(dest, doxycomment, declaration)
+
class VariableNameIsMacroName:
def __init__(self, name):
self.name = name
+
def is_id(c):
return c.isprintable() and c not in "+-/*=<>()[]{};:,|&~#`'\" \n\r\t\v"
+
def is_starts_as_id(s):
return not s[0].isdigit()
+
def parse_after_macro(r):
location = r.location()
@@ -620,15 +653,17 @@ def parse_after_macro(r):
r.step()
# Something unexpected
else:
- raise Exception(f"Unexpected symbol '{r.curr()}' at index #{r.i} " +
- f"in the macro declaration at {location} " +
+ raise Exception(f"Unexpected symbol '{r.curr()}' " +
+ f"at index #{r.i} in the macro declaration " +
+ f"at {location} " +
f"(line: {r.lines[r.line_idx]})\n''")
# Append the last argument
if arg != '':
args.append(arg)
# Skip t spaces after the argument list
r.skip_spaces()
- # Get a comment if it is: read till the end of the line and get the comment from the reader
+ # Get a comment if it is: read till the end of the line and
+ # get the comment from the reader
while r.curr() != '':
r.step()
comment = r.comment
@@ -645,7 +680,8 @@ def parse_after_macro(r):
# Build the output
return AsmMacro(location, name, comment, args)
-def parse_variable(r, first_word = None):
+
+def parse_variable(r, first_word=None):
global warnings
location = r.location()
@@ -654,14 +690,15 @@ def parse_variable(r, first_word = None):
# Get variable name
name = ""
# Read it if it was not supplied
- if first_word == None:
+ if first_word is None:
while is_id(r.curr()):
name += r.step()
# Or use the supplied one instead
else:
name = first_word
# Check the name
- # If it's 0 len, that means threr's something else than an identifier at the beginning
+ # If it's 0 len, that means threr's something else than an
+ # identifier at the beginning
if len(name) == 0:
return None
# If it starts from digit or othervice illegally it's illegal
@@ -675,7 +712,8 @@ def parse_variable(r, first_word = None):
# If it's a macro name, that's not a variable declaration
if ID_KIND_MACRO_NAME in kind:
return VariableNameIsMacroName(name)
- # If it's a datatype or a structure name that's not a variable declaration: that's just a data
+ # If it's a datatype or a structure name that's not a
+ # variable declaration: that's just a data
# don't document just a data for now
if ID_KIND_STRUCT_NAME in kind or ID_KIND_FASM_TYPE in kind:
return None
@@ -714,7 +752,8 @@ def parse_variable(r, first_word = None):
# Build the result
return AsmVariable(location, name, r.comment, var_type, value)
-def parse_after_struct(r, as_union = True):
+
+def parse_after_struct(r, as_union=True):
global warnings
location = r.location()
@@ -740,14 +779,15 @@ def parse_after_struct(r, as_union = True):
elif type(var) == str:
if var == 'union':
# Parse the union as a struct
- union = parse_after_struct(r, as_union = True)
+ union = parse_after_struct(r, as_union=True)
members.append(union)
# Skip the ends of the union
r.nextline()
elif r.curr() == ':':
warnings += f"{r.location()}: Skept the label in the struct\n"
else:
- raise Exception(f"Garbage in struct member at {location} (got '{var}' identifier)")
+ raise Exception(f"Garbage in struct member at {location} " +
+ f" (got '{var}' identifier)")
elif type(var) == VariableNameIsMacroName:
if var.name == 'ends':
break
@@ -758,6 +798,7 @@ def parse_after_struct(r, as_union = True):
else:
return AsmUnion(location, name, comment, members)
+
def parse_after_proc(r):
# Get proc name
name = r.fetch_identifier()
@@ -813,7 +854,9 @@ def parse_after_proc(r):
r.step()
comment = r.comment
# Build the element
- return AsmFunction(r.location(), name, comment, calling_convention, args, used_regs)
+ return AsmFunction(r.location(), name, comment, calling_convention,
+ args, used_regs)
+
def get_declarations(asm_file_contents, asm_file_name):
r = AsmReader(asm_file_name)
@@ -857,7 +900,8 @@ def get_declarations(asm_file_contents, asm_file_name):
pass
elif first_word == 'purge':
while True:
- # Skip spaces after the 'purge' keyword or after the comma what separated the previous macro name
+ # Skip spaces after the 'purge' keyword or after
+ # the comma what separated the previous macro name
r.skip_spaces()
# Get the purged macro name
name = ''
@@ -870,7 +914,8 @@ def get_declarations(asm_file_contents, asm_file_name):
pass
# Skip spaces after the name
r.skip_spaces()
- # If it's comma (',') after then that's not the last purged macro, continue purging
+ # If it's comma (',') after then that's not the last purged
+ # macro, continue purging
if r.curr() == ',':
r.step()
continue
@@ -893,14 +938,19 @@ def get_declarations(asm_file_contents, asm_file_name):
name = var
# Match label beginning (':' after name)
if r.curr() == ':':
- # Get to the end of the line and get the coment from the reader
+ # Get to the end of the line and
+ # get the coment from the reader
while r.curr() != '':
r.step()
comment = r.comment
# Only handle non-local labels
if name[0] != '.' and name != "@@" and name != "$Revision":
+ # Treate the label as function if there's @return or
+ # @param in its comment. Othervice it's just a variable
+ # with type `label` in generated doxygen C
if '@return' in comment or '@param' in comment:
- element = AsmFunction(r.location(), name, comment, '', [], [])
+ element = AsmFunction(r.location(), name, comment,
+ '', [], [])
else:
element = AsmLabel(r.location(), name, comment)
elements.append(element)
@@ -914,6 +964,7 @@ def get_declarations(asm_file_contents, asm_file_name):
id_add_kind(word_one, ID_KIND_EQUATED_CONSTANT)
r.nextline()
+
def it_neds_to_be_parsed(source_file):
# If there's no symbols file saved - parse it anyway
# cause we need to create the symbols file and use it
@@ -933,7 +984,8 @@ def it_neds_to_be_parsed(source_file):
return True
return False
-def handle_file(handled_files, asm_file_name, subdir = "."):
+
+def handle_file(handled_files, asm_file_name, subdir="."):
global elements
# Canonicalize the file path and get it relative to cwd
cwd = os.path.abspath(os.path.dirname(sys.argv[0]))
@@ -947,7 +999,8 @@ def handle_file(handled_files, asm_file_name, subdir = "."):
return
# Say that the file was handled in this execution
handled_files.append(asm_file_name)
- # Check if the file should be parsed (if it was modified or wasn't parsed yet)
+ # Check if the file should be parsed
+ # (if it was modified or wasn't parsed yet)
should_get_declarations = True
if not it_neds_to_be_parsed(asm_file_name):
print(f"Skipping {asm_file_name} (already newest)")
@@ -955,8 +1008,12 @@ def handle_file(handled_files, asm_file_name, subdir = "."):
else:
print(f"Handling {asm_file_name}")
# Remove elements parsed from this file before if any
- elements_to_remove = [x for x in elements if x.location.split(':')[0] == asm_file_name]
- elements = [x for x in elements if x.location.split(':')[0] != asm_file_name]
+ elements_to_remove = [
+ x for x in elements if x.location.split(':')[0] == asm_file_name
+ ]
+ elements = [
+ x for x in elements if x.location.split(':')[0] != asm_file_name
+ ]
# Forget types of identifiers of names of the removed elements
for element in elements_to_remove:
if type(element) == AsmStruct:
@@ -966,10 +1023,11 @@ def handle_file(handled_files, asm_file_name, subdir = "."):
# Read the source
asm_file_contents = open(asm_file_name, "r", encoding="utf-8").read()
# Find includes, fix their paths and handle em recoursively
- includes = re.findall(r'^include (["\'])(.*)\1', asm_file_contents, flags=re.MULTILINE)
+ includes = re.findall(r'^include (["\'])(.*)\1', asm_file_contents,
+ flags=re.MULTILINE)
for include in includes:
- include = include[1].replace('\\', '/');
- full_path = subdir + '/' + include;
+ include = include[1].replace('\\', '/')
+ full_path = subdir + '/' + include
# If the path isn't valid, maybe that's not relative path
if not os.path.isfile(full_path):
full_path = include
@@ -980,7 +1038,8 @@ def handle_file(handled_files, asm_file_name, subdir = "."):
get_declarations(asm_file_contents, asm_file_name)
if __name__ == "__main__":
- link_root = "http://websvn.kolibrios.org/filedetails.php?repname=Kolibri+OS&path=/kernel/trunk"
+ link_root = "http://websvn.kolibrios.org/filedetails.php"
+ link_root += "?repname=Kolibri+OS&path=/kernel/trunk"
# Dict where an identifier is assicoated with a string
# The string contains characters specifying flags
@@ -1023,12 +1082,24 @@ if __name__ == "__main__":
# Parse arguments
parser = argparse.ArgumentParser()
parser.add_argument("-o", help="Doxygen output folder")
- parser.add_argument("--clean", help="Remove generated files", action="store_true")
- parser.add_argument("--dump", help="Dump all defined symbols", action="store_true")
- parser.add_argument("--stats", help="Print symbol stats", action="store_true")
- parser.add_argument("--nowarn", help="Do not write warnings file", action="store_true")
- parser.add_argument("--noemit", help="Do not emit doxygen files (for testing)", action="store_true")
- parser.add_argument("--debug", help="Show hashes of files (for testing)", action="store_true")
+ parser.add_argument("--clean",
+ help="Remove generated files",
+ action="store_true")
+ parser.add_argument("--dump",
+ help="Dump all defined symbols",
+ action="store_true")
+ parser.add_argument("--stats",
+ help="Print symbol stats",
+ action="store_true")
+ parser.add_argument("--nowarn",
+ help="Do not write warnings file",
+ action="store_true")
+ parser.add_argument("--noemit",
+ help="Do not emit doxygen files (for testing)",
+ action="store_true")
+ parser.add_argument("--debug",
+ help="Show hashes of files (for testing)",
+ action="store_true")
args = parser.parse_args()
doxygen_src_path = args.o if args.o else 'docs/doxygen'
clean_generated_stuff = args.clean
@@ -1042,18 +1113,20 @@ if __name__ == "__main__":
elements = []
created_files = []
kernel_files = []
- output_files = {} # If --debug then all the files are written here
+ output_files = {} # If --debug then all the files are written here
# Load remembered list of symbols
if os.path.isfile('asmxygen.elements.pickle'):
print('Reading existing dump of symbols')
- (elements, id2kind) = pickle.load(open('asmxygen.elements.pickle', 'rb'))
+ pickle_file = open('asmxygen.elements.pickle', 'rb')
+ (elements, id2kind) = pickle.load(pickle_file)
+ pickle_file.close()
- handle_file(kernel_files, "./kernel.asm");
+ handle_file(kernel_files, "./kernel.asm")
if dump_symbols:
stdout = sys.stdout
- sys.stdout = open('asmxygen.dump.txt', 'w', encoding = 'utf-8')
+ sys.stdout = open('asmxygen.dump.txt', 'w', encoding='utf-8')
for asm_element in elements:
asm_element.dump()
sys.stdout = stdout
@@ -1063,7 +1136,7 @@ if __name__ == "__main__":
for file in kernel_files:
doxygen_file = f"{doxygen_src_path}/{file}"
if (os.path.isfile(doxygen_file)):
- print(f"Removing {file}... ", end = '')
+ print(f"Removing {file}... ", end='')
os.remove(doxygen_file)
print("Done.")
elif not noemit:
@@ -1072,16 +1145,20 @@ if __name__ == "__main__":
i = 0
new_elements = [x for x in elements if x.new]
for element in new_elements:
- print(f"[{i + 1}/{len(new_elements)}] Emitting {element.name} from {element.location}")
+ counter = f"[{i + 1}/{len(new_elements)}]"
+ print(f"{counter} Emitting {element.name} from {element.location}")
element.emit(doxygen_src_path)
i += 1
print(f"Writing dump of symbols to asmxygen.elements.pickle")
- # Now when the new elements already was written, there's no new elements anymore
+ # Now when the new elements already was written, there's no new
+ # elements anymore
for element in elements:
element.new = False
- pickle.dump((elements, id2kind), open('asmxygen.elements.pickle', 'wb'))
+ pickle_file = open('asmxygen.elements.pickle', 'wb')
+ pickle.dump((elements, id2kind), pickle_file)
+ pickle_file.close()
if print_stats:
var_count = 0
@@ -1111,7 +1188,7 @@ if __name__ == "__main__":
print(f'Parsed structure type count: {str_count}')
if enable_warnings:
- open('asmxygen.txt', "w", encoding = "utf-8").write(warnings)
+ open('asmxygen.txt', "w", encoding="utf-8").write(warnings)
if debug_mode:
hash_per_file = ""
@@ -1124,6 +1201,7 @@ if __name__ == "__main__":
else:
reference_hash_per_file = open("asmxygen_hash_per_file.txt").read()
if reference_hash_per_file != hash_per_file:
- print(''.join(difflib.ndiff(reference_hash_per_file, hash_per_file)))
+ diffs = difflib.ndiff(reference_hash_per_file, hash_per_file)
+ print(''.join(diffs))
else:
print("SUCCESS")