add some memory sys calls
parent
12ac9cc980
commit
01da2dc377
19
generic.w
19
generic.w
|
@ -21,7 +21,12 @@ struct MemoryBlock<T>
|
|||
|
||||
Get(index: uint): T
|
||||
{
|
||||
return @bitcast<T>(AddressOf(index));
|
||||
return @dereference<T>(AddressOf(index));
|
||||
}
|
||||
|
||||
Set(index: uint, value: T): void
|
||||
{
|
||||
@memcpy(AddressOf(index), @addr(value), @sizeof<T>());
|
||||
}
|
||||
|
||||
Free(): void
|
||||
|
@ -34,13 +39,19 @@ struct Program {
|
|||
static Main(): int {
|
||||
x: int = 4;
|
||||
y: int = Foo.Func(x);
|
||||
block: MemoryBlock<uint>;
|
||||
block: MemoryBlock<int>;
|
||||
block.capacity = y;
|
||||
block.start = @malloc(y * @sizeof<int>());
|
||||
z: MemoryAddress = block.AddressOf(2);
|
||||
Console.PrintLine("%u", block.Get(0));
|
||||
Console.PrintLine("%p", block.start);
|
||||
Console.PrintLine("%p", z);
|
||||
block.Set(0, 5);
|
||||
block.Set(1, 3);
|
||||
block.Set(2, 9);
|
||||
block.Set(3, 100);
|
||||
Console.PrintLine("%i", block.Get(0));
|
||||
Console.PrintLine("%i", block.Get(1));
|
||||
Console.PrintLine("%i", block.Get(2));
|
||||
Console.PrintLine("%i", block.Get(3));
|
||||
block.Free();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1474,6 +1474,39 @@ static LLVMValueRef CompileSystemCallExpression(
|
|||
|
||||
return LLVMSizeOf(ResolveType(ConcretizeType(typeTag)));
|
||||
}
|
||||
else if (
|
||||
strcmp(
|
||||
systemCallExpression->systemCall.identifier->identifier.name,
|
||||
"addr") == 0)
|
||||
{
|
||||
return LLVMBuildPtrToInt(
|
||||
builder,
|
||||
FindVariablePointer(
|
||||
systemCallExpression->systemCall.argumentSequence
|
||||
->functionArgumentSequence.sequence[0]
|
||||
->identifier.name),
|
||||
LLVMInt64Type(),
|
||||
"addrResult");
|
||||
}
|
||||
else if (
|
||||
strcmp(
|
||||
systemCallExpression->systemCall.identifier->identifier.name,
|
||||
"dereference") == 0)
|
||||
{
|
||||
TypeTag *typeTag = ConcretizeType(
|
||||
systemCallExpression->systemCall.genericArguments
|
||||
->genericArguments.arguments[0]
|
||||
->type.typeNode->typeTag);
|
||||
|
||||
return LLVMBuildLoad(
|
||||
builder,
|
||||
LLVMBuildIntToPtr(
|
||||
builder,
|
||||
args[0],
|
||||
LLVMPointerType(ResolveType(typeTag), 0),
|
||||
"deref_ptr"),
|
||||
"deref");
|
||||
}
|
||||
else if (
|
||||
strcmp(
|
||||
systemCallExpression->systemCall.identifier->identifier.name,
|
||||
|
@ -1484,12 +1517,7 @@ static LLVMValueRef CompileSystemCallExpression(
|
|||
->genericArguments.arguments[0]
|
||||
->type.typeNode->typeTag);
|
||||
|
||||
LLVMValueRef expression = CompileExpression(
|
||||
structTypeDeclaration,
|
||||
selfParam,
|
||||
builder,
|
||||
systemCallExpression->systemCall.argumentSequence
|
||||
->functionArgumentSequence.sequence[0]);
|
||||
LLVMValueRef expression = args[0];
|
||||
|
||||
return LLVMBuildBitCast(
|
||||
builder,
|
||||
|
@ -2301,6 +2329,35 @@ static void RegisterLibraryFunctions(
|
|||
|
||||
AddSystemFunction("free", freeFunctionType, freeFunction);
|
||||
|
||||
LLVMTypeRef memcpyParams[3];
|
||||
memcpyParams[0] = LLVMInt64Type();
|
||||
memcpyParams[1] = LLVMInt64Type();
|
||||
memcpyParams[2] = LLVMInt64Type();
|
||||
LLVMTypeRef memcpyFunctionType =
|
||||
LLVMFunctionType(LLVMVoidType(), memcpyParams, 3, 0);
|
||||
LLVMValueRef memcpyFunction =
|
||||
LLVMAddFunction(module, "memcopy", memcpyFunctionType);
|
||||
|
||||
LLVMBasicBlockRef memcpyEntry =
|
||||
LLVMAppendBasicBlock(memcpyFunction, "entry");
|
||||
LLVMPositionBuilderAtEnd(builder, memcpyEntry);
|
||||
LLVMValueRef dest = LLVMBuildIntToPtr(
|
||||
builder,
|
||||
LLVMGetParam(memcpyFunction, 0),
|
||||
LLVMPointerType(LLVMInt64Type(), 0),
|
||||
"dest");
|
||||
LLVMValueRef src = LLVMBuildIntToPtr(
|
||||
builder,
|
||||
LLVMGetParam(memcpyFunction, 1),
|
||||
LLVMPointerType(LLVMInt64Type(), 0),
|
||||
"src");
|
||||
|
||||
LLVMBuildMemCpy(builder, dest, 8, src, 8, LLVMGetParam(memcpyFunction, 2));
|
||||
|
||||
LLVMBuildRetVoid(builder);
|
||||
|
||||
AddSystemFunction("memcpy", memcpyFunctionType, memcpyFunction);
|
||||
|
||||
LLVMDisposeBuilder(builder);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue