Skip to content

Instantly share code, notes, and snippets.

@tekknolagi
Created December 13, 2020 22:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tekknolagi/68fcf14010b8994028070374031cac4a to your computer and use it in GitHub Desktop.
Save tekknolagi/68fcf14010b8994028070374031cac4a to your computer and use it in GitHub Desktop.
Advent of Code Handheld Halting Compiler
import sys
def compile(prog):
result = (
"#include <stdbool.h>\n"
"#include <stdio.h>\n"
"#include <string.h>\n"
"int execute() {\n"
"int acc = 0;\n"
f"int counters[{len(prog)}];\n"
"memset(counters, 0, sizeof counters);\n"
)
pc = 0
while pc < len(prog):
ins, arg = prog[pc]
result += f"label_{pc}: "
if ins == "jmp":
result += f"goto label_{pc + arg};\n"
elif ins == "nop":
result += f"// nop {arg}\n"
elif ins == "acc":
result += f"acc += {arg};\n"
else:
raise RuntimeError(f"unhandled instruction {ins}")
pc += 1
result += f"label_{pc}: "
result += "return acc;\n"
result += "}\n"
result += """
int main() {
printf("Result: %d\\n", execute());
return 0;
}
"""
return result
def main(filename):
with open(filename, "r") as f:
prog = []
for line in f:
ins, arg = line.rstrip().split()
prog.append((ins, int(arg)))
print(compile(prog))
if __name__ == "__main__":
# first arg: filename
main(*sys.argv[1:])
laurel% objdump -D out.o
out.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <execute>:
0: eb fe jmp 0 <execute>
Disassembly of section .text.startup:
0000000000000000 <main>:
0: eb fe jmp 0 <main>
Disassembly of section .comment:
0000000000000000 <.comment>:
0: 00 47 43 add %al,0x43(%rdi)
3: 43 3a 20 rex.XB cmp (%r8),%spl
6: 28 47 4e sub %al,0x4e(%rdi)
9: 55 push %rbp
a: 29 20 sub %esp,(%rax)
c: 31 30 xor %esi,(%rax)
e: 2e 32 2e xor %cs:(%rsi),%ch
11: 31 20 xor %esp,(%rax)
13: 32 30 xor (%rax),%dh
15: 32 30 xor (%rax),%dh
17: 31 30 xor %esi,(%rax)
19: 31 36 xor %esi,(%rsi)
1b: 20 28 and %ch,(%rax)
1d: 52 push %rdx
1e: 65 64 20 48 61 gs and %cl,%fs:0x61(%rax)
23: 74 20 je 45 <execute+0x45>
25: 31 30 xor %esi,(%rax)
27: 2e 32 2e xor %cs:(%rsi),%ch
2a: 31 .byte 0x31
2b: 2d .byte 0x2d
2c: 36 29 00 sub %eax,%ss:(%rax)
Disassembly of section .eh_frame:
0000000000000000 <.eh_frame>:
0: 14 00 adc $0x0,%al
2: 00 00 add %al,(%rax)
4: 00 00 add %al,(%rax)
6: 00 00 add %al,(%rax)
8: 01 7a 52 add %edi,0x52(%rdx)
b: 00 01 add %al,(%rcx)
d: 78 10 js 1f <.eh_frame+0x1f>
f: 01 1b add %ebx,(%rbx)
11: 0c 07 or $0x7,%al
13: 08 90 01 00 00 10 or %dl,0x10000001(%rax)
19: 00 00 add %al,(%rax)
1b: 00 1c 00 add %bl,(%rax,%rax,1)
1e: 00 00 add %al,(%rax)
20: 00 00 add %al,(%rax)
22: 00 00 add %al,(%rax)
24: 02 00 add (%rax),%al
26: 00 00 add %al,(%rax)
28: 00 00 add %al,(%rax)
2a: 00 00 add %al,(%rax)
2c: 10 00 adc %al,(%rax)
2e: 00 00 add %al,(%rax)
30: 30 00 xor %al,(%rax)
32: 00 00 add %al,(%rax)
34: 00 00 add %al,(%rax)
36: 00 00 add %al,(%rax)
38: 02 00 add (%rax),%al
3a: 00 00 add %al,(%rax)
3c: 00 00 add %al,(%rax)
...
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
int execute() {
int acc = 0;
int counters[625];
memset(counters, 0, sizeof counters);
label_0:
goto label_301;
label_1:
acc += 27;
label_2: // nop 299
label_3:
goto label_171;
label_4:
acc += 0;
label_5:
acc += 48;
label_6:
acc += -5;
label_7:
goto label_427;
label_8:
goto label_163;
label_9:
acc += -16;
label_10:
acc += -15;
label_11: // nop 582
label_12:
acc += -5;
label_13:
goto label_503;
label_14:
acc += 10;
label_15: // nop 300
label_16:
acc += -2;
label_17:
acc += -1;
label_18:
goto label_270;
label_19:
goto label_21;
label_20:
goto label_254;
label_21:
acc += 36;
label_22:
acc += 50;
label_23:
goto label_587;
label_24:
goto label_126;
label_25:
goto label_498;
label_26:
acc += 37;
label_27:
acc += 1;
label_28:
acc += 20;
label_29:
goto label_384;
label_30:
acc += 28;
label_31:
acc += -14;
label_32:
acc += 22;
label_33:
goto label_362;
label_34:
acc += 44;
label_35:
goto label_36;
label_36:
goto label_59;
label_37: // nop 312
label_38:
goto label_289;
label_39:
acc += 12;
label_40:
acc += 39;
label_41:
acc += 33;
label_42:
goto label_21;
label_43:
acc += 28;
label_44:
acc += 14;
label_45:
acc += 42;
label_46:
acc += 33;
label_47:
goto label_549;
label_48:
goto label_171;
label_49:
acc += 24;
label_50:
goto label_61;
label_51:
acc += -8;
label_52: // nop 218
label_53: // nop 516
label_54:
goto label_298;
label_55:
goto label_19;
label_56: // nop 192
label_57:
acc += -11;
label_58:
goto label_158;
label_59:
goto label_358;
label_60:
goto label_460;
label_61:
acc += 29;
label_62:
acc += 13;
label_63:
goto label_64;
label_64:
acc += 45;
label_65:
goto label_523;
label_66:
acc += 6;
label_67:
acc += 15;
label_68:
goto label_610;
label_69:
acc += 38;
label_70:
acc += -15;
label_71:
acc += -15;
label_72:
acc += -11;
label_73:
goto label_547;
label_74:
acc += 0;
label_75:
acc += 1;
label_76:
goto label_131;
label_77:
acc += 14;
label_78:
acc += 13;
label_79:
acc += 37;
label_80:
acc += -18;
label_81:
goto label_176;
label_82:
goto label_9;
label_83:
acc += 25;
label_84:
goto label_30;
label_85:
goto label_498;
label_86:
acc += -17;
label_87:
acc += 25;
label_88:
acc += 22;
label_89:
goto label_494;
label_90:
goto label_241;
label_91:
goto label_92;
label_92:
acc += -14;
label_93:
acc += 33;
label_94:
acc += 30;
label_95:
goto label_9;
label_96:
acc += 32;
label_97:
acc += -3;
label_98:
acc += 26;
label_99:
acc += 7;
label_100:
goto label_593;
label_101:
acc += 44;
label_102:
goto label_103;
label_103: // nop 357
label_104:
acc += 47;
label_105:
goto label_517;
label_106:
goto label_427;
label_107:
acc += -5;
label_108:
goto label_120;
label_109:
acc += 18;
label_110:
acc += -1;
label_111:
acc += 29;
label_112:
goto label_542;
label_113:
acc += 35;
label_114:
acc += 34;
label_115:
goto label_116;
label_116:
acc += -6;
label_117:
goto label_301;
label_118:
acc += -12;
label_119:
goto label_83;
label_120:
acc += 22;
label_121:
acc += -5;
label_122:
acc += 14;
label_123:
acc += 0;
label_124:
goto label_322;
label_125:
goto label_418;
label_126: // nop 76
label_127:
acc += 8;
label_128:
acc += 13;
label_129:
goto label_593;
label_130:
goto label_439;
label_131:
acc += -19;
label_132:
acc += 27;
label_133:
acc += -10;
label_134:
goto label_163;
label_135:
acc += -17;
label_136:
goto label_59;
label_137:
acc += 49;
label_138: // nop 224
label_139:
acc += 0;
label_140:
goto label_217;
label_141:
acc += 35;
label_142:
acc += 3;
label_143:
goto label_460;
label_144: // nop 27
label_145:
acc += 6;
label_146:
goto label_310;
label_147:
acc += 10;
label_148:
acc += 41;
label_149:
acc += -2;
label_150:
acc += -8;
label_151:
goto label_498;
label_152:
acc += 14;
label_153: // nop 148
label_154:
goto label_456;
label_155:
acc += 21;
label_156:
acc += 8;
label_157:
goto label_439;
label_158:
acc += 3;
label_159:
acc += 12;
label_160:
goto label_298;
label_161:
acc += -10;
label_162:
goto label_473;
label_163:
acc += -6;
label_164:
acc += -10;
label_165:
acc += 13;
label_166:
goto label_282;
label_167:
acc += 31;
label_168:
acc += 39;
label_169:
acc += 28;
label_170:
goto label_414;
label_171: // nop 59
label_172:
acc += 16;
label_173:
goto label_174;
label_174:
goto label_610;
label_175:
goto label_144;
label_176:
acc += -12;
label_177:
acc += 43;
label_178:
goto label_43;
label_179:
acc += -1;
label_180:
acc += 35;
label_181:
acc += 50;
label_182:
acc += 0;
label_183:
goto label_581;
label_184:
goto label_101;
label_185:
acc += 40;
label_186:
acc += 26;
label_187:
acc += -8;
label_188:
goto label_581;
label_189:
acc += 28;
label_190:
acc += -7;
label_191:
acc += 43;
label_192:
goto label_423;
label_193:
goto label_171;
label_194:
acc += -1;
label_195:
acc += -18;
label_196:
acc += 19;
label_197:
goto label_86;
label_198:
acc += 38;
label_199:
acc += 21;
label_200:
acc += 7;
label_201:
goto label_335;
label_202:
acc += 8;
label_203:
acc += 18;
label_204:
acc += -9;
label_205:
acc += -7;
label_206:
goto label_230;
label_207:
acc += 5;
label_208:
acc += 0;
label_209:
goto label_163;
label_210:
acc += 2;
label_211:
acc += -12;
label_212:
acc += -17;
label_213:
acc += 36;
label_214:
goto label_126;
label_215: // nop -71
label_216:
goto label_397;
label_217:
goto label_202;
label_218:
goto label_270;
label_219:
acc += 15;
label_220:
acc += 0;
label_221:
goto label_189;
label_222:
acc += -6;
label_223: // nop 166
label_224:
acc += 10;
label_225:
acc += 38;
label_226:
goto label_349;
label_227:
acc += 9;
label_228:
goto label_77;
label_229:
goto label_460;
label_230:
goto label_231;
label_231:
acc += 34;
label_232:
goto label_418;
label_233:
goto label_329;
label_234:
acc += 48;
label_235:
acc += 9;
label_236:
goto label_434;
label_237:
acc += 7;
label_238:
acc += 35;
label_239:
acc += 22;
label_240:
goto label_322;
label_241: // nop 1
label_242: // nop -156
label_243: // nop -49
label_244:
goto label_335;
label_245:
acc += 8;
label_246:
acc += -17;
label_247:
goto label_194;
label_248:
acc += 29;
label_249: // nop 283
label_250:
acc += -2;
label_251: // nop 50
label_252:
goto label_542;
label_253:
goto label_549;
label_254:
goto label_473;
label_255:
goto label_523;
label_256:
goto label_137;
label_257: // nop 353
label_258:
goto label_101;
label_259:
acc += 21;
label_260:
acc += 30;
label_261:
goto label_606;
label_262:
acc += -9;
label_263:
goto label_144;
label_264:
acc += 0;
label_265:
goto label_69;
label_266:
acc += 33;
label_267:
acc += 0;
label_268:
acc += 1;
label_269:
goto label_21;
label_270:
acc += 15;
label_271:
goto label_227;
label_272:
acc += 9;
label_273:
acc += 46;
label_274:
acc += 50;
label_275:
goto label_532;
label_276:
acc += -6;
label_277:
acc += -16;
label_278:
goto label_598;
label_279:
acc += 35;
label_280: // nop -4
label_281:
goto label_276;
label_282:
acc += 30;
label_283:
acc += 27;
label_284:
goto label_285;
label_285:
goto label_581;
label_286:
acc += 8;
label_287:
acc += 40;
label_288:
goto label_498;
label_289:
acc += -14;
label_290:
acc += 34;
label_291:
acc += 42;
label_292:
goto label_465;
label_293:
acc += 16;
label_294:
acc += 47;
label_295:
acc += 11;
label_296:
acc += 32;
label_297:
goto label_91;
label_298:
goto label_259;
label_299:
acc += 45;
label_300:
goto label_547;
label_301:
acc += -17;
label_302: // nop 261
label_303: // nop -254
label_304:
acc += 48;
label_305:
goto label_367;
label_306:
acc += 50;
label_307:
acc += 26;
label_308:
acc += 1;
label_309:
goto label_439;
label_310:
acc += -14;
label_311: // nop 47
label_312:
acc += -9;
label_313:
goto label_37;
label_314:
goto label_210;
label_315:
goto label_450;
label_316:
acc += 40;
label_317:
goto label_21;
label_318:
goto label_329;
label_319:
acc += 2;
label_320:
acc += -17;
label_321:
goto label_83;
label_322:
acc += 34;
label_323:
acc += 37;
label_324:
goto label_158;
label_325: // nop -205
label_326:
acc += -4;
label_327:
acc += 22;
label_328:
goto label_384;
label_329:
acc += 1;
label_330: // nop -210
label_331: // nop -30
label_332:
acc += -18;
label_333:
goto label_83;
label_334:
goto label_227;
label_335:
acc += 45;
label_336:
acc += 50;
label_337:
acc += 3;
label_338:
acc += 3;
label_339:
goto label_276;
label_340:
acc += 35;
label_341:
goto label_342;
label_342:
acc += -5;
label_343: // nop 255
label_344:
goto label_598;
label_345:
goto label_555;
label_346:
acc += 10;
label_347:
acc += 7;
label_348:
goto label_555;
label_349:
acc += 17;
label_350:
acc += 25;
label_351: // nop -22
label_352:
goto label_414;
label_353:
acc += 35;
label_354:
acc += 18;
label_355:
acc += 22;
label_356:
acc += 10;
label_357:
goto label_171;
label_358:
acc += 24;
label_359:
acc += 32;
label_360:
goto label_329;
label_361:
goto label_230;
label_362:
goto label_25;
label_363:
acc += 41;
label_364:
acc += -10;
label_365:
acc += 42;
label_366:
goto label_573;
label_367:
acc += -16;
label_368:
acc += -14;
label_369: // nop -225
label_370:
acc += -15;
label_371:
goto label_441;
label_372: // nop -303
label_373:
acc += -10;
label_374:
acc += 11;
label_375:
acc += 17;
label_376:
goto label_610;
label_377:
acc += -8;
label_378:
acc += 33;
label_379:
goto label_248;
label_380:
acc += -9;
label_381:
acc += -12;
label_382:
acc += 31;
label_383:
goto label_358;
label_384: // nop -277
label_385:
acc += 22;
label_386:
goto label_113;
label_387:
acc += 19;
label_388:
goto label_144;
label_389:
acc += -8;
label_390: // nop 220
label_391:
acc += 48;
label_392:
goto label_131;
label_393:
acc += 23;
label_394:
acc += 11;
label_395:
acc += -16;
label_396:
goto label_349;
label_397:
acc += 50;
label_398:
acc += -9;
label_399:
acc += 23;
label_400:
goto label_362;
label_401:
goto label_547;
label_402: // nop -168
label_403:
goto label_315;
label_404:
acc += 37;
label_405:
acc += 36;
label_406:
acc += 43;
label_407:
acc += -7;
label_408:
goto label_555;
label_409:
goto label_410;
label_410:
acc += 42;
label_411:
goto label_59;
label_412:
acc += 39;
label_413:
goto label_489;
label_414:
acc += 47;
label_415:
goto label_503;
label_416:
acc += -2;
label_417:
goto label_315;
label_418:
acc += 20;
label_419:
goto label_563;
label_420:
acc += 47;
label_421:
acc += 25;
label_422:
goto label_367;
label_423: // nop -65
label_424:
goto label_49;
label_425:
acc += 8;
label_426:
goto label_587;
label_427:
acc += 46;
label_428:
acc += 5;
label_429:
acc += 16;
label_430:
goto label_483;
label_431:
acc += 27;
label_432:
acc += 1;
label_433:
goto label_427;
label_434:
goto label_227;
label_435:
acc += -6;
label_436:
acc += 27;
label_437: // nop 126
label_438:
goto label_241;
label_439:
goto label_329;
label_440:
goto label_563;
label_441:
acc += 13;
label_442:
acc += 31;
label_443: // nop 22
label_444:
acc += 41;
label_445:
goto label_318;
label_446:
acc += -7;
label_447: // nop -386
label_448:
acc += 0;
label_449:
goto label_384;
label_450:
goto label_144;
label_451:
acc += 44;
label_452:
acc += 19;
label_453:
acc += 42;
label_454:
acc += 29;
label_455:
goto label_547;
label_456:
acc += 42;
label_457: // nop -156
label_458:
goto label_402;
label_459:
goto label_113;
label_460: // nop 95
label_461:
acc += -6;
label_462:
acc += -19;
label_463:
goto label_171;
label_464:
goto label_21;
label_465:
acc += -12;
label_466:
acc += -18;
label_467:
goto label_569;
label_468: // nop 35
label_469:
acc += 44;
label_470:
acc += 27;
label_471: // nop -122
label_472:
goto label_569;
label_473:
goto label_91;
label_474:
goto label_389;
label_475:
acc += -9;
label_476: // nop -324
label_477:
goto label_55;
label_478:
acc += -9;
label_479:
acc += 25;
label_480:
acc += 38;
label_481:
acc += -3;
label_482:
goto label_184;
label_483:
acc += -2;
label_484:
acc += 26;
label_485:
acc += 14;
label_486:
goto label_234;
label_487:
acc += 4;
label_488:
goto label_563;
label_489:
acc += 17;
label_490: // nop -208
label_491:
goto label_256;
label_492:
acc += 19;
label_493:
goto label_171;
label_494:
acc += 14;
label_495:
acc += -3;
label_496:
goto label_620;
label_497:
goto label_276;
label_498:
goto label_489;
label_499:
acc += 0;
label_500:
acc += 45;
label_501:
acc += -3;
label_502:
goto label_126;
label_503:
acc += 20;
label_504:
acc += -3;
label_505:
acc += 17;
label_506:
acc += 19;
label_507:
goto label_107;
label_508:
acc += -16;
label_509:
acc += 25;
label_510:
goto label_473;
label_511:
goto label_194;
label_512:
acc += 31;
label_513:
acc += 19;
label_514:
acc += 24;
label_515:
acc += 9;
label_516:
goto label_335;
label_517:
acc += 35;
label_518:
goto label_30;
label_519:
acc += -13;
label_520:
acc += 26;
label_521:
acc += -2;
label_522:
goto label_184;
label_523:
acc += -1;
label_524:
acc += 17;
label_525:
acc += 44;
label_526: // nop -262
label_527:
goto label_441;
label_528:
acc += 17;
label_529:
acc += -1;
label_530:
acc += 23;
label_531:
goto label_610;
label_532:
acc += -5;
label_533:
acc += 18;
label_534:
goto label_535;
label_535:
acc += 12;
label_536:
goto label_409;
label_537:
acc += 1;
label_538:
acc += 35;
label_539:
acc += -10;
label_540:
acc += 14;
label_541:
goto label_189;
label_542:
acc += 39;
label_543: // nop 67
label_544:
goto label_254;
label_545:
acc += -13;
label_546:
goto label_587;
label_547:
goto label_397;
label_548:
goto label_427;
label_549:
acc += 7;
label_550:
goto label_219;
label_551:
acc += 42;
label_552: // nop -389
label_553:
acc += 4;
label_554:
goto label_547;
label_555:
acc += -17;
label_556:
acc += -8;
label_557:
acc += -4;
label_558:
goto label_349;
label_559:
acc += 42;
label_560:
acc += 39;
label_561:
acc += 43;
label_562:
goto label_256;
label_563:
acc += -18;
label_564:
acc += -16;
label_565:
acc += 13;
label_566:
goto label_152;
label_567:
acc += 3;
label_568:
goto label_126;
label_569: // nop 41
label_570:
acc += -12;
label_571:
goto label_377;
label_572:
goto label_69;
label_573:
acc += -18;
label_574:
acc += 35;
label_575:
acc += -4;
label_576:
acc += 18;
label_577:
goto label_184;
label_578: // nop -348
label_579:
acc += -7;
label_580:
goto label_59;
label_581:
acc += 48;
label_582:
acc += -19;
label_583:
acc += -3;
label_584:
acc += 44;
label_585:
goto label_587;
label_586:
goto label_460;
label_587: // nop -474
label_588:
acc += -9;
label_589:
acc += -2;
label_590:
acc += 35;
label_591:
goto label_4;
label_592:
goto label_264;
label_593:
acc += -14;
label_594: // nop -468
label_595:
acc += 39;
label_596:
goto label_439;
label_597:
goto label_59;
label_598:
acc += 0;
label_599: // nop -264
label_600:
acc += 19;
label_601: // nop -266
label_602:
goto label_511;
label_603:
acc += 20;
label_604:
acc += 14;
label_605:
goto label_276;
label_606:
acc += -11;
label_607:
acc += 8;
label_608:
goto label_389;
label_609:
goto label_289;
label_610:
acc += 10;
label_611:
acc += 49;
label_612: // nop -603
label_613:
acc += 49;
label_614:
goto label_270;
label_615: // nop -356
label_616: // nop -93
label_617:
acc += 27;
label_618:
acc += 24;
label_619:
goto label_137;
label_620: // nop -126
label_621: // nop -345
label_622:
acc += 6;
label_623:
acc += 3;
label_624:
goto label_625;
label_625:
return acc;
}
int main() {
printf("Result: %d\n", execute());
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment