8305201: Improve error message for GroupLayouts that are too large on SysV

Reviewed-by: mcimadamore
This commit is contained in:
Jorn Vernee 2023-05-01 14:12:51 +00:00
parent 67dd841432
commit 7d07d19523
2 changed files with 27 additions and 3 deletions

View File

@ -190,7 +190,13 @@ class TypeClass {
private static List<ArgumentClassImpl>[] groupByEightBytes(GroupLayout group) {
long offset = 0L;
int nEightbytes = (int) Utils.alignUp(group.byteSize(), 8) / 8;
int nEightbytes;
try {
// alignUp can overflow the value, but it's okay since toIntExact still catches it
nEightbytes = Math.toIntExact(Utils.alignUp(group.byteSize(), 8) / 8);
} catch (ArithmeticException e) {
throw new IllegalArgumentException("GroupLayout is too large: " + group, e);
}
@SuppressWarnings({"unchecked", "rawtypes"})
List<ArgumentClassImpl>[] groups = new List[nEightbytes];
for (MemoryLayout l : group.memberLayouts()) {

View File

@ -25,6 +25,7 @@
/*
* @test
* @enablePreview
* @modules java.base/jdk.internal.foreign
* @requires ((os.arch == "amd64" | os.arch == "x86_64") & sun.arch.data.model == "64") | os.arch == "aarch64" | os.arch == "riscv64"
* @run testng/othervm --enable-native-access=ALL-UNNAMED TestIllegalLink
*/
@ -39,7 +40,11 @@ import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import jdk.internal.foreign.CABI;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@ -48,6 +53,8 @@ import static org.testng.Assert.fail;
public class TestIllegalLink extends NativeTestHelper {
private static final boolean IS_SYSV = CABI.current() == CABI.SYS_V;
private static final MemorySegment DUMMY_TARGET = MemorySegment.ofAddress(1);
private static final MethodHandle DUMMY_TARGET_MH = MethodHandles.empty(MethodType.methodType(void.class));
private static final Linker ABI = Linker.nativeLinker();
@ -101,7 +108,7 @@ public class TestIllegalLink extends NativeTestHelper {
@DataProvider
public static Object[][] types() {
return new Object[][]{
List<Object[]> cases = new ArrayList<>(Arrays.asList(new Object[][]{
{
FunctionDescriptor.of(MemoryLayout.paddingLayout(64)),
"Unsupported layout: x64"
@ -185,7 +192,18 @@ public class TestIllegalLink extends NativeTestHelper {
MemoryLayout.paddingLayout(32))), // too much trailing padding
"has unexpected size"
},
};
}));
if (IS_SYSV) {
cases.add(new Object[] {
FunctionDescriptor.ofVoid(MemoryLayout.structLayout(
MemoryLayout.sequenceLayout(
C_INT
))),
"GroupLayout is too large"
});
}
return cases.toArray(Object[][]::new);
}
private static ByteOrder nonNativeOrder() {