public void DoneObjectNode() { EmitAlignment(_nodeFactory.Target.PointerSize); Debug.Assert(_nodeFactory.Target.PointerSize == 4); int countOfPointerSizedElements = _currentObjectData.Count / _nodeFactory.Target.PointerSize; ISymbolNode symNode = _currentObjectNode as ISymbolNode; if (symNode == null) { symNode = ((IHasStartSymbol)_currentObjectNode).StartSymbol; } string realName = GetBaseSymbolName(symNode, _nodeFactory.NameMangler, true); var intPtrType = LLVMTypeRef.CreatePointer(LLVMTypeRef.Int32, 0); var arrayglobal = Module.AddGlobalInAddressSpace(LLVMTypeRef.CreateArray(intPtrType, (uint)countOfPointerSizedElements), realName, 0); arrayglobal.Linkage = LLVMLinkage.LLVMExternalLinkage; _dataToFill.Add(new ObjectNodeDataEmission(arrayglobal, _currentObjectData.ToArray(), _currentObjectSymbolRefs)); foreach (var symbolIdInfo in _symbolDefs) { EmitSymbolDef(arrayglobal, symbolIdInfo.Key, symbolIdInfo.Value); } _currentObjectNode = null; _currentObjectSymbolRefs = new Dictionary <int, SymbolRefData>(); _currentObjectData = new ArrayBuilder <byte>(); _symbolDefs.Clear(); }
private void EmitNativeMain(LLVMContextRef context) { LLVMValueRef shadowStackTop = Module.GetNamedGlobal("t_pShadowStackTop"); LLVMBuilderRef builder = context.CreateBuilder(); var mainSignature = LLVMTypeRef.CreateFunction(LLVMTypeRef.Int32, new LLVMTypeRef[] { LLVMTypeRef.Int32, LLVMTypeRef.CreatePointer(LLVMTypeRef.Int8, 0) }, false); var mainFunc = Module.AddFunction("__managed__Main", mainSignature); var mainEntryBlock = mainFunc.AppendBasicBlock("entry"); builder.PositionAtEnd(mainEntryBlock); LLVMValueRef managedMain = Module.GetNamedFunction("StartupCodeMain"); if (managedMain.Handle == IntPtr.Zero) { throw new Exception("Main not found"); } LLVMTypeRef reversePInvokeFrameType = LLVMTypeRef.CreateStruct(new LLVMTypeRef[] { LLVMTypeRef.CreatePointer(LLVMTypeRef.Int8, 0), LLVMTypeRef.CreatePointer(LLVMTypeRef.Int8, 0) }, false); LLVMValueRef reversePinvokeFrame = builder.BuildAlloca(reversePInvokeFrameType, "ReversePInvokeFrame"); LLVMValueRef RhpReversePInvoke2 = Module.GetNamedFunction("RhpReversePInvoke2"); if (RhpReversePInvoke2.Handle == IntPtr.Zero) { RhpReversePInvoke2 = Module.AddFunction("RhpReversePInvoke2", LLVMTypeRef.CreateFunction(LLVMTypeRef.Void, new LLVMTypeRef[] { LLVMTypeRef.CreatePointer(reversePInvokeFrameType, 0) }, false)); } builder.BuildCall(RhpReversePInvoke2, new LLVMValueRef[] { reversePinvokeFrame }, ""); var shadowStack = builder.BuildMalloc(LLVMTypeRef.CreateArray(LLVMTypeRef.Int8, 1000000), String.Empty); var castShadowStack = builder.BuildPointerCast(shadowStack, LLVMTypeRef.CreatePointer(LLVMTypeRef.Int8, 0), String.Empty); builder.BuildStore(castShadowStack, shadowStackTop); var shadowStackBottom = Module.AddGlobal(LLVMTypeRef.CreatePointer(LLVMTypeRef.Int8, 0), "t_pShadowStackBottom"); shadowStackBottom.Linkage = LLVMLinkage.LLVMExternalLinkage; shadowStackBottom.Initializer = LLVMValueRef.CreateConstPointerNull(LLVMTypeRef.CreatePointer(LLVMTypeRef.Int8, 0)); shadowStackBottom.ThreadLocalMode = LLVMThreadLocalMode.LLVMLocalDynamicTLSModel; builder.BuildStore(castShadowStack, shadowStackBottom); // Pass on main arguments LLVMValueRef argc = mainFunc.GetParam(0); LLVMValueRef argv = mainFunc.GetParam(1); LLVMValueRef mainReturn = builder.BuildCall(managedMain, new LLVMValueRef[] { castShadowStack, argc, argv, }, "returnValue"); builder.BuildRet(mainReturn); mainFunc.Linkage = LLVMLinkage.LLVMExternalLinkage; }
public GamaArray(GamaTypeRef elemtype, int size) : base($"{ elemtype.Name }[{ size }]", LLVMTypeRef.CreateArray(elemtype.UnderlyingType, (uint)size)) { ElementType = elemtype; }