(td llvm.TargetData)
| 72 | } |
| 73 | |
| 74 | func (m *Module) validateTargetData(td llvm.TargetData) { |
| 75 | abi := m.target |
| 76 | errs := []string{} |
| 77 | check := func(llvm, gapid interface{}, name string) bool { |
| 78 | if reflect.DeepEqual(llvm, gapid) { |
| 79 | return true |
| 80 | } |
| 81 | errs = append(errs, fmt.Sprintf("%v target mismatch for %v: %v (llvm) != %v (gapid)", name, abi.Name, llvm, gapid)) |
| 82 | return false |
| 83 | } |
| 84 | checkTD := func(ty Type, dtl *device.DataTypeLayout) { |
| 85 | check(td.TypeStoreSize(ty.llvmTy()), uint64(dtl.Size), ty.String()+"-size") |
| 86 | check(td.ABITypeAlignment(ty.llvmTy()), int(dtl.Alignment), ty.String()+"-align") |
| 87 | } |
| 88 | |
| 89 | layout := abi.MemoryLayout |
| 90 | isLE := td.ByteOrder() == llvm.LittleEndian |
| 91 | check(isLE, layout.Endian == device.LittleEndian, "is-little-endian") |
| 92 | check(td.PointerSize(), int(layout.Pointer.Size), "pointer-size") |
| 93 | |
| 94 | checkTD(m.Types.Pointer(m.Types.Int), layout.Pointer) |
| 95 | checkTD(m.Types.Int, layout.Integer) |
| 96 | checkTD(m.Types.Size, layout.Size) |
| 97 | checkTD(m.Types.Int64, layout.I64) |
| 98 | checkTD(m.Types.Int32, layout.I32) |
| 99 | checkTD(m.Types.Int16, layout.I16) |
| 100 | checkTD(m.Types.Int8, layout.I8) |
| 101 | checkTD(m.Types.Float32, layout.F32) |
| 102 | checkTD(m.Types.Float64, layout.F64) |
| 103 | |
| 104 | for _, s := range m.Types.structs { |
| 105 | if !s.hasBody { |
| 106 | continue |
| 107 | } |
| 108 | if !check(int(td.TypeStoreSize(s.llvm))*8, s.SizeInBits(), fmt.Sprintf("%v-size", s.name)) || |
| 109 | !check(int(td.ABITypeAlignment(s.llvm))*8, s.AlignInBits(), fmt.Sprintf("%v-align", s.name)) { |
| 110 | errs = append(errs, fmt.Sprintf("%v: %v", s.name, s)) |
| 111 | } |
| 112 | for i := range s.Fields() { |
| 113 | llvm := int(td.ElementOffset(s.llvm, i)) * 8 |
| 114 | gapid := s.FieldOffsetInBits(i) |
| 115 | check(llvm, gapid, fmt.Sprintf("%v-field-offset %d", s.name, i)) |
| 116 | } |
| 117 | } |
| 118 | |
| 119 | for _, s := range m.Types.arrays { |
| 120 | check(int(td.TypeStoreSize(s.llvm))*8, s.SizeInBits(), fmt.Sprintf("%v-size", s.name)) |
| 121 | check(int(td.ABITypeAlignment(s.llvm))*8, s.AlignInBits(), fmt.Sprintf("%v-align", s.name)) |
| 122 | } |
| 123 | |
| 124 | if len(errs) > 0 { |
| 125 | panic(fmt.Errorf("%v has ABI mismatches!\n%v", abi.Name, strings.Join(errs, "\n"))) |
| 126 | } |
| 127 | } |
| 128 | |
| 129 | // Optimize optimizes the module. |
| 130 | func (m *Module) Optimize() { |
no test coverage detected