|
| 1 | +// kc_llvm.hg — Kcode LLVM IR 코드생성기 헤더 |
| 2 | +// version : v0.1.0 |
| 3 | +// §LLVM-SH Phase 1: 타입 상수 / 명령코드 상수 / 구조 정의 |
| 4 | +// kparser.hg (AST 노드) 위에서 동작 |
| 5 | + |
| 6 | +#포함 "kparser.hg" |
| 7 | + |
| 8 | +// ================================================================ |
| 9 | +// LLVM IR 타입 코드 (kc_llvm_type.han 에서 사용) |
| 10 | +// ================================================================ |
| 11 | + |
| 12 | +변수 LLTY_VOID = 0 // void |
| 13 | +변수 LLTY_I1 = 1 // i1 (논리) |
| 14 | +변수 LLTY_I8 = 2 // i8 (바이트/글자) |
| 15 | +변수 LLTY_I16 = 3 // i16 |
| 16 | +변수 LLTY_I32 = 4 // i32 (정수 기본) |
| 17 | +변수 LLTY_I64 = 5 // i64 (정수 확장) |
| 18 | +변수 LLTY_F32 = 6 // float |
| 19 | +변수 LLTY_F64 = 7 // double (실수 기본) |
| 20 | +변수 LLTY_PTR = 8 // ptr (불투명 포인터, LLVM 15+) |
| 21 | +변수 LLTY_ARRAY = 9 // [N x T] |
| 22 | +변수 LLTY_STRUCT = 10 // { T0, T1, ... } |
| 23 | +변수 LLTY_FUNC = 11 // T (T0, T1, ...) — 함수 타입 |
| 24 | +변수 LLTY_LABEL = 12 // label (기본블록 타입) |
| 25 | +변수 LLTY_METADATA = 13 // metadata |
| 26 | + |
| 27 | +// ================================================================ |
| 28 | +// LLVM IR 값 종류 (Value Kind) |
| 29 | +// ================================================================ |
| 30 | + |
| 31 | +변수 LLVK_CONST_INT = 0 // 정수 상수 |
| 32 | +변수 LLVK_CONST_FLOAT = 1 // 실수 상수 |
| 33 | +변수 LLVK_CONST_STR = 2 // 문자열 전역 상수 (getelementptr) |
| 34 | +변수 LLVK_CONST_NULL = 3 // null / zeroinitializer |
| 35 | +변수 LLVK_CONST_BOOL = 4 // i1 상수 (0 / 1) |
| 36 | +변수 LLVK_GLOBAL = 5 // @전역변수 |
| 37 | +변수 LLVK_LOCAL = 6 // %지역변수 (레지스터) |
| 38 | +변수 LLVK_FUNC = 7 // @함수명 |
| 39 | +변수 LLVK_BLOCK = 8 // 기본블록 레이블 |
| 40 | +변수 LLVK_UNDEF = 9 // undef |
| 41 | +변수 LLVK_POISON = 10 // poison |
| 42 | + |
| 43 | +// ================================================================ |
| 44 | +// LLVM IR 명령코드 (Instruction Opcode) |
| 45 | +// ── 산술/논리 ──────────────────────────────────────────────────── |
| 46 | +// ================================================================ |
| 47 | + |
| 48 | +변수 LLOP_ADD = 0 // add |
| 49 | +변수 LLOP_SUB = 1 // sub |
| 50 | +변수 LLOP_MUL = 2 // mul |
| 51 | +변수 LLOP_SDIV = 3 // sdiv (부호 있는 나눗셈) |
| 52 | +변수 LLOP_UDIV = 4 // udiv (부호 없는 나눗셈) |
| 53 | +변수 LLOP_SREM = 5 // srem (부호 있는 나머지) |
| 54 | +변수 LLOP_UREM = 6 // urem |
| 55 | +변수 LLOP_FADD = 7 // fadd |
| 56 | +변수 LLOP_FSUB = 8 // fsub |
| 57 | +변수 LLOP_FMUL = 9 // fmul |
| 58 | +변수 LLOP_FDIV = 10 // fdiv |
| 59 | +변수 LLOP_FREM = 11 // frem |
| 60 | +변수 LLOP_AND = 12 // and |
| 61 | +변수 LLOP_OR = 13 // or |
| 62 | +변수 LLOP_XOR = 14 // xor |
| 63 | +변수 LLOP_SHL = 15 // shl |
| 64 | +변수 LLOP_LSHR = 16 // lshr |
| 65 | +변수 LLOP_ASHR = 17 // ashr |
| 66 | +변수 LLOP_NEG = 18 // neg (sub 0, x 로 생성) |
| 67 | +변수 LLOP_FNEG = 19 // fneg |
| 68 | + |
| 69 | +// ── 메모리 ──────────────────────────────────────────────────────── |
| 70 | +변수 LLOP_ALLOCA = 20 // alloca |
| 71 | +변수 LLOP_LOAD = 21 // load |
| 72 | +변수 LLOP_STORE = 22 // store |
| 73 | +변수 LLOP_GEP = 23 // getelementptr (inbounds) |
| 74 | +변수 LLOP_MEMCPY = 24 // call llvm.memcpy |
| 75 | +변수 LLOP_MEMSET = 25 // call llvm.memset |
| 76 | + |
| 77 | +// ── 비교 ───────────────────────────────────────────────────────── |
| 78 | +변수 LLOP_ICMP = 30 // icmp |
| 79 | +변수 LLOP_FCMP = 31 // fcmp |
| 80 | + |
| 81 | +// ── 흐름 제어 ──────────────────────────────────────────────────── |
| 82 | +변수 LLOP_BR = 40 // br (무조건) |
| 83 | +변수 LLOP_BR_COND = 41 // br (조건) |
| 84 | +변수 LLOP_SWITCH = 42 // switch |
| 85 | +변수 LLOP_RET = 43 // ret |
| 86 | +변수 LLOP_RET_VOID = 44 // ret void |
| 87 | +변수 LLOP_UNREACHABLE= 45 // unreachable |
| 88 | +변수 LLOP_PHI = 46 // phi |
| 89 | + |
| 90 | +// ── 함수 호출 ──────────────────────────────────────────────────── |
| 91 | +변수 LLOP_CALL = 50 // call |
| 92 | +변수 LLOP_TAIL_CALL = 51 // tail call |
| 93 | +변수 LLOP_INVOKE = 52 // invoke (예외 처리용) |
| 94 | + |
| 95 | +// ── 변환 ───────────────────────────────────────────────────────── |
| 96 | +변수 LLOP_TRUNC = 60 // trunc (정수 축소) |
| 97 | +변수 LLOP_ZEXT = 61 // zext (0 확장) |
| 98 | +변수 LLOP_SEXT = 62 // sext (부호 확장) |
| 99 | +변수 LLOP_FPEXT = 63 // fpext (실수 확장) |
| 100 | +변수 LLOP_FPTRUNC = 64 // fptrunc (실수 축소) |
| 101 | +변수 LLOP_FPTOSI = 65 // fptosi (실수 → 정수) |
| 102 | +변수 LLOP_SITOFP = 66 // sitofp (정수 → 실수) |
| 103 | +변수 LLOP_UITOFP = 67 // uitofp |
| 104 | +변수 LLOP_PTRTOINT = 68 // ptrtoint |
| 105 | +변수 LLOP_INTTOPTR = 69 // inttoptr |
| 106 | +변수 LLOP_BITCAST = 70 // bitcast |
| 107 | +변수 LLOP_SELECT = 71 // select |
| 108 | + |
| 109 | +// ── 기타 ───────────────────────────────────────────────────────── |
| 110 | +변수 LLOP_EXTRACTVAL = 80 // extractvalue |
| 111 | +변수 LLOP_INSERTVAL = 81 // insertvalue |
| 112 | +변수 LLOP_LANDINGPAD = 82 // landingpad |
| 113 | + |
| 114 | +// ================================================================ |
| 115 | +// icmp / fcmp 조건 코드 |
| 116 | +// ================================================================ |
| 117 | + |
| 118 | +// icmp (정수 비교) |
| 119 | +변수 LLCMP_EQ = 0 // eq — 같음 |
| 120 | +변수 LLCMP_NE = 1 // ne — 다름 |
| 121 | +변수 LLCMP_SGT = 2 // sgt — 부호 있는 > |
| 122 | +변수 LLCMP_SGE = 3 // sge — 부호 있는 >= |
| 123 | +변수 LLCMP_SLT = 4 // slt — 부호 있는 < |
| 124 | +변수 LLCMP_SLE = 5 // sle — 부호 있는 <= |
| 125 | +변수 LLCMP_UGT = 6 // ugt — 부호 없는 > |
| 126 | +변수 LLCMP_UGE = 7 // uge — 부호 없는 >= |
| 127 | +변수 LLCMP_ULT = 8 // ult |
| 128 | +변수 LLCMP_ULE = 9 // ule |
| 129 | + |
| 130 | +// fcmp (실수 비교) — ordered (NaN 전파) |
| 131 | +변수 LLCMP_OEQ = 20 // oeq |
| 132 | +변수 LLCMP_ONE = 21 // one |
| 133 | +변수 LLCMP_OGT = 22 // ogt |
| 134 | +변수 LLCMP_OGE = 23 // oge |
| 135 | +변수 LLCMP_OLT = 24 // olt |
| 136 | +변수 LLCMP_OLE = 25 // ole |
| 137 | +변수 LLCMP_ORD = 26 // ord (neither is NaN) |
| 138 | +변수 LLCMP_UNO = 27 // uno (either is NaN) |
| 139 | + |
| 140 | +// ================================================================ |
| 141 | +// 링크 유형 (Linkage) |
| 142 | +// ================================================================ |
| 143 | + |
| 144 | +변수 LLLNK_PRIVATE = 0 // private |
| 145 | +변수 LLLNK_INTERNAL = 1 // internal |
| 146 | +변수 LLLNK_EXTERNAL = 2 // external (기본값 — 외부 선언) |
| 147 | +변수 LLLNK_WEAK = 3 // weak |
| 148 | +변수 LLLNK_LINKONCE = 4 // linkonce |
| 149 | +변수 LLLNK_COMMON = 5 // common |
| 150 | + |
| 151 | +// ================================================================ |
| 152 | +// 호출 규약 (Calling Convention) |
| 153 | +// ================================================================ |
| 154 | + |
| 155 | +변수 LLCC_C = 0 // ccc — 기본 C 호출 규약 |
| 156 | +변수 LLCC_FAST = 8 // fastcc |
| 157 | +변수 LLCC_COLD = 9 // coldcc |
| 158 | +변수 LLCC_WEBKIT = 12 // webkit_jscc |
| 159 | + |
| 160 | +// ================================================================ |
| 161 | +// LLVM IR 컨텍스트 구조 (kc_llvm_ctx.han 에서 초기화) |
| 162 | +// ================================================================ |
| 163 | + |
| 164 | +// 컨텍스트 목록 키 (context["키"]) |
| 165 | +// "모듈명" 문자 — .ll 파일 모듈 이름 |
| 166 | +// "소스파일" 문자 — 원본 .han 파일 경로 |
| 167 | +// "줄" [문자] — 출력 IR 행 버퍼 (배열) |
| 168 | +// "전역목록" [목록] — 전역 변수/상수 선언 목록 |
| 169 | +// "함수목록" [목록] — 함수 정의/선언 목록 |
| 170 | +// "문자열상수맵" 목록 — 문자열 리터럴 → 전역 이름 맵 |
| 171 | +// "임시번호" 정수 — %tmp0, %tmp1 ... 자동 증가 |
| 172 | +// "블록번호" 정수 — label 자동 증가 |
| 173 | +// "문자열번호" 정수 — @.str.0, @.str.1 ... 자동 증가 |
| 174 | +// "오류있음" 논리 |
| 175 | +// "오류메시지" 문자 |
| 176 | + |
| 177 | +// 함수 구조 목록 키 (func["키"]) |
| 178 | +// "이름" 문자 — 함수명 (@이름) |
| 179 | +// "반환타입" 정수 — LLTY_* 상수 |
| 180 | +// "매개변수" [목록] — [{이름, 타입}] |
| 181 | +// "블록목록" [목록] — 기본블록 목록 |
| 182 | +// "현재블록" 정수 — 현재 기본블록 인덱스 |
| 183 | +// "링크" 정수 — LLLNK_* |
| 184 | +// "호출규약" 정수 — LLCC_* |
| 185 | +// "선언만" 논리 — declare (extern) 여부 |
| 186 | + |
| 187 | +// 기본블록 구조 목록 키 (bb["키"]) |
| 188 | +// "레이블" 문자 — 기본블록 이름 |
| 189 | +// "명령목록" [문자] — IR 명령어 문자열 목록 |
| 190 | +// "종료됨" 논리 — 종료 명령어(br/ret) 삽입 여부 |
| 191 | + |
| 192 | +// LLVM IR 값 구조 목록 키 (val["키"]) |
| 193 | +// "종류" 정수 — LLVK_* |
| 194 | +// "타입코드" 정수 — LLTY_* |
| 195 | +// "이름" 문자 — %이름 / @이름 (% @ 포함) |
| 196 | +// "정수값" 정수 — 정수 상수일 때 |
| 197 | +// "실수값" 실수 — 실수 상수일 때 |
| 198 | +// "문자값" 문자 — 문자열 / 이름 문자열 |
| 199 | + |
| 200 | +// ================================================================ |
| 201 | +// 편의 상수 |
| 202 | +// ================================================================ |
| 203 | + |
| 204 | +변수 LLVM_타겟_기본 = "x86_64-pc-linux-gnu" // 기본 타겟 트리플 |
| 205 | +변수 LLVM_데이터레이아웃 = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| 206 | + |
| 207 | +변수 LLVM_KV_태그 = "; [Kcode LLVM IR §LLVM-SH]" // 파일 헤더 태그 |
0 commit comments