// File: /workspace/github_c_makefile_star2_O0/hikalium[P]compilium/parser.c
// Function: ParseDeclSpecs
struct Node *ParseDeclSpecs() {
  // returns Node<kASTList> or NULL
  struct Node *decl_specs = AllocList();
  for (;;) {
    struct Node *decl_spec;
    // storage-class-specifier
    if ((decl_spec = ConsumeToken(kTokenKwTypedef)) ||
        (decl_spec = ConsumeToken(kTokenKwExtern))) {
      PushToList(decl_specs, decl_spec);
      continue;
    }
    if ((decl_spec = ConsumeToken(kTokenKwStatic))) {
      continue;
    }
    // type-qualifier
    if ((decl_spec = ConsumeToken(kTokenKwConst))) {
      PushToList(decl_specs, decl_spec);
      continue;
    }
    if ((decl_spec = ConsumeToken(kTokenKwVoid)) ||
        (decl_spec = ConsumeToken(kTokenKwChar)) ||
        (decl_spec = ConsumeToken(kTokenKwInt)) ||
        (decl_spec = ConsumeToken(kTokenKwLong)) ||
        (decl_spec = ConsumeToken(kTokenKwUnsigned))) {
      PushToList(decl_specs, decl_spec);
      continue;
    }
    // builtin type name
    if ((decl_spec = ConsumeTokenStr("__builtin_va_list"))) {
      PushToList(decl_specs, decl_spec);
      continue;
    }
    // typedef name
    struct Node *typedef_type = GetNodeByTokenKey(ord_idents, PeekToken());
    if (typedef_type) {
      PushToList(decl_specs, typedef_type);
      NextToken();
      continue;
    }
    // struct-or-union-specifier
    if (ConsumeToken(kTokenKwStruct)) {
      struct Node *struct_spec = AllocNode(kASTStructSpec);
      struct_spec->tag = ConsumeToken(kTokenIdent);
      assert(struct_spec->tag);
      if (ConsumePunctuator("{")) {
        struct_spec->struct_member_dict = AllocList();
        struct Node *decl;
        while ((decl = ParseDecl())) {
          AddMemberOfStructFromDecl(struct_spec, decl);
        }
        ExpectPunctuator("}");
      }
      PushToList(decl_specs, struct_spec);
      continue;
    }
    break;
  };
  if (GetSizeOfList(decl_specs) == 0) {
    return NULL;
  }
  return decl_specs;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movb $0x0, %al
callq 0x4e30
movq %rax, -0x10(%rbp)
movl $0x13, %edi
callq 0xc1c0
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
jne 0x982b
movl $0xa, %edi
callq 0xc1c0
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
je 0x983a
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x4f10
jmp 0x9803
movl $0x11, %edi
callq 0xc1c0
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
je 0x9850
jmp 0x9803
movl $0x7, %edi
callq 0xc1c0
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
je 0x9873
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x4f10
jmp 0x9803
movl $0x15, %edi
callq 0xc1c0
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
jne 0x98d7
movl $0x6, %edi
callq 0xc1c0
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
jne 0x98d7
movl $0xd, %edi
callq 0xc1c0
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
jne 0x98d7
movl $0xe, %edi
callq 0xc1c0
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
jne 0x98d7
movl $0x14, %edi
callq 0xc1c0
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
je 0x98e9
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x4f10
jmp 0x9803
leaq 0x7905(%rip), %rdi      # 0x111f5
callq 0xc250
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
je 0x9911
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x4f10
jmp 0x9803
movq 0xba58(%rip), %rax      # 0x15370
movq %rax, -0x38(%rbp)
callq 0xc130
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x50b0
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x994f
movq -0x10(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x4f10
callq 0xc400
jmp 0x9803
movl $0x12, %edi
callq 0xc1c0
cmpq $0x0, %rax
je 0x9a0f
movl $0x13, %edi
callq 0x3a70
movq %rax, -0x28(%rbp)
movl $0x4, %edi
callq 0xc1c0
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0xe8(%rax)
movq -0x28(%rbp), %rax
cmpq $0x0, 0xe8(%rax)
jne 0x99af
leaq 0x7869(%rip), %rdi      # 0x11207
leaq 0x77d6(%rip), %rsi      # 0x1117b
movl $0x184, %edx            # imm = 0x184
callq 0x4b20
leaq 0x7862(%rip), %rdi      # 0x11218
callq 0xc320
cmpq $0x0, %rax
je 0x99fd
movb $0x0, %al
callq 0x4e30
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x68(%rax)
callq 0x9e30
movq %rax, -0x30(%rbp)
cmpq $0x0, %rax
je 0x99f1
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0xb190
jmp 0x99d3
leaq 0x6b2f(%rip), %rdi      # 0x10527
callq 0xc390
movq -0x10(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x4f10
jmp 0x9803
jmp 0x9a11
movq -0x10(%rbp), %rdi
callq 0x4fe0
cmpl $0x0, %eax
jne 0x9a29
movq $0x0, -0x8(%rbp)
jmp 0x9a31
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq
nopl (%rax,%rax)