blob: 2d4e42cffced38bbf0fa20134680280ef9177b23 [file] [log] [blame]
Peter Collingbournead9841e2014-11-27 00:06:42 +00001//===- println.go - IR generation for print and println -------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements IR generation for the print and println built-in
11// functions.
12//
13//===----------------------------------------------------------------------===//
14
15package irgen
16
17import (
18 "fmt"
19
Peter Collingbourne56109b72015-01-13 20:45:08 +000020 "llvm.org/llgo/third_party/gotools/go/types"
Peter Collingbournead9841e2014-11-27 00:06:42 +000021)
22
23func (fr *frame) printValues(println_ bool, values ...*govalue) {
24 for i, value := range values {
25 llvm_value := value.value
26
27 typ := value.Type().Underlying()
28 if name, isname := typ.(*types.Named); isname {
29 typ = name.Underlying()
30 }
31
32 if println_ && i > 0 {
33 fr.runtime.printSpace.call(fr)
34 }
35 switch typ := typ.(type) {
36 case *types.Basic:
37 switch typ.Kind() {
38 case types.Uint8, types.Uint16, types.Uint32, types.Uintptr, types.Uint, types.Uint64:
39 i64 := fr.llvmtypes.ctx.Int64Type()
40 zext := fr.builder.CreateZExt(llvm_value, i64, "")
41 fr.runtime.printUint64.call(fr, zext)
42
43 case types.Int, types.Int8, types.Int16, types.Int32, types.Int64:
44 i64 := fr.llvmtypes.ctx.Int64Type()
45 sext := fr.builder.CreateSExt(llvm_value, i64, "")
46 fr.runtime.printInt64.call(fr, sext)
47
48 case types.Float32:
49 llvm_value = fr.builder.CreateFPExt(llvm_value, fr.llvmtypes.ctx.DoubleType(), "")
50 fallthrough
51 case types.Float64:
52 fr.runtime.printDouble.call(fr, llvm_value)
53
54 case types.Complex64:
55 llvm_value = fr.convert(value, types.Typ[types.Complex128]).value
56 fallthrough
57 case types.Complex128:
58 fr.runtime.printComplex.call(fr, llvm_value)
59
60 case types.String, types.UntypedString:
61 fr.runtime.printString.call(fr, llvm_value)
62
63 case types.Bool:
64 fr.runtime.printBool.call(fr, llvm_value)
65
66 case types.UnsafePointer:
67 fr.runtime.printPointer.call(fr, llvm_value)
68
69 default:
70 panic(fmt.Sprint("Unhandled Basic Kind: ", typ.Kind))
71 }
72
73 case *types.Interface:
74 if typ.Empty() {
75 fr.runtime.printEmptyInterface.call(fr, llvm_value)
76 } else {
77 fr.runtime.printInterface.call(fr, llvm_value)
78 }
79
80 case *types.Slice:
81 fr.runtime.printSlice.call(fr, llvm_value)
82
83 case *types.Pointer, *types.Map, *types.Chan, *types.Signature:
84 fr.runtime.printPointer.call(fr, llvm_value)
85
86 default:
87 panic(fmt.Sprintf("Unhandled type kind: %s (%T)", typ, typ))
88 }
89 }
90 if println_ {
91 fr.runtime.printNl.call(fr)
92 }
93}