public CILVariableDecl CreateStaticGlobal(SourceInfo si, CILType type, int pointerDepth, string name) { var global = new CILVariableDecl(si, type, pointerDepth, name, true); AddGlobal(global); return(global); }
public CILVariableDecl ToCILVariableDecl(CIntermediateLang cil) { // TODO: Do propery type checking between declared type and inferred/rhs type LllType realType; if (Type != null) { realType = Type.ToLllType(); } else { realType = AssigningValue.TryInferType(cil); if (realType.IsAReference) { // Auto-dereference the type... Type = new AstType(SourceInfo, realType.Name, realType.PointerDepth - 1, 0, false, false); } else { Type = new AstType(SourceInfo, realType.Name, realType.PointerDepth, 0, realType.IsAReference, false); } } var cName = NameGenerator.UniqName("var", Name); var cType = cil.SymTable.LookupType(realType.CName); if (IsFixedArray) { if (AssigningValue != null) { throw new NotImplementedException("Assigning to a fixed size array is not implemented."); } return(new CILFixedArray(SourceInfo, cType, realType.PointerDepth, cName, Type.FixedArraySize)); } // covers the case of declaration and function paramters if (AssigningValue == null) { var decl = new CILVariableDecl(SourceInfo, cType, realType.PointerDepth, cName); return(decl); } var val = AssigningValue.ToCILExpression(cil); var srcTy = AssigningValue.TryInferType(cil); var fixedPtrDepth = srcTy.PointerDepth; if (srcTy.IsAReference && !Type.IsAReference) { --fixedPtrDepth; val = new CILDereference(SourceInfo, val); } return(new CILVariableDecl(SourceInfo, cType, fixedPtrDepth, cName, val)); }
public void CDefine(CIntermediateLang cil) { var lllStruct = LllCompiler.SymTable.LookupStruct(Name); foreach (var m in Members) { lllStruct.AddMember(m); var mType = LllCompiler.SymTable.LookupType(m.Type.TypeName); var cType = cil.SymTable.LookupType(mType.CName); CILVariableDecl member; if (m.IsFixedArray) { member = new CILFixedArray(m.SourceInfo, cType, m.Type.PointerDepth, m.Name, m.Type.FixedArraySize); } else { member = new CILVariableDecl(m.SourceInfo, cType, m.Type.PointerDepth, m.Name); } _cilStruct.AddMember(member); } }
public override CILExpression ToCILExpression(CIntermediateLang cil) { var type = TryInferType(cil).Clone(PointerDepth - 1, false); var @sizeof = new CILSizeof(SourceInfo, string.Format("{0}{1}", type.CName, new string('*', type.PointerDepth))); var size = new CILBinaryOp(SourceInfo, Expression.ToCILExpression(cil), CILBinaryOp.OpType.Mul, @sizeof); var alloc = new CILCall(SourceInfo, new CILIdent(SourceInfo, "malloc"), new List <CILExpression> { size }); var tmpName = NameGenerator.NewTemp(); var tmp = new CILVariableDecl(SourceInfo, cil.SymTable.LookupType(type.CName), PointerDepth, tmpName, alloc); var rewrite = new CILRewriteExpression(SourceInfo, new List <CILNode> { tmp, new CILIdent(SourceInfo, tmp.Name) }); return(rewrite); throw new NotImplementedException("TODO: Implement AstNewArrayOp"); }
public void DeclareLocalVariable(CILVariableDecl variable) { SymTable.DeclareVar(variable); }
public void AddGlobal(CILVariableDecl global) { SymTable.DeclareGlobalVar(global); _globals.Add(global.Name, global); }
public void DeclareGlobalVar(CILVariableDecl variable) { _symTable.Last().Add(variable.Name, variable); }
public void DeclareVar(CILVariableDecl variable) { _symTable.Peek().Add(variable.Name, variable); }