Esempio n. 1
0
        public void DoublePointerArrayRef_ParseCheck_Expected_Equals()
        {
            LArrayRef arrayRef  = new LArrayRef("arrayRef", new LPointerRef(new LValueRef(LType.Int32Type(), ""), "pointerRef"), 5);
            LArrayRef arrayRef2 = new LArrayRef("arrayRef2", arrayRef, 5);

            Assert.AreEqual("[5 x i32*]", arrayRef.ParseType());
            Assert.AreEqual("[5 x [5 x i32*]]", arrayRef2.ParseType());
        }
Esempio n. 2
0
        public void SimpleFunctionType_ArrayAsReturnVal_Expected_Exception() {
            var returnVal = new LArrayRef("", new LValueRef(LType.F32Type(), ""), 5);
            LFunctionType fnType;

            Assert.Throws<Exception>(() =>
                fnType = new LFunctionType(returnVal)
            );
        }
Esempio n. 3
0
        public void PointerArrayRef_Expected_NoException()
        {
            LPointerRef pointerRef = new LPointerRef(new LValueRef(LType.Int32Type(), ""), "pointerRef");
            LArrayRef   arrayRef;

            Assert.DoesNotThrow(() =>
                                arrayRef = new LArrayRef("arrayRef2", pointerRef, 5)
                                );
        }
Esempio n. 4
0
        public void DoubleArrayRef_Expected_NoException()
        {
            LArrayRef arrayRef = new LArrayRef("arrayRef", new LValueRef(LType.Int32Type(), ""), 5);
            LArrayRef arrayRef2;

            Assert.DoesNotThrow(() =>
                                arrayRef2 = new LArrayRef("arrayRef2", arrayRef, 5)
                                );
        }
Esempio n. 5
0
        static void Main(string[] args)
        {
            string valueIdentifier = "@value";
            string value           = "c\"Hello World!\\00\"";

            var module = new LModule("LLVMHelloWorld");
            var func   = LFunction.Create("@main", new LValueRef(LType.Int32Type(), ""));

            var arrayRef = new LArrayRef(valueIdentifier, new LValueRef(LType.Int8Type(), ""), 13);
            // Create char array constant.
            var global = new LGlobal(arrayRef, value)
            {
                IsConstant = true
            };

            var fnType = new LFunctionType(new LValueRef(LType.Int32Type(), "%printf"), new LPointerRef(new LValueRef(LType.Int8Type(), ""), "%result"))
            {
                HasVararg = true
            };
            var external = new LExternal(fnType, "@printf");

            var result = new LPointerRef(new LValueRef(LType.Int8Type(), ""), "%result");
            var gep    = new LGetelementptr(result, global.GetPointerRef());

            gep.Indexes.Add((LType.Int32Type(), 0));
            gep.Indexes.Add((LType.Int32Type(), 0));

            var call = new LCall(fnType, external.FnIdentifier);

            var ret = new LRet(new LValueRef(LType.Int32Type(), "0"));

            // Create and register entry label
            func.Register(new LLabelType("entry"));
            // Register function and char array constant to module.
            module.Register(global);
            module.Register(func);
            module.Register(external);
            // Register instructions.
            func.Register(gep);
            func.Register(call);
            func.Register(ret);

            Console.WriteLine(module.Parse());
        }
Esempio n. 6
0
 /// <summary>
 /// Returns identifier of reference.
 /// </summary>
 /// <param name="reference"></param>
 /// <returns>identifier</returns>
 public static string GetIdentifierOf(LBaseRef reference)
 {
     if (reference.IsValue())
     {
         LValueRef value = (LValueRef)reference;
         return(value.Identifier !);
     }
     else if (reference.IsPointer())
     {
         LPointerRef pointer = (LPointerRef)reference;
         return(pointer.Identifier);
     }
     else if (reference.IsArray())
     {
         LArrayRef array = (LArrayRef)reference;
         return(array.Identifier);
     }
     else if (reference.IsVector())
     {
         LVectorRef vector = (LVectorRef)reference;
         return(vector.Identifier !);
     }
     throw new Exception("unknown reference.");
 }