Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs')
-rw-r--r--src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs65
1 files changed, 59 insertions, 6 deletions
diff --git a/src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs b/src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs
index 8808a2e02..f89f1ce97 100644
--- a/src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs
+++ b/src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs
@@ -144,6 +144,8 @@ namespace ILCompiler.DependencyAnalysis
// this is the llvm instance.
public LLVMModuleRef Module { get; }
+ public LLVMDIBuilderRef DIBuilder { get; }
+
// This is used to build mangled names
private Utf8StringBuilder _sb = new Utf8StringBuilder();
@@ -181,6 +183,9 @@ namespace ILCompiler.DependencyAnalysis
}
EmitNativeMain();
+
+ EmitDebugMetadata();
+
LLVM.WriteBitcodeToFile(Module, _objectFilePath);
#if DEBUG
LLVM.PrintModuleToFile(Module, Path.ChangeExtension(_objectFilePath, ".txt"), out string unused2);
@@ -190,6 +195,25 @@ namespace ILCompiler.DependencyAnalysis
//throw new NotImplementedException(); // This function isn't complete
}
+ private void EmitDebugMetadata()
+ {
+ var dwarfVersion = LLVM.MDNode(new[]
+ {
+ LLVM.ConstInt(LLVM.Int32Type(), 2, false),
+ LLVM.MDString("Dwarf Version", 13),
+ LLVM.ConstInt(LLVM.Int32Type(), 4, false)
+ });
+ var dwarfSchemaVersion = LLVM.MDNode(new[]
+ {
+ LLVM.ConstInt(LLVM.Int32Type(), 2, false),
+ LLVM.MDString("Debug Info Version", 18),
+ LLVM.ConstInt(LLVM.Int32Type(), 3, false)
+ });
+ LLVM.AddNamedMetadataOperand(Module, "llvm.module.flags", dwarfVersion);
+ LLVM.AddNamedMetadataOperand(Module, "llvm.module.flags", dwarfSchemaVersion);
+ LLVM.DIBuilderFinalize(DIBuilder);
+ }
+
public static LLVMValueRef GetConstZeroArray(int length)
{
var int8Type = LLVM.Int8Type();
@@ -225,6 +249,19 @@ namespace ILCompiler.DependencyAnalysis
throw new NotImplementedException();
}
+ private void EmitReadyToRunHeaderCallback()
+ {
+ LLVMTypeRef intPtr = LLVM.PointerType(LLVM.Int32Type(), 0);
+ LLVMTypeRef intPtrPtr = LLVM.PointerType(intPtr, 0);
+ var callback = LLVM.AddFunction(Module, "RtRHeaderWrapper", LLVM.FunctionType(intPtrPtr, new LLVMTypeRef[0], false));
+ var builder = LLVM.CreateBuilder();
+ var block = LLVM.AppendBasicBlock(callback, "Block");
+ LLVM.PositionBuilderAtEnd(builder, block);
+
+ LLVMValueRef rtrHeaderPtr = GetSymbolValuePointer(Module, _nodeFactory.ReadyToRunHeader, _nodeFactory.NameMangler, false);
+ LLVMValueRef castRtrHeaderPtr = LLVM.BuildPointerCast(builder, rtrHeaderPtr, intPtrPtr, "castRtrHeaderPtr");
+ LLVM.BuildRet(builder, castRtrHeaderPtr);
+ }
private void EmitNativeMain()
{
@@ -243,20 +280,32 @@ namespace ILCompiler.DependencyAnalysis
LLVMTypeRef reversePInvokeFrameType = LLVM.StructType(new LLVMTypeRef[] { LLVM.PointerType(LLVM.Int8Type(), 0), LLVM.PointerType(LLVM.Int8Type(), 0) }, false);
LLVMValueRef reversePinvokeFrame = LLVM.BuildAlloca(builder, reversePInvokeFrameType, "ReversePInvokeFrame");
- LLVMValueRef RhpReversePInvoke2 = LLVM.AddFunction(Module, "RhpReversePInvoke2", LLVM.FunctionType(LLVM.VoidType(), new LLVMTypeRef[] { LLVM.PointerType(reversePInvokeFrameType, 0) }, false));
+ LLVMValueRef RhpReversePInvoke2 = LLVM.GetNamedFunction(Module, "RhpReversePInvoke2");
+
+ if (RhpReversePInvoke2.Pointer == IntPtr.Zero)
+ {
+ RhpReversePInvoke2 = LLVM.AddFunction(Module, "RhpReversePInvoke2", LLVM.FunctionType(LLVM.VoidType(), new LLVMTypeRef[] { LLVM.PointerType(reversePInvokeFrameType, 0) }, false));
+ }
+
LLVM.BuildCall(builder, RhpReversePInvoke2, new LLVMValueRef[] { reversePinvokeFrame }, "");
var shadowStack = LLVM.BuildMalloc(builder, LLVM.ArrayType(LLVM.Int8Type(), 1000000), String.Empty);
var castShadowStack = LLVM.BuildPointerCast(builder, shadowStack, LLVM.PointerType(LLVM.Int8Type(), 0), String.Empty);
LLVM.BuildStore(builder, castShadowStack, shadowStackTop);
- LLVM.BuildCall(builder, managedMain, new LLVMValueRef[]
+
+ // Pass on main arguments
+ LLVMValueRef argc = LLVM.GetParam(mainFunc, 0);
+ LLVMValueRef argv = LLVM.GetParam(mainFunc, 1);
+
+ LLVMValueRef mainReturn = LLVM.BuildCall(builder, managedMain, new LLVMValueRef[]
{
castShadowStack,
- LLVM.ConstPointerNull(LLVM.PointerType(LLVM.Int8Type(), 0))
+ argc,
+ argv,
},
- String.Empty);
+ "returnValue");
- LLVM.BuildRet(builder, LLVM.ConstInt(LLVM.Int32Type(), 42, LLVMMisc.False));
+ LLVM.BuildRet(builder, mainReturn);
LLVM.SetLinkage(mainFunc, LLVMLinkage.LLVMExternalLinkage);
}
@@ -474,13 +523,15 @@ namespace ILCompiler.DependencyAnalysis
delta = checked(delta + sizeof(int));
}
+ int totalOffset = checked(delta + offsetFromSymbolName);
+
EmitBlob(new byte[this._nodeFactory.Target.PointerSize]);
if (relocType == RelocType.IMAGE_REL_BASED_REL32)
{
return this._nodeFactory.Target.PointerSize;
}
- _currentObjectSymbolRefs.Add(symbolStartOffset, new SymbolRefData(isFunction, realSymbolName, delta));
+ _currentObjectSymbolRefs.Add(symbolStartOffset, new SymbolRefData(isFunction, realSymbolName, totalOffset));
return _nodeFactory.Target.PointerSize;
}
@@ -618,6 +669,7 @@ namespace ILCompiler.DependencyAnalysis
_nodeFactory = factory;
_objectFilePath = objectFilePath;
Module = compilation.Module;
+ DIBuilder = compilation.DIBuilder;
}
public void Dispose()
@@ -699,6 +751,7 @@ namespace ILCompiler.DependencyAnalysis
try
{
+ objectWriter.EmitReadyToRunHeaderCallback();
//ObjectNodeSection managedCodeSection = null;
var listOfOffsets = new List<int>();