20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package jdk.internal.foreign.abi;
26
27 import jdk.incubator.foreign.CSupport;
28 import jdk.incubator.foreign.ForeignLinker;
29 import jdk.incubator.foreign.FunctionDescriptor;
30 import jdk.incubator.foreign.GroupLayout;
31 import jdk.incubator.foreign.MemoryAddress;
32 import jdk.incubator.foreign.MemoryHandles;
33 import jdk.incubator.foreign.MemoryLayout;
34 import jdk.incubator.foreign.MemorySegment;
35 import jdk.incubator.foreign.SequenceLayout;
36 import jdk.incubator.foreign.ValueLayout;
37 import jdk.internal.foreign.MemoryAddressImpl;
38 import jdk.internal.foreign.Utils;
39 import jdk.internal.foreign.abi.aarch64.AArch64Linker;
40 import jdk.internal.foreign.abi.x64.sysv.SysVx64Linker;
41 import jdk.internal.foreign.abi.x64.windows.Windowsx64Linker;
42
43 import java.lang.invoke.MethodHandle;
44 import java.lang.invoke.MethodHandles;
45 import java.lang.invoke.MethodType;
46 import java.lang.invoke.VarHandle;
47 import java.util.List;
48 import java.util.function.Consumer;
49 import java.util.stream.IntStream;
50
51 import static java.lang.invoke.MethodHandles.collectArguments;
52 import static java.lang.invoke.MethodHandles.identity;
53 import static java.lang.invoke.MethodHandles.insertArguments;
54 import static java.lang.invoke.MethodHandles.permuteArguments;
55 import static java.lang.invoke.MethodType.methodType;
56 import static jdk.incubator.foreign.CSupport.*;
57
58 public class SharedUtils {
59
256 default -> throw new IllegalStateException("Unknown linker name: " + name);
257 };
258 }
259
260 public static VarHandle vhPrimitiveOrAddress(Class<?> carrier, MemoryLayout layout) {
261 return carrier == MemoryAddress.class
262 ? MemoryHandles.asAddressVarHandle(layout.varHandle(primitiveCarrierForSize(layout.byteSize())))
263 : layout.varHandle(carrier);
264 }
265
266 public static VaList newVaListOfAddress(MemoryAddress ma) {
267 String name = CSupport.getSystemLinker().name();
268 return switch(name) {
269 case Win64.NAME -> Windowsx64Linker.newVaListOfAddress(ma);
270 case SysV.NAME -> SysVx64Linker.newVaListOfAddress(ma);
271 case AArch64.NAME -> throw new UnsupportedOperationException("Not yet implemented for this platform");
272 default -> throw new IllegalStateException("Unknown linker name: " + name);
273 };
274 }
275
276 public static class SimpleVaArg {
277 public final Class<?> carrier;
278 public final MemoryLayout layout;
279 public final Object value;
280
281 public SimpleVaArg(Class<?> carrier, MemoryLayout layout, Object value) {
282 this.carrier = carrier;
283 this.layout = layout;
284 this.value = value;
285 }
286
287 public VarHandle varHandle() {
288 return carrier == MemoryAddress.class
289 ? MemoryHandles.asAddressVarHandle(layout.varHandle(primitiveCarrierForSize(layout.byteSize())))
290 : layout.varHandle(carrier);
291 }
292 }
293 }
|
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package jdk.internal.foreign.abi;
26
27 import jdk.incubator.foreign.CSupport;
28 import jdk.incubator.foreign.ForeignLinker;
29 import jdk.incubator.foreign.FunctionDescriptor;
30 import jdk.incubator.foreign.GroupLayout;
31 import jdk.incubator.foreign.MemoryAddress;
32 import jdk.incubator.foreign.MemoryHandles;
33 import jdk.incubator.foreign.MemoryLayout;
34 import jdk.incubator.foreign.MemorySegment;
35 import jdk.incubator.foreign.SequenceLayout;
36 import jdk.incubator.foreign.ValueLayout;
37 import jdk.internal.foreign.MemoryAddressImpl;
38 import jdk.internal.foreign.Utils;
39 import jdk.internal.foreign.abi.aarch64.AArch64Linker;
40 import jdk.internal.foreign.abi.x64.sysv.SysVVaList;
41 import jdk.internal.foreign.abi.x64.sysv.SysVx64Linker;
42 import jdk.internal.foreign.abi.x64.windows.Windowsx64Linker;
43
44 import java.lang.invoke.MethodHandle;
45 import java.lang.invoke.MethodHandles;
46 import java.lang.invoke.MethodType;
47 import java.lang.invoke.VarHandle;
48 import java.util.List;
49 import java.util.function.Consumer;
50 import java.util.stream.IntStream;
51
52 import static java.lang.invoke.MethodHandles.collectArguments;
53 import static java.lang.invoke.MethodHandles.identity;
54 import static java.lang.invoke.MethodHandles.insertArguments;
55 import static java.lang.invoke.MethodHandles.permuteArguments;
56 import static java.lang.invoke.MethodType.methodType;
57 import static jdk.incubator.foreign.CSupport.*;
58
59 public class SharedUtils {
60
257 default -> throw new IllegalStateException("Unknown linker name: " + name);
258 };
259 }
260
261 public static VarHandle vhPrimitiveOrAddress(Class<?> carrier, MemoryLayout layout) {
262 return carrier == MemoryAddress.class
263 ? MemoryHandles.asAddressVarHandle(layout.varHandle(primitiveCarrierForSize(layout.byteSize())))
264 : layout.varHandle(carrier);
265 }
266
267 public static VaList newVaListOfAddress(MemoryAddress ma) {
268 String name = CSupport.getSystemLinker().name();
269 return switch(name) {
270 case Win64.NAME -> Windowsx64Linker.newVaListOfAddress(ma);
271 case SysV.NAME -> SysVx64Linker.newVaListOfAddress(ma);
272 case AArch64.NAME -> throw new UnsupportedOperationException("Not yet implemented for this platform");
273 default -> throw new IllegalStateException("Unknown linker name: " + name);
274 };
275 }
276
277 public static VaList emptyVaList() {
278 String name = CSupport.getSystemLinker().name();
279 return switch(name) {
280 case Win64.NAME -> Windowsx64Linker.emptyVaList();
281 case SysV.NAME -> SysVx64Linker.emptyVaList();
282 case AArch64.NAME -> throw new UnsupportedOperationException("Not yet implemented for this platform");
283 default -> throw new IllegalStateException("Unknown linker name: " + name);
284 };
285 }
286
287 public static MethodType convertVaListCarriers(MethodType mt, Class<?> carrier) {
288 Class<?>[] params = new Class<?>[mt.parameterCount()];
289 for (int i = 0; i < params.length; i++) {
290 Class<?> pType = mt.parameterType(i);
291 params[i] = ((pType == VaList.class) ? carrier : pType);
292 }
293 return methodType(mt.returnType(), params);
294 }
295
296 public static MethodHandle unboxVaLists(MethodType type, MethodHandle handle, MethodHandle unboxer) {
297 for (int i = 0; i < type.parameterCount(); i++) {
298 if (type.parameterType(i) == VaList.class) {
299 handle = MethodHandles.filterArguments(handle, i, unboxer);
300 }
301 }
302 return handle;
303 }
304
305 public static MethodHandle boxVaLists(MethodHandle handle, MethodHandle boxer) {
306 MethodType type = handle.type();
307 for (int i = 0; i < type.parameterCount(); i++) {
308 if (type.parameterType(i) == VaList.class) {
309 handle = MethodHandles.filterArguments(handle, i, boxer);
310 }
311 }
312 return handle;
313 }
314
315 public static class SimpleVaArg {
316 public final Class<?> carrier;
317 public final MemoryLayout layout;
318 public final Object value;
319
320 public SimpleVaArg(Class<?> carrier, MemoryLayout layout, Object value) {
321 this.carrier = carrier;
322 this.layout = layout;
323 this.value = value;
324 }
325
326 public VarHandle varHandle() {
327 return carrier == MemoryAddress.class
328 ? MemoryHandles.asAddressVarHandle(layout.varHandle(primitiveCarrierForSize(layout.byteSize())))
329 : layout.varHandle(carrier);
330 }
331 }
332
333 public static class EmptyVaList implements CSupport.VaList {
334
335 private final MemoryAddress address;
336
337 public EmptyVaList(MemoryAddress address) {
338 this.address = address;
339 }
340
341 private static UnsupportedOperationException uoe() {
342 return new UnsupportedOperationException("Empty VaList");
343 }
344
345 @Override
346 public int vargAsInt(MemoryLayout layout) {
347 throw uoe();
348 }
349
350 @Override
351 public long vargAsLong(MemoryLayout layout) {
352 throw uoe();
353 }
354
355 @Override
356 public double vargAsDouble(MemoryLayout layout) {
357 throw uoe();
358 }
359
360 @Override
361 public MemoryAddress vargAsAddress(MemoryLayout layout) {
362 throw uoe();
363 }
364
365 @Override
366 public MemorySegment vargAsSegment(MemoryLayout layout) {
367 throw uoe();
368 }
369
370 @Override
371 public void skip(MemoryLayout... layouts) {
372 throw uoe();
373 }
374
375 @Override
376 public boolean isAlive() {
377 return true;
378 }
379
380 @Override
381 public void close() {
382 throw uoe();
383 }
384
385 @Override
386 public VaList copy() {
387 return this;
388 }
389
390 @Override
391 public MemoryAddress address() {
392 return address;
393 }
394 }
395 }
|