Skip to content

Commit aefce6e

Browse files
authored
Merge pull request #150 from CodaFi/layover
Allow changing the data layout and target triple
2 parents 46df4d3 + 70a1ed9 commit aefce6e

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

Sources/LLVM/Module.swift

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,32 @@ public final class Module: CustomStringConvertible {
8080
self.dataLayout = TargetData(llvm: LLVMGetModuleDataLayout(llvm))
8181
}
8282

83+
/// Obtain the target triple for this module.
84+
var targetTriple: String {
85+
get {
86+
guard let id = LLVMGetTarget(llvm) else { return "" }
87+
return String(cString: id)
88+
}
89+
set { LLVMSetTarget(llvm, newValue) }
90+
}
91+
8392
/// Returns the context associated with this module.
8493
public let context: Context
8594

8695
/// Obtain the data layout for this module.
87-
public var dataLayout: TargetData
96+
public var dataLayout: TargetData {
97+
get { return TargetData(llvm: LLVMGetModuleDataLayout(llvm)) }
98+
set { LLVMSetModuleDataLayout(llvm, newValue.llvm) }
99+
}
100+
101+
/// Returns a string describing the data layout associated with this module.
102+
public var dataLayoutString: String {
103+
get {
104+
guard let id = LLVMGetDataLayoutStr(llvm) else { return "" }
105+
return String(cString: id)
106+
}
107+
set { LLVMSetDataLayout(llvm, newValue) }
108+
}
88109

89110
/// The identifier of this module.
90111
public var name: String {

Tests/LLVMTests/UnitSpec.swift

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,73 @@ class UnitSpec : XCTestCase {
7777
])
7878
}
7979

80+
func testStructLayoutOnMachine() {
81+
let mod = Module(name: "StructLayout")
82+
let aarch64 = try! TargetMachine(triple: "aarch64--", cpu: "", features: "",
83+
optLevel: .none, relocMode: .default, codeModel: .default)
84+
mod.dataLayout = aarch64.dataLayout
85+
XCTAssertEqual(mod.dataLayoutString, "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128")
86+
87+
let packedStruct = StructType(elementTypes: [
88+
IntType.int1,
89+
IntType.int8,
90+
IntType.int1,
91+
PointerType(pointee: IntType.int8),
92+
], isPacked: true, in: Context.global)
93+
let unpackedStruct = StructType(elementTypes: [
94+
IntType.int1,
95+
IntType.int8,
96+
IntType.int1,
97+
PointerType(pointee: IntType.int8),
98+
], isPacked: false, in: Context.global)
99+
100+
let packedLayout64 = mod.dataLayout.layout(of: packedStruct)
101+
XCTAssertEqual(packedLayout64.alignment, Alignment.one)
102+
XCTAssertEqual(packedLayout64.size, Size(11))
103+
XCTAssertEqual(packedLayout64.elementCount, 4)
104+
XCTAssertFalse(packedLayout64.isPadded)
105+
XCTAssertEqual(packedLayout64.memberOffsets, [
106+
Size(0), Size(1), Size(2), Size(3),
107+
])
108+
let unpackedLayout64 = mod.dataLayout.layout(of: unpackedStruct)
109+
XCTAssertEqual(unpackedLayout64.alignment, Alignment(8))
110+
XCTAssertEqual(unpackedLayout64.size, Size(16))
111+
XCTAssertEqual(unpackedLayout64.elementCount, 4)
112+
XCTAssertTrue(unpackedLayout64.isPadded)
113+
XCTAssertEqual(unpackedLayout64.memberOffsets, [
114+
Size(0), Size(1), Size(2), Size(8),
115+
])
116+
117+
let aarch32 = try! TargetMachine(triple: "arm--", cpu: "", features: "",
118+
optLevel: .none, relocMode: .default, codeModel: .default)
119+
mod.dataLayout = aarch32.dataLayout
120+
XCTAssertEqual(mod.dataLayoutString, "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64")
121+
122+
let packedLayout32 = mod.dataLayout.layout(of: packedStruct)
123+
XCTAssertEqual(packedLayout32.alignment, Alignment.one)
124+
XCTAssertEqual(packedLayout32.size, Size(7))
125+
XCTAssertEqual(packedLayout32.elementCount, 4)
126+
XCTAssertFalse(packedLayout32.isPadded)
127+
XCTAssertEqual(packedLayout32.memberOffsets, [
128+
Size(0), Size(1), Size(2), Size(3),
129+
])
130+
let unpackedLayout32 = mod.dataLayout.layout(of: unpackedStruct)
131+
XCTAssertEqual(unpackedLayout32.alignment, Alignment(4))
132+
XCTAssertEqual(unpackedLayout32.size, Size(8))
133+
XCTAssertEqual(unpackedLayout32.elementCount, 4)
134+
XCTAssertTrue(unpackedLayout32.isPadded)
135+
XCTAssertEqual(unpackedLayout32.memberOffsets, [
136+
Size(0), Size(1), Size(2), Size(4),
137+
])
138+
}
139+
80140

81141
#if !os(macOS)
82142
static var allTests = testCase([
83143
("testAlign", testAlign),
84144
("testEmptyStructLayout", testEmptyStructLayout),
85145
("testStructLayout", testStructLayout),
146+
("testStructLayoutOnMachine", testStructLayoutOnMachine),
86147
])
87148
#endif
88149
}

0 commit comments

Comments
 (0)