diff options
Diffstat (limited to 'src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs')
-rw-r--r-- | src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs | 65 |
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>(); |