コード例 #1
0
ファイル: test.cpp プロジェクト: doniexun/OrangeC
ObjFile *MakeData(ObjFactory &factory)
{
    ObjFile *rv = factory.MakeFile("test.dat");
    std::time_t x = std::time(0);
    rv->SetFileTime(*std::localtime(&x));
    ObjSourceFile *sf = factory.MakeSourceFile("test.dat");
    rv->Add(sf);
    ObjSourceFile *sf1 = factory.MakeSourceFile("q.dat");
    rv->Add(sf1);
    ObjSection *sect = factory.MakeSection("code");
    codeSection = sect;
    rv->Add(sect);
    ObjSymbol *s1 = factory.MakePublicSymbol("public");
    rv->Add(s1);
    ObjSymbol *s1a = factory.MakePublicSymbol("2public");
    s1a->SetBaseType(BuildType(*rv, factory));
    rv->Add(s1a);
    ObjSymbol *s2 = factory.MakeLocalSymbol("local");
    s2->SetBaseType(factory.MakeType(ObjType::eInt));
    rv->Add(s2);
    ObjSymbol *s3 = factory.MakeAutoSymbol("auto");
    s3->SetOffset(factory.MakeExpression(-8));
    rv->Add(s3);
    ObjSymbol *s4 = factory.MakeExternalSymbol("extern");
    rv->Add(s4);
    ObjMemory *mem = factory.MakeData((ObjByte *)"\x44\x22\x33\x11", 4);
    ObjLineNo *l = factory.MakeLineNo(sf, 3);
    mem->Add(factory.MakeDebugTag(l));
    sect->Add(mem);
    mem = factory.MakeData((ObjByte *)"\xaa\xbb\x33", 3);
    mem->Add(factory.MakeDebugTag(s1));
    sect->Add(mem);
    mem = factory.MakeData((ObjByte *)"\xf1\x9a\x33", 3);
    mem->Add(factory.MakeDebugTag(s2));
    l = factory.MakeLineNo(sf1, 4);
    mem->Add(factory.MakeDebugTag(l));
    sect->Add(mem);
    mem = factory.MakeData((ObjByte *)"\x32\x17\x33", 3);
    mem->Add(factory.MakeDebugTag(s3));
    sect->Add(mem);
    ObjExpression *left = factory.MakeExpression(s4);
    ObjExpression *right = factory.MakeExpression(7);
    mem = factory.MakeFixup(factory.MakeExpression(ObjExpression::eAdd, left, right), 4);
    sect->Add(mem);
    mem = factory.MakeData((ObjByte *)"\x55\x44\x33", 3);
    mem->Add(factory.MakeDebugTag(s4));
    mem->Add(factory.MakeDebugTag(s1a));
    sect->Add(mem);
    BuildBrowse(*rv, factory, l);
    
    ObjExportSymbol *es = factory.MakeExportSymbol("export");
    es->SetExternalName("myexport");
    es->SetByOrdinal(false);
    rv->Add(es);
    ObjExportSymbol *es1 = factory.MakeExportSymbol("export1");
    es1->SetOrdinal(500);
    es1->SetByOrdinal(true);
    rv->Add(es1);
    ObjImportSymbol *is = factory.MakeImportSymbol("import");
    is->SetExternalName("myimport");
    is->SetDllName("mydll");
    rv->Add(is);
    ObjImportSymbol *is1 = factory.MakeImportSymbol("import1");
    is1->SetByOrdinal(true);
    is1->SetOrdinal(512);
    is1->SetDllName("mydll");
    rv->Add(is1);
    return rv;
}
コード例 #2
0
ファイル: Section.cpp プロジェクト: bencz/OrangeC
bool Section::MakeData(ObjFactory &factory, AsmFile *fil)
{
    bool rv = true;
    int pc = 0;
    int pos = 0;
    unsigned char buf[1024];
    Fixup f;
    int n;
    ObjSection *sect = objectSection;
    if (sect)
    {
        sect->SetAlignment(align);
        instructionPos = 0;
        while ((n = GetNext(f, buf+pos, sizeof(buf) - pos)) != 0)
        {
            if (n > 0)
            {
                pos += n;
                if (pos == sizeof(buf))
                {
                    ObjMemory *mem = factory.MakeData(buf, pos);
                    sect->Add(mem);
                    pos = 0;
                }
                pc += n;
            }
            else
            {
                if (pos)
                {
                    ObjMemory *mem = factory.MakeData(buf, pos);
                    sect->Add(mem);
                    pos = 0;
                }
                ObjExpression *t;
                try
                {
                    t = ConvertExpression(f.GetExpr(), fil, factory);
                    SwapSectionIntoPlace(t);
                }
                catch (std::runtime_error *e)
                {
                    Errors::IncrementCount();
                    std::cout << "Error " << f.GetFileName().c_str() << "(" << f.GetErrorLine() << "):" << e->what() << std::endl;
                    delete e;
                    t = nullptr;
                    rv = false;
                }
                if (t && f.IsRel())
                {
                    ObjExpression *left = factory.MakeExpression(f.GetRelOffs());
                    t = factory.MakeExpression(ObjExpression::eSub, t, left);
                    left = factory.MakeExpression(ObjExpression::ePC);
                    t = factory.MakeExpression(ObjExpression::eSub, t, left);
                }
                if (t)
                {
                
                    ObjMemory *mem = factory.MakeFixup(t, f.GetSize());
                    if (mem)
                        sect->Add(mem);
                }
                pc += f.GetSize();
            }
        }
        if (pos)
        {
            ObjMemory *mem = factory.MakeData(buf, pos);
            sect->Add(mem);
        }
    }
    return rv;
}