3 * ./sparse-llvm hello.c | llc | as -o hello.o
6 #include <llvm-c/Core.h>
7 #include <llvm-c/BitWriter.h>
8 #include <llvm-c/Analysis.h>
9 #include <llvm-c/Target.h>
18 #include "expression.h"
19 #include "linearize.h"
23 LLVMBuilderRef builder
;
28 static LLVMTypeRef
symbol_type(struct symbol
*sym
);
30 static LLVMTypeRef
func_return_type(struct symbol
*sym
)
32 if (sym
->type
== SYM_NODE
)
33 sym
= sym
->ctype
.base_type
;
34 return symbol_type(sym
->ctype
.base_type
);
37 static LLVMTypeRef
sym_func_type(struct symbol
*sym
)
39 int n_arg
= symbol_list_size(sym
->arguments
);
40 LLVMTypeRef
*arg_type
= calloc(n_arg
, sizeof(LLVMTypeRef
));
41 LLVMTypeRef ret_type
= func_return_type(sym
);
45 FOR_EACH_PTR(sym
->arguments
, arg
) {
46 struct symbol
*arg_sym
= arg
->ctype
.base_type
;
48 arg_type
[idx
++] = symbol_type(arg_sym
);
49 } END_FOR_EACH_PTR(arg
);
51 return LLVMFunctionType(ret_type
, arg_type
, n_arg
, sym
->variadic
);
54 static LLVMTypeRef
sym_array_type(struct symbol
*sym
)
56 LLVMTypeRef elem_type
;
57 struct symbol
*base_type
;
59 base_type
= sym
->ctype
.base_type
;
60 /* empty struct is undefined [6.7.2.1(8)] */
61 assert(base_type
->bit_size
> 0);
63 elem_type
= symbol_type(base_type
);
67 return LLVMArrayType(elem_type
, sym
->bit_size
/ base_type
->bit_size
);
70 #define MAX_STRUCT_MEMBERS 64
72 static LLVMTypeRef
sym_struct_type(struct symbol
*sym
)
74 LLVMTypeRef elem_types
[MAX_STRUCT_MEMBERS
];
75 struct symbol
*member
;
80 snprintf(buffer
, sizeof(buffer
), "struct.%s", sym
->ident
? sym
->ident
->name
: "anno");
81 ret
= LLVMStructCreateNamed(LLVMGetGlobalContext(), buffer
);
82 /* set ->aux to avoid recursion */
85 FOR_EACH_PTR(sym
->symbol_list
, member
) {
86 LLVMTypeRef member_type
;
88 assert(nr
< MAX_STRUCT_MEMBERS
);
90 member_type
= symbol_type(member
);
92 elem_types
[nr
++] = member_type
;
93 } END_FOR_EACH_PTR(member
);
95 LLVMStructSetBody(ret
, elem_types
, nr
, 0 /* packed? */);
99 static LLVMTypeRef
sym_union_type(struct symbol
*sym
)
101 LLVMTypeRef elements
;
105 * There's no union support in the LLVM API so we treat unions as
106 * opaque structs. The downside is that we lose type information on the
107 * members but as LLVM doesn't care, neither do we.
109 union_size
= sym
->bit_size
/ 8;
111 elements
= LLVMArrayType(LLVMInt8Type(), union_size
);
113 return LLVMStructType(&elements
, 1, 0 /* packed? */);
116 static LLVMTypeRef
sym_ptr_type(struct symbol
*sym
)
120 /* 'void *' is treated like 'char *' */
121 if (is_void_type(sym
->ctype
.base_type
))
122 type
= LLVMInt8Type();
124 type
= symbol_type(sym
->ctype
.base_type
);
126 return LLVMPointerType(type
, 0);
129 static LLVMTypeRef
sym_basetype_type(struct symbol
*sym
)
131 LLVMTypeRef ret
= NULL
;
133 if (is_float_type(sym
)) {
134 switch (sym
->bit_size
) {
136 ret
= LLVMFloatType();
139 ret
= LLVMDoubleType();
142 ret
= LLVMX86FP80Type();
145 die("invalid bit size %d for type %d", sym
->bit_size
, sym
->type
);
149 switch (sym
->bit_size
) {
151 ret
= LLVMVoidType();
154 ret
= LLVMInt1Type();
157 ret
= LLVMInt8Type();
160 ret
= LLVMInt16Type();
163 ret
= LLVMInt32Type();
166 ret
= LLVMInt64Type();
169 die("invalid bit size %d for type %d", sym
->bit_size
, sym
->type
);
177 static LLVMTypeRef
symbol_type(struct symbol
*sym
)
179 LLVMTypeRef ret
= NULL
;
181 /* don't cache the result for SYM_NODE */
182 if (sym
->type
== SYM_NODE
)
183 return symbol_type(sym
->ctype
.base_type
);
190 ret
= LLVMIntType(sym
->bit_size
);
194 ret
= symbol_type(sym
->ctype
.base_type
);
197 ret
= sym_basetype_type(sym
);
200 ret
= sym_ptr_type(sym
);
203 ret
= sym_union_type(sym
);
206 ret
= sym_struct_type(sym
);
209 ret
= sym_array_type(sym
);
212 ret
= sym_func_type(sym
);
218 /* cache the result */
223 static LLVMTypeRef
insn_symbol_type(struct instruction
*insn
)
226 return symbol_type(insn
->type
);
228 switch (insn
->size
) {
229 case 8: return LLVMInt8Type();
230 case 16: return LLVMInt16Type();
231 case 32: return LLVMInt32Type();
232 case 64: return LLVMInt64Type();
235 die("invalid bit size %d", insn
->size
);
239 return NULL
; /* not reached */
242 static LLVMLinkage
data_linkage(struct symbol
*sym
)
244 if (sym
->ctype
.modifiers
& MOD_STATIC
)
245 return LLVMPrivateLinkage
;
247 return LLVMExternalLinkage
;
250 static LLVMLinkage
function_linkage(struct symbol
*sym
)
252 if (sym
->ctype
.modifiers
& MOD_STATIC
)
253 return LLVMInternalLinkage
;
255 return LLVMExternalLinkage
;
258 #define MAX_PSEUDO_NAME 64
260 static const char *pseudo_name(pseudo_t pseudo
, char *buf
)
262 switch (pseudo
->type
) {
264 snprintf(buf
, MAX_PSEUDO_NAME
, "R%d.", pseudo
->nr
);
267 snprintf(buf
, MAX_PSEUDO_NAME
, "PHI%d.", pseudo
->nr
);
285 static LLVMValueRef
get_sym_value(LLVMModuleRef module
, struct symbol
*sym
)
287 const char *name
= show_ident(sym
->ident
);
288 LLVMTypeRef type
= symbol_type(sym
);
289 LLVMValueRef result
= NULL
;
290 struct expression
*expr
;
292 assert(sym
->bb_target
== NULL
);
294 expr
= sym
->initializer
;
295 if (expr
&& !sym
->ident
) {
296 switch (expr
->type
) {
298 const char *s
= expr
->string
->data
;
299 size_t len
= expr
->string
->length
;
300 LLVMValueRef indices
[] = { LLVMConstInt(LLVMInt64Type(), 0, 0), LLVMConstInt(LLVMInt64Type(), 0, 0) };
303 data
= LLVMAddGlobal(module
, LLVMArrayType(LLVMInt8Type(), len
), ".str");
304 LLVMSetLinkage(data
, LLVMPrivateLinkage
);
305 LLVMSetGlobalConstant(data
, 1);
306 LLVMSetInitializer(data
, LLVMConstString(s
, len
, true));
308 result
= LLVMConstGEP(data
, indices
, ARRAY_SIZE(indices
));
316 if (LLVMGetTypeKind(type
) == LLVMFunctionTypeKind
) {
317 result
= LLVMGetNamedFunction(module
, name
);
319 result
= LLVMAddFunction(module
, name
, type
);
321 result
= LLVMGetNamedGlobal(module
, name
);
323 result
= LLVMAddGlobal(module
, type
, name
);
329 static LLVMValueRef
constant_value(unsigned long long val
, LLVMTypeRef dtype
)
333 switch (LLVMGetTypeKind(dtype
)) {
334 case LLVMPointerTypeKind
:
335 if (val
!= 0) { // for example: ... = (void*) 0x123;
336 LLVMTypeRef itype
= LLVMIntType(bits_in_pointer
);
337 result
= LLVMConstInt(itype
, val
, 1);
338 result
= LLVMConstIntToPtr(result
, dtype
);
340 result
= LLVMConstPointerNull(dtype
);
343 case LLVMIntegerTypeKind
:
344 result
= LLVMConstInt(dtype
, val
, 1);
346 case LLVMArrayTypeKind
:
347 case LLVMStructTypeKind
:
350 result
= LLVMConstNull(dtype
);
358 static LLVMValueRef
val_to_value(unsigned long long val
, struct symbol
*ctype
)
364 dtype
= symbol_type(ctype
);
365 result
= constant_value(val
, dtype
);
368 sparse_error(ctype
->pos
, "no value possible for %s", show_typename(ctype
));
369 return LLVMGetUndef(symbol_type(ctype
));
372 static LLVMValueRef
pseudo_to_value(struct function
*fn
, struct symbol
*ctype
, pseudo_t pseudo
)
374 LLVMValueRef result
= NULL
;
376 switch (pseudo
->type
) {
378 result
= pseudo
->priv
;
381 result
= get_sym_value(fn
->module
, pseudo
->sym
);
384 result
= val_to_value(pseudo
->value
, ctype
);
387 result
= LLVMGetParam(fn
->fn
, pseudo
->nr
- 1);
391 result
= pseudo
->priv
;
397 result
= LLVMGetUndef(symbol_type(ctype
));
406 static LLVMValueRef
pseudo_to_rvalue(struct function
*fn
, struct symbol
*ctype
, pseudo_t pseudo
)
408 LLVMValueRef val
= pseudo_to_value(fn
, ctype
, pseudo
);
409 LLVMTypeRef dtype
= symbol_type(ctype
);
410 char name
[MAX_PSEUDO_NAME
];
412 pseudo_name(pseudo
, name
);
413 return LLVMBuildBitCast(fn
->builder
, val
, dtype
, name
);
416 static LLVMValueRef
value_to_ivalue(struct function
*fn
, struct symbol
*ctype
, LLVMValueRef val
)
418 const char *name
= LLVMGetValueName(val
);
419 LLVMTypeRef dtype
= symbol_type(ctype
);
421 if (LLVMGetTypeKind(LLVMTypeOf(val
)) == LLVMPointerTypeKind
) {
422 LLVMTypeRef dtype
= LLVMIntType(bits_in_pointer
);
423 val
= LLVMBuildPtrToInt(fn
->builder
, val
, dtype
, name
);
425 if (ctype
&& is_int_type(ctype
)) {
426 val
= LLVMBuildIntCast(fn
->builder
, val
, dtype
, name
);
431 static LLVMValueRef
value_to_pvalue(struct function
*fn
, struct symbol
*ctype
, LLVMValueRef val
)
433 const char *name
= LLVMGetValueName(val
);
434 LLVMTypeRef dtype
= symbol_type(ctype
);
436 assert(is_ptr_type(ctype
));
437 switch (LLVMGetTypeKind(LLVMTypeOf(val
))) {
438 case LLVMIntegerTypeKind
:
439 val
= LLVMBuildIntToPtr(fn
->builder
, val
, dtype
, name
);
441 case LLVMPointerTypeKind
:
442 val
= LLVMBuildBitCast(fn
->builder
, val
, dtype
, name
);
450 static LLVMValueRef
adjust_type(struct function
*fn
, struct symbol
*ctype
, LLVMValueRef val
)
452 if (is_int_type(ctype
))
453 return value_to_ivalue(fn
, ctype
, val
);
454 if (is_ptr_type(ctype
))
455 return value_to_pvalue(fn
, ctype
, val
);
460 * Get the LLVMValue corresponding to the pseudo
461 * and force the type corresponding to ctype.
463 static LLVMValueRef
get_operand(struct function
*fn
, struct symbol
*ctype
, pseudo_t pseudo
)
465 LLVMValueRef target
= pseudo_to_value(fn
, ctype
, pseudo
);
466 return adjust_type(fn
, ctype
, target
);
470 * Get the LLVMValue corresponding to the pseudo
471 * and force the type corresponding to ctype but
472 * map all pointers to intptr_t.
474 static LLVMValueRef
get_ioperand(struct function
*fn
, struct symbol
*ctype
, pseudo_t pseudo
)
476 LLVMValueRef target
= pseudo_to_value(fn
, ctype
, pseudo
);
477 return value_to_ivalue(fn
, ctype
, target
);
480 static LLVMValueRef
calc_gep(LLVMBuilderRef builder
, LLVMValueRef base
, LLVMValueRef off
)
482 LLVMTypeRef type
= LLVMTypeOf(base
);
483 unsigned int as
= LLVMGetPointerAddressSpace(type
);
484 LLVMTypeRef bytep
= LLVMPointerType(LLVMInt8Type(), as
);
486 const char *name
= LLVMGetValueName(off
);
488 /* convert base to char* type */
489 base
= LLVMBuildPointerCast(builder
, base
, bytep
, name
);
490 /* addr = base + off */
491 addr
= LLVMBuildInBoundsGEP(builder
, base
, &off
, 1, name
);
492 /* convert back to the actual pointer type */
493 addr
= LLVMBuildPointerCast(builder
, addr
, type
, name
);
497 static LLVMRealPredicate
translate_fop(int opcode
)
499 static const LLVMRealPredicate trans_tbl
[] = {
500 [OP_FCMP_ORD
] = LLVMRealORD
,
501 [OP_FCMP_OEQ
] = LLVMRealOEQ
,
502 [OP_FCMP_ONE
] = LLVMRealONE
,
503 [OP_FCMP_OLE
] = LLVMRealOLE
,
504 [OP_FCMP_OGE
] = LLVMRealOGE
,
505 [OP_FCMP_OLT
] = LLVMRealOLT
,
506 [OP_FCMP_OGT
] = LLVMRealOGT
,
507 [OP_FCMP_UEQ
] = LLVMRealUEQ
,
508 [OP_FCMP_UNE
] = LLVMRealUNE
,
509 [OP_FCMP_ULE
] = LLVMRealULE
,
510 [OP_FCMP_UGE
] = LLVMRealUGE
,
511 [OP_FCMP_ULT
] = LLVMRealULT
,
512 [OP_FCMP_UGT
] = LLVMRealUGT
,
513 [OP_FCMP_UNO
] = LLVMRealUNO
,
516 return trans_tbl
[opcode
];
519 static LLVMIntPredicate
translate_op(int opcode
)
521 static const LLVMIntPredicate trans_tbl
[] = {
522 [OP_SET_EQ
] = LLVMIntEQ
,
523 [OP_SET_NE
] = LLVMIntNE
,
524 [OP_SET_LE
] = LLVMIntSLE
,
525 [OP_SET_GE
] = LLVMIntSGE
,
526 [OP_SET_LT
] = LLVMIntSLT
,
527 [OP_SET_GT
] = LLVMIntSGT
,
528 [OP_SET_B
] = LLVMIntULT
,
529 [OP_SET_A
] = LLVMIntUGT
,
530 [OP_SET_BE
] = LLVMIntULE
,
531 [OP_SET_AE
] = LLVMIntUGE
,
534 return trans_tbl
[opcode
];
537 static void output_op_binary(struct function
*fn
, struct instruction
*insn
)
539 LLVMValueRef lhs
, rhs
, target
;
540 char target_name
[64];
542 lhs
= get_ioperand(fn
, insn
->type
, insn
->src1
);
543 rhs
= get_ioperand(fn
, insn
->type
, insn
->src2
);
545 pseudo_name(insn
->target
, target_name
);
547 switch (insn
->opcode
) {
550 target
= LLVMBuildAdd(fn
->builder
, lhs
, rhs
, target_name
);
553 target
= LLVMBuildSub(fn
->builder
, lhs
, rhs
, target_name
);
556 target
= LLVMBuildMul(fn
->builder
, lhs
, rhs
, target_name
);
559 target
= LLVMBuildUDiv(fn
->builder
, lhs
, rhs
, target_name
);
562 assert(!is_float_type(insn
->type
));
563 target
= LLVMBuildSDiv(fn
->builder
, lhs
, rhs
, target_name
);
566 assert(!is_float_type(insn
->type
));
567 target
= LLVMBuildURem(fn
->builder
, lhs
, rhs
, target_name
);
570 assert(!is_float_type(insn
->type
));
571 target
= LLVMBuildSRem(fn
->builder
, lhs
, rhs
, target_name
);
574 assert(!is_float_type(insn
->type
));
575 target
= LLVMBuildShl(fn
->builder
, lhs
, rhs
, target_name
);
578 assert(!is_float_type(insn
->type
));
579 target
= LLVMBuildLShr(fn
->builder
, lhs
, rhs
, target_name
);
582 assert(!is_float_type(insn
->type
));
583 target
= LLVMBuildAShr(fn
->builder
, lhs
, rhs
, target_name
);
588 target
= LLVMBuildFAdd(fn
->builder
, lhs
, rhs
, target_name
);
591 target
= LLVMBuildFSub(fn
->builder
, lhs
, rhs
, target_name
);
594 target
= LLVMBuildFMul(fn
->builder
, lhs
, rhs
, target_name
);
597 target
= LLVMBuildFDiv(fn
->builder
, lhs
, rhs
, target_name
);
602 assert(!is_float_type(insn
->type
));
603 target
= LLVMBuildAnd(fn
->builder
, lhs
, rhs
, target_name
);
606 assert(!is_float_type(insn
->type
));
607 target
= LLVMBuildOr(fn
->builder
, lhs
, rhs
, target_name
);
610 assert(!is_float_type(insn
->type
));
611 target
= LLVMBuildXor(fn
->builder
, lhs
, rhs
, target_name
);
618 target
= adjust_type(fn
, insn
->type
, target
);
619 insn
->target
->priv
= target
;
622 static void output_op_compare(struct function
*fn
, struct instruction
*insn
)
624 LLVMValueRef lhs
, rhs
, target
;
625 char target_name
[64];
627 lhs
= pseudo_to_value(fn
, NULL
, insn
->src1
);
628 if (insn
->src2
->type
== PSEUDO_VAL
)
629 rhs
= constant_value(insn
->src2
->value
, LLVMTypeOf(lhs
));
631 rhs
= pseudo_to_value(fn
, NULL
, insn
->src2
);
633 rhs
= LLVMGetUndef(symbol_type(insn
->type
));
635 pseudo_name(insn
->target
, target_name
);
637 LLVMTypeRef dst_type
= insn_symbol_type(insn
);
639 switch (LLVMGetTypeKind(LLVMTypeOf(lhs
))) {
640 case LLVMPointerTypeKind
:
641 lhs
= value_to_pvalue(fn
, &ptr_ctype
, lhs
);
642 rhs
= value_to_pvalue(fn
, &ptr_ctype
, rhs
);
645 case LLVMIntegerTypeKind
: {
646 LLVMIntPredicate op
= translate_op(insn
->opcode
);
648 if (LLVMGetTypeKind(LLVMTypeOf(rhs
)) == LLVMPointerTypeKind
) {
649 LLVMTypeRef ltype
= LLVMTypeOf(lhs
);
650 rhs
= LLVMBuildPtrToInt(fn
->builder
, rhs
, ltype
, "");
652 target
= LLVMBuildICmp(fn
->builder
, op
, lhs
, rhs
, target_name
);
655 case LLVMHalfTypeKind
:
656 case LLVMFloatTypeKind
:
657 case LLVMDoubleTypeKind
:
658 case LLVMX86_FP80TypeKind
:
659 case LLVMFP128TypeKind
:
660 case LLVMPPC_FP128TypeKind
: {
661 LLVMRealPredicate op
= translate_fop(insn
->opcode
);
663 target
= LLVMBuildFCmp(fn
->builder
, op
, lhs
, rhs
, target_name
);
670 target
= LLVMBuildZExt(fn
->builder
, target
, dst_type
, target_name
);
672 insn
->target
->priv
= target
;
675 static void output_op_ret(struct function
*fn
, struct instruction
*insn
)
677 pseudo_t pseudo
= insn
->src
;
679 if (pseudo
&& pseudo
!= VOID
) {
680 LLVMValueRef result
= get_operand(fn
, insn
->type
, pseudo
);
681 LLVMBuildRet(fn
->builder
, result
);
683 LLVMBuildRetVoid(fn
->builder
);
686 static LLVMValueRef
calc_memop_addr(struct function
*fn
, struct instruction
*insn
)
688 LLVMTypeRef int_type
, addr_type
;
689 LLVMValueRef src
, off
, addr
;
692 /* int type large enough to hold a pointer */
693 int_type
= LLVMIntType(bits_in_pointer
);
694 off
= LLVMConstInt(int_type
, insn
->offset
, 0);
696 /* convert src to the effective pointer type */
697 src
= pseudo_to_value(fn
, insn
->type
, insn
->src
);
698 as
= LLVMGetPointerAddressSpace(LLVMTypeOf(src
));
699 addr_type
= LLVMPointerType(insn_symbol_type(insn
), as
);
700 src
= LLVMBuildPointerCast(fn
->builder
, src
, addr_type
, LLVMGetValueName(src
));
702 /* addr = src + off */
703 addr
= calc_gep(fn
->builder
, src
, off
);
708 static void output_op_load(struct function
*fn
, struct instruction
*insn
)
710 LLVMValueRef addr
, target
;
711 char name
[MAX_PSEUDO_NAME
];
713 addr
= calc_memop_addr(fn
, insn
);
716 pseudo_name(insn
->target
, name
);
717 target
= LLVMBuildLoad(fn
->builder
, addr
, name
);
719 insn
->target
->priv
= target
;
722 static void output_op_store(struct function
*fn
, struct instruction
*insn
)
724 LLVMValueRef addr
, target_in
;
726 addr
= calc_memop_addr(fn
, insn
);
728 target_in
= pseudo_to_rvalue(fn
, insn
->type
, insn
->target
);
731 LLVMBuildStore(fn
->builder
, target_in
, addr
);
734 static LLVMValueRef
bool_value(struct function
*fn
, LLVMValueRef value
)
736 if (LLVMTypeOf(value
) != LLVMInt1Type())
737 value
= LLVMBuildIsNotNull(fn
->builder
, value
, LLVMGetValueName(value
));
742 static void output_op_cbr(struct function
*fn
, struct instruction
*br
)
744 LLVMValueRef cond
= bool_value(fn
,
745 pseudo_to_value(fn
, NULL
, br
->cond
));
747 LLVMBuildCondBr(fn
->builder
, cond
,
752 static void output_op_br(struct function
*fn
, struct instruction
*br
)
754 LLVMBuildBr(fn
->builder
, br
->bb_true
->priv
);
757 static void output_op_sel(struct function
*fn
, struct instruction
*insn
)
759 LLVMValueRef target
, src1
, src2
, src3
;
760 char name
[MAX_PSEUDO_NAME
];
762 src1
= bool_value(fn
, pseudo_to_value(fn
, NULL
, insn
->src1
));
763 src2
= get_operand(fn
, insn
->type
, insn
->src2
);
764 src3
= get_operand(fn
, insn
->type
, insn
->src3
);
766 pseudo_name(insn
->target
, name
);
767 target
= LLVMBuildSelect(fn
->builder
, src1
, src2
, src3
, name
);
769 insn
->target
->priv
= adjust_type(fn
, insn
->type
, target
);
772 static void output_op_switch(struct function
*fn
, struct instruction
*insn
)
774 LLVMValueRef sw_val
, target
;
775 struct basic_block
*def
= NULL
;
776 struct multijmp
*jmp
;
779 FOR_EACH_PTR(insn
->multijmp_list
, jmp
) {
780 if (jmp
->begin
<= jmp
->end
) {
781 n_jmp
+= (jmp
->end
- jmp
->begin
) + 1;
782 } else /* default case */
784 } END_FOR_EACH_PTR(jmp
);
786 sw_val
= get_ioperand(fn
, insn
->type
, insn
->cond
);
787 target
= LLVMBuildSwitch(fn
->builder
, sw_val
,
788 def
? def
->priv
: NULL
, n_jmp
);
790 FOR_EACH_PTR(insn
->multijmp_list
, jmp
) {
793 for (val
= jmp
->begin
; val
<= jmp
->end
; val
++) {
794 LLVMValueRef Val
= val_to_value(val
, insn
->type
);
795 LLVMAddCase(target
, Val
, jmp
->target
->priv
);
797 } END_FOR_EACH_PTR(jmp
);
800 static void output_op_call(struct function
*fn
, struct instruction
*insn
)
802 LLVMValueRef target
, func
;
803 struct symbol
*ctype
;
809 n_arg
= pseudo_list_size(insn
->arguments
);
810 args
= calloc(n_arg
, sizeof(LLVMValueRef
));
812 PREPARE_PTR_LIST(insn
->fntypes
, ctype
);
813 if (insn
->func
->type
== PSEUDO_REG
|| insn
->func
->type
== PSEUDO_PHI
)
814 func
= get_operand(fn
, ctype
, insn
->func
);
816 func
= pseudo_to_value(fn
, ctype
, insn
->func
);
818 FOR_EACH_PTR(insn
->arguments
, arg
) {
819 NEXT_PTR_LIST(ctype
);
820 args
[i
++] = pseudo_to_rvalue(fn
, ctype
, arg
);
821 } END_FOR_EACH_PTR(arg
);
822 FINISH_PTR_LIST(ctype
);
824 pseudo_name(insn
->target
, name
);
825 target
= LLVMBuildCall(fn
->builder
, func
, args
, n_arg
, name
);
827 insn
->target
->priv
= target
;
830 static void output_op_phisrc(struct function
*fn
, struct instruction
*insn
)
832 insn
->src
->priv
= get_operand(fn
, insn
->type
, insn
->src
);
835 static void output_op_phi(struct function
*fn
, struct instruction
*insn
)
837 LLVMTypeRef dst_type
= insn_symbol_type(insn
);
839 insn
->target
->priv
= LLVMBuildPhi(fn
->builder
, dst_type
, "");
842 static void output_op_ptrcast(struct function
*fn
, struct instruction
*insn
)
844 LLVMValueRef src
, target
;
846 struct symbol
*otype
= insn
->orig_type
;
848 char target_name
[64];
850 src
= get_operand(fn
, otype
, insn
->src
);
851 pseudo_name(insn
->target
, target_name
);
853 dtype
= symbol_type(insn
->type
);
854 switch (insn
->opcode
) {
856 case OP_SEXT
: // FIXME
857 assert(is_int_type(otype
));
858 assert(is_ptr_type(insn
->type
));
862 assert(is_ptr_type(otype
));
863 assert(is_int_type(insn
->type
));
867 case OP_ZEXT
: // FIXME
868 assert(is_ptr_type(otype
));
869 assert(is_ptr_type(insn
->type
));
876 target
= LLVMBuildCast(fn
->builder
, op
, src
, dtype
, target_name
);
877 insn
->target
->priv
= target
;
880 static void output_op_cast(struct function
*fn
, struct instruction
*insn
, LLVMOpcode op
)
882 LLVMValueRef src
, target
;
884 struct symbol
*otype
= insn
->orig_type
;
885 char target_name
[64];
887 if (is_ptr_type(insn
->type
)) // cast to void* is OP_CAST ...
888 return output_op_ptrcast(fn
, insn
);
890 assert(is_int_type(insn
->type
));
892 src
= get_operand(fn
, otype
, insn
->src
);
893 pseudo_name(insn
->target
, target_name
);
895 dtype
= symbol_type(insn
->type
);
896 if (is_ptr_type(otype
)) {
898 } else if (is_float_type(otype
)) {
899 assert(op
== LLVMFPToUI
|| op
== LLVMFPToSI
);
900 } else if (is_int_type(otype
)) {
901 unsigned int width
= otype
->bit_size
;
902 if (insn
->size
< width
)
904 else if (insn
->size
== width
)
910 target
= LLVMBuildCast(fn
->builder
, op
, src
, dtype
, target_name
);
911 insn
->target
->priv
= target
;
914 static void output_op_fpcast(struct function
*fn
, struct instruction
*insn
)
916 LLVMTypeRef dtype
= symbol_type(insn
->type
);
917 LLVMValueRef src
, target
;
918 struct symbol
*otype
= insn
->orig_type
;
921 assert(is_float_type(insn
->type
));
923 pseudo_name(insn
->target
, name
);
924 src
= get_operand(fn
, otype
, insn
->src
);
925 switch (insn
->opcode
) {
927 target
= LLVMBuildFPCast(fn
->builder
, src
, dtype
, name
);
930 target
= LLVMBuildSIToFP(fn
->builder
, src
, dtype
, name
);
933 target
= LLVMBuildUIToFP(fn
->builder
, src
, dtype
, name
);
938 insn
->target
->priv
= target
;
941 static void output_op_label(struct function
*fn
, struct instruction
*insn
)
943 insn
->target
->priv
= LLVMBlockAddress(fn
->fn
, insn
->bb_true
->priv
);
946 static void output_op_setval(struct function
*fn
, struct instruction
*insn
)
948 struct expression
*val
= insn
->val
;
953 target
= LLVMBlockAddress(fn
->fn
, val
->symbol
->bb_target
->priv
);
959 insn
->target
->priv
= target
;
962 static void output_op_setfval(struct function
*fn
, struct instruction
*insn
)
964 LLVMTypeRef dtype
= symbol_type(insn
->type
);
967 target
= LLVMConstReal(dtype
, insn
->fvalue
);
968 insn
->target
->priv
= target
;
971 static void output_insn(struct function
*fn
, struct instruction
*insn
)
973 switch (insn
->opcode
) {
975 output_op_ret(fn
, insn
);
978 output_op_br(fn
, insn
);
981 output_op_cbr(fn
, insn
);
987 output_op_label(fn
, insn
);
990 output_op_setval(fn
, insn
);
993 output_op_setfval(fn
, insn
);
996 output_op_switch(fn
, insn
);
998 case OP_COMPUTEDGOTO
:
1002 output_op_phisrc(fn
, insn
);
1005 output_op_phi(fn
, insn
);
1008 output_op_load(fn
, insn
);
1011 output_op_store(fn
, insn
);
1013 case OP_INLINED_CALL
:
1016 output_op_call(fn
, insn
);
1019 output_op_cast(fn
, insn
, LLVMZExt
);
1022 output_op_cast(fn
, insn
, LLVMSExt
);
1025 output_op_cast(fn
, insn
, LLVMTrunc
);
1028 output_op_cast(fn
, insn
, LLVMFPToUI
);
1031 output_op_cast(fn
, insn
, LLVMFPToSI
);
1033 case OP_UCVTF
: case OP_SCVTF
:
1035 output_op_fpcast(fn
, insn
);
1040 output_op_ptrcast(fn
, insn
);
1042 case OP_BINARY
... OP_BINARY_END
:
1043 output_op_binary(fn
, insn
);
1045 case OP_FPCMP
... OP_BINCMP_END
:
1046 output_op_compare(fn
, insn
);
1049 output_op_sel(fn
, insn
);
1055 LLVMValueRef src
, target
;
1056 char target_name
[64];
1058 src
= pseudo_to_value(fn
, insn
->type
, insn
->src
);
1060 pseudo_name(insn
->target
, target_name
);
1062 target
= LLVMBuildNot(fn
->builder
, src
, target_name
);
1064 insn
->target
->priv
= target
;
1069 LLVMValueRef src
, target
;
1070 char target_name
[64];
1072 src
= pseudo_to_value(fn
, insn
->type
, insn
->src
);
1074 pseudo_name(insn
->target
, target_name
);
1076 if (insn
->opcode
== OP_FNEG
)
1077 target
= LLVMBuildFNeg(fn
->builder
, src
, target_name
);
1079 target
= LLVMBuildNeg(fn
->builder
, src
, target_name
);
1081 insn
->target
->priv
= target
;
1106 static void output_bb(struct function
*fn
, struct basic_block
*bb
)
1108 struct instruction
*insn
;
1110 FOR_EACH_PTR(bb
->insns
, insn
) {
1114 output_insn(fn
, insn
);
1116 END_FOR_EACH_PTR(insn
);
1121 static void output_fn(LLVMModuleRef module
, struct entrypoint
*ep
)
1123 struct symbol
*sym
= ep
->name
;
1124 struct symbol
*base_type
= sym
->ctype
.base_type
;
1125 struct function function
= { .module
= module
};
1126 struct basic_block
*bb
;
1130 function
.fn
= get_sym_value(module
, sym
);
1131 LLVMSetFunctionCallConv(function
.fn
, LLVMCCallConv
);
1132 LLVMSetLinkage(function
.fn
, function_linkage(sym
));
1134 function
.builder
= LLVMCreateBuilder();
1136 /* give a name to each argument */
1137 nr_args
= symbol_list_size(base_type
->arguments
);
1138 for (i
= 0; i
< nr_args
; i
++) {
1139 char name
[MAX_PSEUDO_NAME
];
1142 arg
= LLVMGetParam(function
.fn
, i
);
1143 snprintf(name
, sizeof(name
), "ARG%d.", i
+1);
1144 LLVMSetValueName(arg
, name
);
1147 /* create the BBs */
1148 FOR_EACH_PTR(ep
->bbs
, bb
) {
1150 LLVMBasicBlockRef bbr
;
1153 sprintf(bbname
, "L%d", nr_bb
++);
1154 bbr
= LLVMAppendBasicBlock(function
.fn
, bbname
);
1158 END_FOR_EACH_PTR(bb
);
1160 FOR_EACH_PTR(ep
->bbs
, bb
) {
1161 LLVMPositionBuilderAtEnd(function
.builder
, bb
->priv
);
1163 output_bb(&function
, bb
);
1165 END_FOR_EACH_PTR(bb
);
1167 FOR_EACH_PTR(ep
->bbs
, bb
) { // complete the OP_PHIs
1168 struct instruction
*insn
;
1170 FOR_EACH_PTR(bb
->insns
, insn
) {
1173 if (!insn
->bb
|| insn
->opcode
!= OP_PHI
)
1176 FOR_EACH_PTR(insn
->phi_list
, phi
) {
1177 struct instruction
*phisrc
;
1178 LLVMBasicBlockRef bref
;
1185 bref
= phisrc
->bb
->priv
;
1186 vref
= phisrc
->src
->priv
;
1187 LLVMAddIncoming(insn
->target
->priv
, &vref
, &bref
, 1);
1188 } END_FOR_EACH_PTR(phi
);
1189 } END_FOR_EACH_PTR(insn
);
1190 } END_FOR_EACH_PTR(bb
);
1193 static LLVMValueRef
output_data(LLVMModuleRef module
, struct symbol
*sym
)
1195 struct expression
*initializer
= sym
->initializer
;
1196 LLVMValueRef initial_value
;
1201 switch (initializer
->type
) {
1203 initial_value
= LLVMConstInt(symbol_type(sym
), initializer
->value
, 1);
1206 initial_value
= LLVMConstReal(symbol_type(sym
), initializer
->fvalue
);
1209 struct symbol
*sym
= initializer
->symbol
;
1211 initial_value
= LLVMGetNamedGlobal(module
, show_ident(sym
->ident
));
1213 initial_value
= output_data(module
, sym
);
1217 const char *s
= initializer
->string
->data
;
1218 size_t len
= initializer
->string
->length
;
1220 initial_value
= LLVMConstString(s
, len
, true);
1224 warning(initializer
->pos
, "can't initialize type: %s", show_typename(sym
));
1225 initial_value
= NULL
;
1229 LLVMTypeRef type
= symbol_type(sym
);
1231 initial_value
= LLVMConstNull(type
);
1237 name
= sym
->ident
? show_ident(sym
->ident
) : "" ;
1239 data
= LLVMAddGlobal(module
, LLVMTypeOf(initial_value
), name
);
1241 LLVMSetLinkage(data
, data_linkage(sym
));
1242 if (sym
->ctype
.modifiers
& MOD_CONST
)
1243 LLVMSetGlobalConstant(data
, 1);
1244 if (sym
->ctype
.modifiers
& MOD_TLS
)
1245 LLVMSetThreadLocal(data
, 1);
1246 if (sym
->ctype
.alignment
)
1247 LLVMSetAlignment(data
, sym
->ctype
.alignment
);
1249 if (!(sym
->ctype
.modifiers
& MOD_EXTERN
))
1250 LLVMSetInitializer(data
, initial_value
);
1255 static int is_prototype(struct symbol
*sym
)
1257 if (sym
->type
== SYM_NODE
)
1258 sym
= sym
->ctype
.base_type
;
1259 return sym
&& sym
->type
== SYM_FN
&& !sym
->stmt
;
1262 static int compile(LLVMModuleRef module
, struct symbol_list
*list
)
1266 FOR_EACH_PTR(list
, sym
) {
1267 struct entrypoint
*ep
;
1270 if (is_prototype(sym
)) {
1271 // this will do the LLVMAddFunction() we want
1272 get_sym_value(module
, sym
);
1276 ep
= linearize_symbol(sym
);
1278 output_fn(module
, ep
);
1280 output_data(module
, sym
);
1282 END_FOR_EACH_PTR(sym
);
1287 #ifndef LLVM_DEFAULT_TARGET_TRIPLE
1288 #define LLVM_DEFAULT_TARGET_TRIPLE LLVM_HOSTTRIPLE
1291 #define X86_LINUX_LAYOUT \
1292 "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" \
1293 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-" \
1294 "a0:0:64-f80:32:32-n8:16:32-S128"
1296 #define X86_64_LINUX_LAYOUT \
1297 "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" \
1298 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-" \
1299 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
1301 static void set_target(LLVMModuleRef module
)
1303 char target
[] = LLVM_DEFAULT_TARGET_TRIPLE
;
1304 const char *arch
, *vendor
, *os
, *env
, *layout
= NULL
;
1307 arch
= strtok(target
, "-");
1308 vendor
= strtok(NULL
, "-");
1309 os
= strtok(NULL
, "-");
1310 env
= strtok(NULL
, "-");
1317 if (!strcmp(arch
, "x86_64") && !strcmp(os
, "linux")) {
1319 layout
= X86_64_LINUX_LAYOUT
;
1322 layout
= X86_LINUX_LAYOUT
;
1326 /* unsupported target */
1330 snprintf(triple
, sizeof(triple
), "%s-%s-%s-%s", arch
, vendor
, os
, env
);
1331 LLVMSetTarget(module
, triple
);
1332 LLVMSetDataLayout(module
, layout
);
1335 int main(int argc
, char **argv
)
1337 struct string_list
*filelist
= NULL
;
1338 struct symbol_list
*symlist
;
1339 LLVMModuleRef module
;
1342 symlist
= sparse_initialize(argc
, argv
, &filelist
);
1344 module
= LLVMModuleCreateWithName("sparse");
1347 compile(module
, symlist
);
1349 FOR_EACH_PTR(filelist
, file
) {
1350 symlist
= sparse(file
);
1353 compile(module
, symlist
);
1354 } END_FOR_EACH_PTR(file
);
1356 LLVMVerifyModule(module
, LLVMPrintMessageAction
, NULL
);
1358 LLVMWriteBitcodeToFD(module
, STDOUT_FILENO
, 0, 0);
1360 LLVMDisposeModule(module
);