Skip to content

Commit

Permalink
refactor lib for better encapsulation
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterBright committed Apr 18, 2012
1 parent f87c433 commit 70f0e69
Show file tree
Hide file tree
Showing 5 changed files with 212 additions and 89 deletions.
54 changes: 8 additions & 46 deletions src/lib.h
@@ -1,6 +1,6 @@

// Compiler implementation of the D programming language
// Copyright (c) 1999-2008 by Digital Mars
// Copyright (c) 1999-2012 by Digital Mars
// All Rights Reserved
// written by Walter Bright
// http://www.digitalmars.com
Expand All @@ -15,53 +15,15 @@
#pragma once
#endif /* __DMC__ */

struct ObjModule;

struct ObjSymbol
class Library
{
char *name;
ObjModule *om;
};

#include "arraytypes.h"

typedef ArrayBase<ObjModule> ObjModules;
typedef ArrayBase<ObjSymbol> ObjSymbols;

struct Library
{
File *libfile;
ObjModules objmodules; // ObjModule[]
ObjSymbols objsymbols; // ObjSymbol[]

StringTable tab;

Library();
void setFilename(char *dir, char *filename);
void addObject(const char *module_name, void *buf, size_t buflen);
void addLibrary(void *buf, size_t buflen);
void write();

private:
void addSymbol(ObjModule *om, char *name, int pickAny = 0);
void scanObjModule(ObjModule *om);
unsigned short numDictPages(unsigned padding);
int FillDict(unsigned char *bucketsP, unsigned short uNumPages);
void WriteLibToBuffer(OutBuffer *libbuf);
public:
static Library *factory();

void error(const char *format, ...)
{
Loc loc;
if (libfile)
{
loc.filename = libfile->name->toChars();
loc.linnum = 0;
}
va_list ap;
va_start(ap, format);
::verror(loc, format, ap);
va_end(ap);
}
virtual void setFilename(char *dir, char *filename) = 0;
virtual void addObject(const char *module_name, void *buf, size_t buflen) = 0;
virtual void addLibrary(void *buf, size_t buflen) = 0;
virtual void write() = 0;
};

#endif /* DMD_LIB_H */
Expand Down
83 changes: 68 additions & 15 deletions src/libelf.c
@@ -1,6 +1,6 @@

// Compiler implementation of the D programming language
// Copyright (c) 1999-2011 by Digital Mars
// Copyright (c) 1999-2012 by Digital Mars
// All Rights Reserved
// written by Walter Bright
// http://www.digitalmars.com
Expand All @@ -26,7 +26,60 @@

#define LOG 0

Library::Library()
struct ObjModule;

struct ObjSymbol
{
char *name;
ObjModule *om;
};

#include "arraytypes.h"

typedef ArrayBase<ObjModule> ObjModules;
typedef ArrayBase<ObjSymbol> ObjSymbols;

class LibElf : public Library
{
public:
File *libfile;
ObjModules objmodules; // ObjModule[]
ObjSymbols objsymbols; // ObjSymbol[]

StringTable tab;

LibElf();
void setFilename(char *dir, char *filename);
void addObject(const char *module_name, void *buf, size_t buflen);
void addLibrary(void *buf, size_t buflen);
void write();

private:
void addSymbol(ObjModule *om, char *name, int pickAny = 0);
void scanObjModule(ObjModule *om);
void WriteLibToBuffer(OutBuffer *libbuf);

void error(const char *format, ...)
{
Loc loc;
if (libfile)
{
loc.filename = libfile->name->toChars();
loc.linnum = 0;
}
va_list ap;
va_start(ap, format);
::verror(loc, format, ap);
va_end(ap);
}
};

Library *Library::factory()
{
return new LibElf();
}

