view dmd2/objfile.h @ 1479:4f7d50c744ed

Rewrite `StructLiteralExp::toElem` to store individual fields instead of generating a constant to fill the entire struct with a single `store`. This is much more efficient at compile time (fixing #320) and vastly reduces the size of the emitted code. Since LLVM no longer needs to keep the data for all fields in "registers" until the store happens, it should also be more efficient at run time in cases where the fields aren't assigned with constants. There's also some code clean-up by removing duplicated logic.
author Frits van Bommel <fvbommel wxs.nl>
date Sat, 06 Jun 2009 20:16:13 +0200
parents 638d16625da2
children
line wrap: on
line source



#ifndef OBJFILE_H
#define OBJFILE_H

#include "root.h"

typedef void *SymHandle;
typedef unsigned SegOffset;

enum ObjFormat
{
	NTCOFF,
	ELF
};

struct ObjFile : File
{
    ObjFile(FileName *);
    ~ObjFile();

    ObjFile *init(ObjFormat);

    void comment(const char *);		// insert comment into object file
    void modulename(const char *);	// set module name
    void library(const char *);		// add default library
    void startaddress(SegHandle seg, SegOffset offset);		// set start address

    // Segments
    enum SegHandle
    {	code = 1,
	data, bss
    };

    SymHandle defineSym(const char *name, SegHandle seg, SegOffset offset);
    SymHandle externSym(const char *name);

    SegOffset write(SegHandle seg, const void *data, unsigned nbytes);
    SegOffset writestring(SegHandle seg, char *string);
    SegOffset write8(SegHandle seg, unsigned b);
    SegOffset write16(SegHandle seg, unsigned w);
    SegOffset write32(SegHandle seg, unsigned long v);
    SegOffset write64(SegHandle seg, unsigned long long v);
    SegOffset fill0(SegHandle seg, unsigned nbytes);
    SegOffset align(SegHandle seg, unsigned size);
    SegOffset writefixup(SegHandle seg, SymHandle sym, unsigned value, int selfrelative);

    // Non-binding hint as to how big seg will grow
    void reserve(SegHandle seg, SegOffset size);

    // Set actual size
    void setSize(SegHandle seg, SegOffset size);

    // Get/set offset for subsequent writes
    void setOffset(SegHandle seg, SegOffset offset);
    SegOffset getOffset(SegHandle seg);

    SegHandle createSeg(const char *name);
};

#endif