runtime: add TypeInfo struct definition
also add runtime as Gradle subproject producing bitcode
This commit is contained in:
@@ -0,0 +1,58 @@
|
|||||||
|
// TODO: consider using some Gradle plugins to build and test
|
||||||
|
|
||||||
|
def srcDir = 'src/main/cpp'
|
||||||
|
def objDir = "$buildDir/bitcode"
|
||||||
|
def outFile = "$buildDir/runtime.bc"
|
||||||
|
|
||||||
|
task compile(type: Exec) {
|
||||||
|
doFirst {
|
||||||
|
new File(objDir).mkdirs()
|
||||||
|
}
|
||||||
|
|
||||||
|
inputs.dir srcDir
|
||||||
|
outputs.dir objDir
|
||||||
|
|
||||||
|
workingDir objDir
|
||||||
|
|
||||||
|
executable "$llvmInstallPath/bin/clang"
|
||||||
|
args '-std=c++11'
|
||||||
|
|
||||||
|
args '-c', '-emit-llvm'
|
||||||
|
|
||||||
|
args fileTree(srcDir).include('**/*.cpp')
|
||||||
|
}
|
||||||
|
|
||||||
|
task build(type: Exec) {
|
||||||
|
dependsOn compile
|
||||||
|
|
||||||
|
inputs.dir objDir
|
||||||
|
outputs.file outFile
|
||||||
|
|
||||||
|
executable "$llvmInstallPath/bin/llvm-link"
|
||||||
|
args '-o', outFile
|
||||||
|
|
||||||
|
doFirst {
|
||||||
|
args fileTree(objDir).include('**/*.bc')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task test {
|
||||||
|
dependsOn build
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
exec {
|
||||||
|
commandLine "$llvmInstallPath/bin/clang", 'src/test/c/main.c', '-c', '-emit-llvm', '-o', "$buildDir/main.bc"
|
||||||
|
}
|
||||||
|
exec {
|
||||||
|
commandLine "$llvmInstallPath/bin/clang++", outFile, "$buildDir/main.bc", '-o', "$buildDir/main"
|
||||||
|
}
|
||||||
|
exec {
|
||||||
|
workingDir buildDir
|
||||||
|
commandLine './main'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task clean << {
|
||||||
|
delete buildDir
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#include <cassert>
|
||||||
|
#include "TypeInfo.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
int lookupField(TypeInfo* info, NameHash nameSignature) {
|
||||||
|
assert(false); // not implemented yet
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
#ifndef RUNTIME_TYPEINFO_H
|
||||||
|
#define RUNTIME_TYPEINFO_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
// All names in system are stored as hashes (or maybe, for debug builds,
|
||||||
|
// as pointers to uniqued C strings containing names?).
|
||||||
|
typedef int64_t NameHash;
|
||||||
|
|
||||||
|
// An element of sorted by hash in-place array representing methods.
|
||||||
|
struct MethodTableRecord {
|
||||||
|
NameHash nameSignature;
|
||||||
|
void* methodEntryPoint;
|
||||||
|
};
|
||||||
|
|
||||||
|
// An element of sorted by hash in-place array representing field offsets.
|
||||||
|
struct FieldTableRecord {
|
||||||
|
NameHash nameSignature;
|
||||||
|
int fieldOffset;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This struct represents runtime type information and by itself is compile time
|
||||||
|
// constant.
|
||||||
|
struct TypeInfo {
|
||||||
|
NameHash name;
|
||||||
|
int size;
|
||||||
|
const TypeInfo* superType;
|
||||||
|
const int* objOffsets;
|
||||||
|
int objOffsetsCount;
|
||||||
|
TypeInfo* const* implementedInterfaces;
|
||||||
|
int implementedInterfacesCount;
|
||||||
|
const MethodTableRecord* methods;
|
||||||
|
int methodsCount;
|
||||||
|
const FieldTableRecord* fields;
|
||||||
|
int fieldsCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //RUNTIME_TYPEINFO_H
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
extern "C" void kotlinNativeMain();
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
kotlinNativeMain();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#include <stddef.h>
|
||||||
|
#include <printf.h>
|
||||||
|
|
||||||
|
void kotlinNativeMain() {
|
||||||
|
// nothing to test yet
|
||||||
|
}
|
||||||
@@ -3,3 +3,4 @@ include ':Interop:StubGenerator'
|
|||||||
include ':Interop:Runtime'
|
include ':Interop:Runtime'
|
||||||
include ':InteropExample'
|
include ':InteropExample'
|
||||||
include ':backend.native'
|
include ':backend.native'
|
||||||
|
include ':runtime'
|
||||||
|
|||||||
Reference in New Issue
Block a user