LibElf::LibElf()
{
libfile = NULL;
tab.init();
Expand All @@ -38,10 +91,10 @@ Library::Library()
* Add default library file name extension.
*/

void Library::setFilename(char *dir, char *filename)
void LibElf::setFilename(char *dir, char *filename)
{
#if LOG
printf("Library::setFilename(dir = '%s', filename = '%s')\n",
printf("LibElf::setFilename(dir = '%s', filename = '%s')\n",
dir ? dir : "", filename ? filename : "");
#endif
char *arg = filename;
Expand All @@ -60,7 +113,7 @@ void Library::setFilename(char *dir, char *filename)
libfile = new File(libfilename);
}

void Library::write()
void LibElf::write()
{
if (global.params.verbose)
printf("library %s\n", libfile->name->toChars());
Expand All @@ -82,7 +135,7 @@ void Library::write()

/*****************************************************************************/

void Library::addLibrary(void *buf, size_t buflen)
void LibElf::addLibrary(void *buf, size_t buflen)
{
addObject(NULL, buf, buflen);
}
Expand Down Expand Up @@ -184,10 +237,10 @@ void OmToHeader(Header *h, ObjModule *om)
h->trailer[1] = '\n';
}

void Library::addSymbol(ObjModule *om, char *name, int pickAny)
void LibElf::addSymbol(ObjModule *om, char *name, int pickAny)
{
#if LOG
printf("Library::addSymbol(%s, %s, %d)\n", om->name, name, pickAny);
printf("LibElf::addSymbol(%s, %s, %d)\n", om->name, name, pickAny);
#endif
StringValue *s = tab.insert(name, strlen(name));
if (!s)
Expand All @@ -213,13 +266,13 @@ void Library::addSymbol(ObjModule *om, char *name, int pickAny)

/************************************
* Scan single object module for dictionary symbols.
* Send those symbols to Library::addSymbol().
* Send those symbols to LibElf::addSymbol().
*/

void Library::scanObjModule(ObjModule *om)
void LibElf::scanObjModule(ObjModule *om)
{
#if LOG
printf("Library::scanObjModule(%s)\n", om->name);
printf("LibElf::scanObjModule(%s)\n", om->name);
#endif
unsigned char *buf = (unsigned char *)om->base;
size_t buflen = om->length;
Expand Down Expand Up @@ -367,12 +420,12 @@ void Library::scanObjModule(ObjModule *om)
* and load the file.
*/

void Library::addObject(const char *module_name, void *buf, size_t buflen)
void LibElf::addObject(const char *module_name, void *buf, size_t buflen)
{
if (!module_name)
module_name = "";
#if LOG
printf("Library::addObject(%s)\n", module_name);
printf("LibElf::addObject(%s)\n", module_name);
#endif
int fromfile = 0;
if (!buf)
Expand Down Expand Up @@ -617,10 +670,10 @@ void Library::addObject(const char *module_name, void *buf, size_t buflen)
* object modules...
*/

void Library::WriteLibToBuffer(OutBuffer *libbuf)
void LibElf::WriteLibToBuffer(OutBuffer *libbuf)
{
#if LOG
printf("Library::WriteLibToBuffer()\n");
printf("LibElf::WriteLibToBuffer()\n");
#endif

/************* Scan Object Modules for Symbols ******************/
Expand Down
81 changes: 67 additions & 14 deletions src/libmach.c
Expand Up @@ -37,7 +37,60 @@

#define LOG 0

Library::Library()
struct ObjModule;

struct ObjSymbol
{
char *name;
ObjModule *om;
};

#include "arraytypes.h"

typedef ArrayBase<ObjModule> ObjModules;
typedef ArrayBase<ObjSymbol> ObjSymbols;

class LibMach : public Library
{
public:
File *libfile;
ObjModules objmodules; // ObjModule[]
ObjSymbols objsymbols; // ObjSymbol[]

StringTable tab;

LibMach();
void setFilename(char *dir, char *filename);
void addObject(const char *module_name, void *buf, size_t buflen);
void addLibrary(void *buf, size_t buflen);
void write();

private:
void addSymbol(ObjModule *om, char *name, int pickAny = 0);
void scanObjModule(ObjModule *om);
void WriteLibToBuffer(OutBuffer *libbuf);

void error(const char *format, ...)
{
Loc loc;
if (libfile)
{
loc.filename = libfile->name->toChars();
loc.linnum = 0;
}
va_list ap;
va_start(ap, format);
::verror(loc, format, ap);
va_end(ap);
}
};

Library *Library::factory()
{
return new LibMach();
}

LibMach::LibMach()
{
libfile = NULL;
tab.init();
Expand All @@ -49,10 +102,10 @@ Library::Library()
* Add default library file name extension.
*/

void Library::setFilename(char *dir, char *filename)
void LibMach::setFilename(char *dir, char *filename)
{
#if LOG
printf("Library::setFilename(dir = '%s', filename = '%s')\n",
printf("LibMach::setFilename(dir = '%s', filename = '%s')\n",
dir ? dir : "", filename ? filename : "");
#endif
char *arg = filename;
Expand All @@ -71,7 +124,7 @@ void Library::setFilename(char *dir, char *filename)
libfile = new File(libfilename);
}

void Library::write()
void LibMach::write()
{
if (global.params.verbose)
printf("library %s\n", libfile->name->toChars());
Expand All @@ -93,7 +146,7 @@ void Library::write()

/*****************************************************************************/

void Library::addLibrary(void *buf, size_t buflen)
void LibMach::addLibrary(void *buf, size_t buflen)
{
addObject(NULL, buf, buflen);
}
Expand Down Expand Up @@ -192,10 +245,10 @@ void OmToHeader(Header *h, ObjModule *om)
h->trailer[1] = '\n';
}

void Library::addSymbol(ObjModule *om, char *name, int pickAny)
void LibMach::addSymbol(ObjModule *om, char *name, int pickAny)
{
#if LOG
printf("Library::addSymbol(%s, %s, %d)\n", om->name, name, pickAny);
printf("LibMach::addSymbol(%s, %s, %d)\n", om->name, name, pickAny);
#endif
#if 0 // let linker sort out duplicates
StringValue *s = tab.insert(name, strlen(name));
Expand Down Expand Up @@ -228,13 +281,13 @@ void Library::addSymbol(ObjModule *om, char *name, int pickAny)

/************************************
* Scan single object module for dictionary symbols.
* Send those symbols to Library::addSymbol().
* Send those symbols to LibMach::addSymbol().
*/

void Library::scanObjModule(ObjModule *om)
void LibMach::scanObjModule(ObjModule *om)
{
#if LOG
printf("Library::scanObjModule(%s)\n", om->name);
printf("LibMach::scanObjModule(%s)\n", om->name);
#endif
unsigned char *buf = (unsigned char *)om->base;
size_t buflen = om->length;
Expand Down Expand Up @@ -432,12 +485,12 @@ void Library::scanObjModule(ObjModule *om)
* and load the file.
*/

void Library::addObject(const char *module_name, void *buf, size_t buflen)
void LibMach::addObject(const char *module_name, void *buf, size_t buflen)
{
if (!module_name)
module_name = "";
#if LOG
printf("Library::addObject(%s)\n", module_name);
printf("LibMach::addObject(%s)\n", module_name);
#endif
int fromfile = 0;
if (!buf)
Expand Down Expand Up @@ -635,10 +688,10 @@ void Library::addObject(const char *module_name, void *buf, size_t buflen)
* object modules...
*/

void Library::WriteLibToBuffer(OutBuffer *libbuf)
void LibMach::WriteLibToBuffer(OutBuffer *libbuf)
{
#if LOG
printf("Library::WriteLibToBuffer()\n");
printf("LibMach::WriteLibToBuffer()\n");
#endif
static char pad[7] = { 0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A, };

Expand Down

0 comments on commit 70f0e69

Please sign in to comment.