Mercurial > projects > ldc
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