-/*
- * Compiler.h
- *
- * Created on: Sep 11, 2012
- * Author: holy
- */
-
#ifndef LOADER_COMPILER_H_
#define LOADER_COMPILER_H_
+#include "Interpreter.h"
+#include "ObjectFile.h"
+#include "TypeDescription.h"
+
#include <iosfwd>
#include <map>
#include <memory>
namespace loader {
-class Interpreter;
-
class Compiler {
public:
Compiler &operator =(const Compiler &);
public:
- void Write(std::ostream &);
-
- struct Export {
- int nameOffset;
- int typeId;
- int dataOffset;
- };
-
- struct External {
- int nameOffset;
- int referenceOffset;
- int inlined;
- };
-
- struct ImageProperties {
- Uint32 flags;
- int width;
- int height;
- int depth;
- Uint32 rmask;
- Uint32 gmask;
- Uint32 bmask;
- Uint32 amask;
- };
+ void Write(std::iostream &);
private:
+ void ReserveHeader(std::ostream &);
+ void WriteObjects(std::ostream &);
+ void WriteOwnStrings(std::ostream &);
+ void WriteArrays(std::ostream &);
void WriteHeader(std::ostream &);
void WriteExports(std::ostream &);
void WriteExternals(std::ostream &);
- void WriteExportStrings(std::ostream &);
- void WriteExternalStrings(std::ostream &);
void WriteImages(std::ostream &);
- void WriteObjects(std::ostream &);
- void Write(std::ostream &, const char *data, int amount);
+ void Relocate(std::iostream &);
+ void RelocateArray(char *, int size);
+ void Relocate(unsigned int pos, char *dest, const TypeDescription &);
+
+ void PrepareExport(Export &, const std::string &);
+ void PrepareExternal(External &, const Interpreter::PostponedDefinition &);
+ void PrepareObject(Object &, const TypeDescription &, void *);
+
+ void Write(std::ostream &, const void *data, int amount);
void Pad(std::ostream &, int to);
+ void Fill(std::ostream &, int count, char c = '\0');
static int Remaining(int value, int alignment);
- int ReferenceOffset(int typeId, int objectId, std::ptrdiff_t fieldOffset) const;
- int ObjectOffset(int typeId, int objectId) const;
- int TypeOffset(int typeId) const;
-
private:
const Interpreter &intp;
- int cursor;
-
- int exportsOffset;
- int externalsOffset;
- int externalStringsOffset;
- int exportStringsOffset;
- int imagesOffset;
- int objectsOffset;
+ ObjectFileHeader fileHeader;
- std::map<int, int> objectOffsets;
+ std::map<const void *, unsigned int> addressMap;
+ std::map<unsigned int, void *> images;
};
}
-#endif /* LOADER_COMPILER_H_ */
+#endif