Skip to content

Commit fe8d242

Browse files
committed
llvm: enable all builtin types to provide debug info
1 parent 300c1b8 commit fe8d242

37 files changed

Lines changed: 1376 additions & 615 deletions

common/src/main/kotlin/io/github/tmarsteel/emerge/common/EmergeConstants.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@ import io.github.tmarsteel.emerge.common.EmergeConstants.IterableContract.RANGE_
99
data object EmergeConstants {
1010
data object CoreModule {
1111
val NAME = CanonicalElementName.Package(listOf("emerge", "core"))
12+
val ANY_TYPE_NAME = CanonicalElementName.BaseType(NAME, "Any")
1213
val UNIT_TYPE_NAME = CanonicalElementName.BaseType(NAME, "Unit")
1314
val THROWABLE_TYPE_NAME = CanonicalElementName.BaseType(NAME, "Throwable")
1415
val ERROR_TYPE_NAME = CanonicalElementName.BaseType(NAME, "Error")
1516
val CAST_ERROR_TYPE_NAME = CanonicalElementName.BaseType(NAME, "CastError")
17+
val ARITHMETIC_ERROR_TYPE_NAME = CanonicalElementName.BaseType(NAME, "ArithmeticError")
18+
1619
val BOOLEAN_TYPE_NAME = CanonicalElementName.BaseType(NAME, "Boolean")
1720
val S8_TYPE_NAME = CanonicalElementName.BaseType(NAME, "S8")
1821
val U8_TYPE_NAME = CanonicalElementName.BaseType(NAME, "U8")
@@ -22,10 +25,17 @@ data object EmergeConstants {
2225
val U32_TYPE_NAME = CanonicalElementName.BaseType(NAME, "U32")
2326
val S64_TYPE_NAME = CanonicalElementName.BaseType(NAME, "S64")
2427
val U64_TYPE_NAME = CanonicalElementName.BaseType(NAME, "U64")
28+
val F32_TYPE_NAME = CanonicalElementName.BaseType(NAME, "F32")
29+
val F64_TYPE_NAME = CanonicalElementName.BaseType(NAME, "F64")
2530
val SWORD_TYPE_NAME = CanonicalElementName.BaseType(NAME, "SWord")
2631
val UWORD_TYPE_NAME = CanonicalElementName.BaseType(NAME, "UWord")
2732
}
2833

34+
data object ReflectionModule {
35+
val NAME = CoreModule.NAME + "reflection"
36+
val REFLECTION_BASE_TYPE_TYPE_NAME = CanonicalElementName.BaseType(NAME, "ReflectionBaseType")
37+
}
38+
2939
data object StdModule {
3040
val NAME = CanonicalElementName.Package(listOf("emerge", "std"))
3141
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.github.tmarsteel.emerge.backend.llvm.jna;
2+
3+
public enum DwarfBaseTypeEncoding implements JnaEnum {
4+
ADDRESS,
5+
BOOLEAN,
6+
COMPLEX_FLOAT,
7+
FLOAT,
8+
SIGNED,
9+
SIGNED_CHAR,
10+
UNSIGNED,
11+
UNSIGNED_CHAR,
12+
IMAGINARY_FLOAT,
13+
PACKED_DECIMAL,
14+
NUMERIC_STRING,
15+
EDITED,
16+
SIGNED_FIXED,
17+
UNSIGNED_FIXED,
18+
DECIMAL_FLOAT,
19+
UTF;
20+
}

llvm-backend/src/main/java/io/github/tmarsteel/emerge/backend/llvm/jna/Llvm.java

Lines changed: 117 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ Library.OPTION_TYPE_MAPPER, new LlvmTypeMapper()
6363
/** see Core.h */
6464
public static native @NotNull LlvmTypeRef LLVMIntTypeInContext(@NotNull LlvmContextRef context, @Unsigned int numBits);
6565

66+
/** see Core.h */
67+
public static native @NotNull LlvmTypeRef LLVMFloatTypeInContext(@NotNull LlvmContextRef context);
68+
69+
/** see Core.h */
70+
public static native @NotNull LlvmTypeRef LLVMDoubleTypeInContext(@NotNull LlvmContextRef context);
71+
6672
/** see Core.h */
6773
public static native @NotNull LlvmTypeRef LLVMStructTypeInContext(@NotNull LlvmContextRef context, @NotNull NativePointerArray<LlvmTypeRef> elementTypes, @ArraySizeOf("elementTypes") int elementCount, @LlvmBool int packed);
6874

@@ -211,6 +217,9 @@ public static native void LLVMAddModuleFlag(
211217
/** see Core.h */
212218
public static native void LLVMSetThreadLocalMode(@NotNull LlvmValueRef globalVar, @NotNull LlvmThreadLocalMode mode);
213219

220+
/** see Target.h */
221+
public static native @NotNull LlvmTargetDataRef LLVMGetModuleDataLayout(LlvmModuleRef module);
222+
214223
/** see Target.h */
215224
public static native void LLVMSetModuleDataLayout(@NotNull LlvmModuleRef module, @NotNull LlvmTargetDataRef DL);
216225

@@ -220,6 +229,9 @@ public static native void LLVMAddModuleFlag(
220229
/** see Target.h */
221230
public static native @Unsigned long LLVMOffsetOfElement(LlvmTargetDataRef TD, LlvmTypeRef structTy, @Unsigned int element);
222231

232+
/** see Target.h */
233+
public static native @Unsigned int LLVMABIAlignmentOfType(LlvmTargetDataRef TD, LlvmTypeRef ty);
234+
223235
/** see Core.h */
224236
public static native void LLVMDisposeMessage(@NotNull Pointer message);
225237

@@ -697,5 +709,109 @@ public static native void LLVMAddIncoming(
697709
);
698710

699711
/** see DebugInfo.h */
700-
public static native void LLVMSetSubprogram(@NotNull LlvmValueRef func, @NotNull LlvmMetadataRef subprogram);
712+
public static native void LLVMMetadataReplaceAllUsesWith(LlvmMetadataRef TempTargetMetadata, LlvmMetadataRef Replacement);
713+
714+
/** see DebugInfo.h */
715+
public static native @NotNull LlvmMetadataRef LLVMDIBuilderCreateStructType(
716+
@NotNull LlvmDiBuilderRef builder,
717+
@NotNull LlvmMetadataRef scope,
718+
@NotNull byte[] name,
719+
@NotNull @ArraySizeOf("name") NativeLong nameLen,
720+
@NotNull LlvmMetadataRef file,
721+
@Unsigned int lineNumber,
722+
@Unsigned long sizeInBits,
723+
@Unsigned int alignInBits,
724+
@NotNull NativeI32FlagGroup<LlvmDiFlags> Flags,
725+
LlvmMetadataRef DerivedFrom,
726+
@NotNull NativePointerArray<LlvmMetadataRef> elements,
727+
@Unsigned int NumElements,
728+
@Unsigned int objectiveCRuntimeVersion,
729+
LlvmMetadataRef VTableHolder,
730+
@NotNull byte[] uniqueId,
731+
@NotNull @ArraySizeOf("uniqueId") NativeLong uniqueIdLen
732+
);
733+
734+
/** see DebugInfo.h */
735+
public static native @NotNull LlvmMetadataRef LLVMDIBuilderCreateReplaceableCompositeType(
736+
@NotNull LlvmDiBuilderRef builder,
737+
@Unsigned int tag,
738+
@NotNull byte[] name,
739+
@NotNull @ArraySizeOf("name") NativeLong nameLen,
740+
@NotNull LlvmMetadataRef scope,
741+
@NotNull LlvmMetadataRef file,
742+
@Unsigned int lineNumber,
743+
@Unsigned int objectiveCRuntimeVersion,
744+
@Unsigned long sizeInBits,
745+
@Unsigned int alignInBits,
746+
@NotNull NativeI32FlagGroup<LlvmDiFlags> flags,
747+
@NotNull byte[] uniqueId,
748+
@NotNull @ArraySizeOf("uniqueId") NativeLong uniqueIdLen
749+
);
750+
751+
/** see DebugInfo.h */
752+
public static native @NotNull LlvmMetadataRef LLVMDIBuilderCreatePointerType(
753+
@NotNull LlvmDiBuilderRef builder,
754+
@NotNull LlvmMetadataRef pointeeType,
755+
@Unsigned long sizeInBits,
756+
@Unsigned int alignInBits,
757+
@Unsigned int addressSpace,
758+
@Nullable byte[] name,
759+
@Nullable @ArraySizeOf("name") NativeLong nameLen
760+
);
761+
762+
/** see DebugInfo.h */
763+
public static native @NotNull LlvmMetadataRef LLVMDIBuilderCreateBasicType(
764+
@NotNull LlvmDiBuilderRef builder,
765+
@NotNull byte[] name,
766+
@NotNull @ArraySizeOf("name") NativeLong nameLen,
767+
long sizeInBits,
768+
@NotNull DwarfBaseTypeEncoding encoding,
769+
@NotNull NativeI32FlagGroup<LlvmDiFlags> flags
770+
);
771+
772+
/** see DebugInfo.h */
773+
public static native @NotNull LlvmMetadataRef LLVMDIBuilderCreateMemberType(
774+
@NotNull LlvmDiBuilderRef builder,
775+
@NotNull LlvmMetadataRef scope,
776+
@NotNull byte[] name,
777+
@NotNull @ArraySizeOf("name") NativeLong nameLen,
778+
@NotNull LlvmMetadataRef file,
779+
@Unsigned int lineNumber,
780+
@Unsigned long sizeInBits,
781+
@Unsigned long alignInBits,
782+
@Unsigned long offsetInBits,
783+
@NotNull NativeI32FlagGroup<LlvmDiFlags> Flags,
784+
@NotNull LlvmMetadataRef type
785+
);
786+
787+
public static native @NotNull LlvmMetadataRef LLVMDIBuilderCreateArrayType(
788+
@NotNull LlvmDiBuilderRef builder,
789+
@Unsigned long size,
790+
@Unsigned int alignInBits,
791+
@NotNull LlvmMetadataRef elementType,
792+
@Nullable NativePointerArray<LlvmMetadataRef> subscripts,
793+
@Unsigned int numSubscripts
794+
);
795+
796+
public static native @NotNull LlvmMetadataRef LLVMDIBuilderCreateParameterVariable(
797+
@NotNull LlvmDiBuilderRef builder,
798+
@NotNull LlvmMetadataRef scope,
799+
@NotNull byte[] name,
800+
@NotNull @ArraySizeOf("name") NativeLong nameLen,
801+
@Unsigned int argNo,
802+
@NotNull LlvmMetadataRef file,
803+
@Unsigned int lineNo,
804+
@NotNull LlvmMetadataRef type,
805+
@LlvmBool int alwaysPreserve,
806+
@NotNull NativeI32FlagGroup<LlvmDiFlags> flags
807+
);
808+
809+
/** see DebugInfo.h */
810+
public static native void LLVMSetSubprogram(@NotNull LlvmValueRef func, @Nullable LlvmMetadataRef subprogram);
811+
812+
/** see DebugInfo.h */
813+
public static native @Unsigned long LLVMDITypeGetSizeInBits(LlvmMetadataRef diType);
814+
815+
/** see DebugInfo.h */
816+
public static native @Unsigned int LLVMDITypeGetAlignInBits(LlvmMetadataRef diType);
701817
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.github.tmarsteel.emerge.backend.llvm.jna;
2+
3+
public enum LlvmDiFlags implements NativeI32FlagGroup.FlagValue {
4+
PRIVATE(1),
5+
PROTECTED(2),
6+
PUBLIC(3),
7+
FORWARD_DECLARATION(1 << 2),
8+
APPLE_BLOCK(1 << 3),
9+
VIRTUAL(1 << 5),
10+
ARTIFICIAL(1 << 6),
11+
EXPLICIT(1 << 7),
12+
PROTOTYPED(1 << 8),
13+
OBJECTIVE_C_CLASSCOMPLETE(1 << 9),
14+
OBJECT_POINTER(1 << 10),
15+
VECTOR(1 << 11),
16+
STATIC_MEMBER(1 << 12),
17+
LVALUEREFERENCE(1 << 13),
18+
RVALUEREFERENCE(1 << 14),
19+
SINGLE_INHERITANCE(1 << 16),
20+
MULTIPLE_INHERITANCE(2 << 16),
21+
VIRTUAL_INHERITANCE(3 << 16),
22+
INTRODUCED_VIRTUAL(1 << 18),
23+
BITFIELD(1 << 19),
24+
NORETURN(1 << 20),
25+
TYPE_PASS_BY_VALUE(1 << 22),
26+
TYPE_PASS_BY_REFERENCE(1 << 23),
27+
ENUM_CLASS(1 << 24),
28+
THUNK(1 << 25),
29+
NONTRIVIAL(1 << 26),
30+
BIG_ENDIAN(1 << 27),
31+
LITTLE_ENDIAN(1 << 28),
32+
INDIRECT_VIRTUAL_BASE((1 << 2) | (1 << 5)),
33+
ACCESSIBILITY(PRIVATE.flagValue() | PROTECTED.flagValue() | PUBLIC.flagValue()),
34+
POINTER_TO_MEMBER_REP(SINGLE_INHERITANCE.flagValue() | MULTIPLE_INHERITANCE.flagValue() | VIRTUAL_INHERITANCE.flagValue()),
35+
;
36+
37+
private final int flagValue;
38+
39+
LlvmDiFlags(int flagValue) {
40+
this.flagValue = flagValue;
41+
}
42+
43+
public int flagValue() {
44+
return this.flagValue;
45+
}
46+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package io.github.tmarsteel.emerge.backend.llvm.jna;
22

3-
import com.sun.jna.*;
3+
import com.sun.jna.DefaultTypeMapper;
44

55
public class LlvmTypeMapper extends DefaultTypeMapper {
66
public LlvmTypeMapper() {
77
addTypeConverter(JnaEnum.class, new JnaEnum.TypeConverter());
8+
addTypeConverter(NativeI32FlagGroup.class, new NativeI32FlagGroup.TypeConverter());
89
}
910
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.github.tmarsteel.emerge.backend.llvm.jna;
2+
3+
import com.sun.jna.FromNativeContext;
4+
import com.sun.jna.ToNativeContext;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
/**
8+
* Models a 32-bit flag field, where each possible flag is represented by an enum entry in {@link T}.
9+
* @param <T> the enum type that holds the flag options
10+
*/
11+
public class NativeI32FlagGroup<T extends Enum<T> & NativeI32FlagGroup.FlagValue> {
12+
private int value;
13+
14+
public void set(@NotNull T flag) {
15+
this.value |= flag.flagValue();
16+
}
17+
18+
public void unset(@NotNull T flag) {
19+
this.value &= ~flag.flagValue();
20+
}
21+
22+
public boolean isSet(@NotNull T flag) {
23+
return (this.value & flag.flagValue()) != 0;
24+
}
25+
26+
public void clear() {
27+
this.value = 0;
28+
}
29+
30+
interface FlagValue {
31+
/**
32+
* @return the bit representation of this value. Only one bit should be set.
33+
*/
34+
int flagValue();
35+
}
36+
37+
static class TypeConverter implements com.sun.jna.TypeConverter {
38+
@Override
39+
public Object fromNative(Object o, FromNativeContext fromNativeContext) {
40+
var flagGroup = new NativeI32FlagGroup();
41+
flagGroup.value = (Integer) o;
42+
return flagGroup;
43+
}
44+
45+
@Override
46+
public Class<?> nativeType() {
47+
return int.class;
48+
}
49+
50+
@Override
51+
public Object toNative(Object o, ToNativeContext toNativeContext) {
52+
return ((NativeI32FlagGroup<?>) o).value;
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)