aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-11-06 22:41:12 -0500
committerAndrew Kelley <superjoe30@gmail.com>2017-11-06 22:41:12 -0500
commit3a600297ca3f99ee57630c44900eec1fe7c92804 (patch)
tree9642e53df266077c0ee76c1a045366f8f805fe95 /src/codegen.cpp
parent4a82c2d124881512548254f5cdff3009b2f424df (diff)
parent634e8713c394bacfe080d03256d1dd4f9a43dd8c (diff)
downloadzig-3a600297ca3f99ee57630c44900eec1fe7c92804.tar.gz
zig-3a600297ca3f99ee57630c44900eec1fe7c92804.zip
Merge remote-tracking branch 'origin/master' into llvm6
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp78
1 files changed, 67 insertions, 11 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 4852846af0..976b20405e 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -189,6 +189,10 @@ void codegen_set_is_test(CodeGen *g, bool is_test_build) {
g->is_test_build = is_test_build;
}
+void codegen_set_emit_file_type(CodeGen *g, EmitFileType emit_file_type) {
+ g->emit_file_type = emit_file_type;
+}
+
void codegen_set_is_static(CodeGen *g, bool is_static) {
g->is_static = is_static;
}
@@ -3380,6 +3384,8 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable,
case IrInstructionIdEmbedFile:
case IrInstructionIdIntType:
case IrInstructionIdMemberCount:
+ case IrInstructionIdMemberType:
+ case IrInstructionIdMemberName:
case IrInstructionIdAlignOf:
case IrInstructionIdFnProto:
case IrInstructionIdTestComptime:
@@ -3397,6 +3403,7 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable,
case IrInstructionIdPtrTypeOf:
case IrInstructionIdOpaqueType:
case IrInstructionIdSetAlignStack:
+ case IrInstructionIdArgType:
zig_unreachable();
case IrInstructionIdReturn:
return ir_render_return(g, executable, (IrInstructionReturn *)instruction);
@@ -4493,24 +4500,70 @@ static void do_code_gen(CodeGen *g) {
LLVMVerifyModule(g->module, LLVMAbortProcessAction, &error);
#endif
- codegen_add_time_event(g, "LLVM Emit Object");
+ codegen_add_time_event(g, "LLVM Emit Output");
char *err_msg = nullptr;
Buf *o_basename = buf_create_from_buf(g->root_out_name);
- const char *o_ext = target_o_file_ext(&g->zig_target);
- buf_append_str(o_basename, o_ext);
+
+ switch (g->emit_file_type) {
+ case EmitFileTypeBinary:
+ {
+ const char *o_ext = target_o_file_ext(&g->zig_target);
+ buf_append_str(o_basename, o_ext);
+ break;
+ }
+ case EmitFileTypeAssembly:
+ {
+ const char *asm_ext = target_asm_file_ext(&g->zig_target);
+ buf_append_str(o_basename, asm_ext);
+ break;
+ }
+ case EmitFileTypeLLVMIr:
+ {
+ const char *llvm_ir_ext = target_llvm_ir_file_ext(&g->zig_target);
+ buf_append_str(o_basename, llvm_ir_ext);
+ break;
+ }
+ default:
+ zig_unreachable();
+ }
+
Buf *output_path = buf_alloc();
os_path_join(g->cache_dir, o_basename, output_path);
ensure_cache_dir(g);
- if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),
- LLVMObjectFile, &err_msg, g->build_mode == BuildModeDebug))
- {
- zig_panic("unable to write object file %s: %s", buf_ptr(output_path), err_msg);
- }
- validate_inline_fns(g);
+ switch (g->emit_file_type) {
+ case EmitFileTypeBinary:
+ if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),
+ ZigLLVM_EmitBinary, &err_msg, g->build_mode == BuildModeDebug))
+ {
+ zig_panic("unable to write object file %s: %s", buf_ptr(output_path), err_msg);
+ }
+ validate_inline_fns(g);
+ g->link_objects.append(output_path);
+ break;
+
+ case EmitFileTypeAssembly:
+ if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),
+ ZigLLVM_EmitAssembly, &err_msg, g->build_mode == BuildModeDebug))
+ {
+ zig_panic("unable to write assembly file %s: %s", buf_ptr(output_path), err_msg);
+ }
+ validate_inline_fns(g);
+ break;
+
+ case EmitFileTypeLLVMIr:
+ if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),
+ ZigLLVM_EmitLLVMIr, &err_msg, g->build_mode == BuildModeDebug))
+ {
+ zig_panic("unable to write llvm-ir file %s: %s", buf_ptr(output_path), err_msg);
+ }
+ validate_inline_fns(g);
+ break;
- g->link_objects.append(output_path);
+ default:
+ zig_unreachable();
+ }
}
static const uint8_t int_sizes_in_bits[] = {
@@ -4816,7 +4869,9 @@ static void define_builtin_fns(CodeGen *g) {
create_builtin_fn(g, BuiltinFnIdMaxValue, "maxValue", 1);
create_builtin_fn(g, BuiltinFnIdMinValue, "minValue", 1);
create_builtin_fn(g, BuiltinFnIdMemberCount, "memberCount", 1);
- create_builtin_fn(g, BuiltinFnIdTypeof, "typeOf", 1);
+ create_builtin_fn(g, BuiltinFnIdMemberType, "memberType", 2);
+ create_builtin_fn(g, BuiltinFnIdMemberName, "memberName", 2);
+ create_builtin_fn(g, BuiltinFnIdTypeof, "typeOf", 1); // TODO rename to TypeOf
create_builtin_fn(g, BuiltinFnIdAddWithOverflow, "addWithOverflow", 4);
create_builtin_fn(g, BuiltinFnIdSubWithOverflow, "subWithOverflow", 4);
create_builtin_fn(g, BuiltinFnIdMulWithOverflow, "mulWithOverflow", 4);
@@ -4863,6 +4918,7 @@ static void define_builtin_fns(CodeGen *g) {
create_builtin_fn(g, BuiltinFnIdAlignCast, "alignCast", 2);
create_builtin_fn(g, BuiltinFnIdOpaqueType, "OpaqueType", 0);
create_builtin_fn(g, BuiltinFnIdSetAlignStack, "setAlignStack", 1);
+ create_builtin_fn(g, BuiltinFnIdArgType, "ArgType", 2);
}
static const char *bool_to_str(bool b) {