1
1
mirror of https://github.com/rui314/mold.git synced 2024-12-26 18:02:30 +03:00

temporary

This commit is contained in:
Rui Ueyama 2020-10-10 12:47:12 +09:00
parent 7fbad02cd4
commit 5ccf327790
4 changed files with 52 additions and 11 deletions

View File

@ -2,13 +2,14 @@ CC=clang
CXX=clang++
LLVM_CONFIG=llvm-project/build/bin/llvm-config
LLVM_TBLGEN=llvm-project/build/bin/llvm-tblgen
LLVM_LIBS=$(wildcard llvm-project/build/lib/libLLVM*.a)
CURRENT_DIR=$(shell pwd)
TBB_LIBDIR=$(wildcard $(CURRENT_DIR)/oneTBB/build/linux_intel64_*_release/)
CPPFLAGS=-g $(shell $(LLVM_CONFIG) --cxxflags) -IoneTBB/include -pthread
LDFLAGS=$(shell $(LLVM_CONFIG) --ldflags) -L$(TBB_LIBDIR) -Wl,-rpath=$(TBB_LIBDIR)
LIBS=-pthread -lLLVMSupport -lLLVMObject -lLLVMOption -lLLVMBinaryFormat -lcurses -ltbb
LIBS=-pthread -ltbb -lcurses -Wl,--start-group $(LLVM_LIBS) -Wl,--end-group
OBJS=main.o writer.o input_files.o symtab.o
chibild: $(OBJS)

View File

@ -4,6 +4,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/Magic.h"
#include "llvm/Object/Archive.h"
#include "llvm/Object/ELF.h"
#include "llvm/Object/ELFTypes.h"
#include "llvm/Support/Error.h"
@ -16,6 +17,7 @@
using llvm::ArrayRef;
using llvm::ErrorOr;
using llvm::Error;
using llvm::Expected;
using llvm::MemoryBufferRef;
using llvm::SmallVector;

View File

@ -61,7 +61,7 @@ void ObjectFile::register_defined_symbols() {
}
symbol_table.add(sym.name, sym);
llvm::errs() << symbol_table.get(sym.name).name << "\n";
llvm::errs() << "x=" << symbol_table.get(sym.name)->name << "\n";
symbols.push_back(&sym);
}
}

56
main.cc
View File

@ -3,6 +3,8 @@
#include <iostream>
using llvm::file_magic;
using llvm::object::Archive;
using llvm::opt::InputArgList;
Config config;
@ -58,6 +60,45 @@ InputArgList MyOptTable::parse(int argc, char **argv) {
// Main
//
static std::vector<MemoryBufferRef> getArchiveMembers(MemoryBufferRef mb) {
std::unique_ptr<Archive> file =
CHECK(Archive::create(mb), mb.getBufferIdentifier() + ": failed to parse archive");
std::vector<MemoryBufferRef> vec;
Error err = Error::success();
for (const Archive::Child &c : file->children(err)) {
MemoryBufferRef mbref =
CHECK(c.getMemoryBufferRef(),
mb.getBufferIdentifier() +
": could not get the buffer for a child of the archive");
vec.push_back(mbref);
}
if (err)
error(mb.getBufferIdentifier() + ": Archive::children failed: " +
toString(std::move(err)));
return vec;
}
static void add_file(std::vector<ObjectFile *> &files, StringRef path) {
MemoryBufferRef mb = readFile(path);
switch (identify_magic(mb.getBuffer())) {
case file_magic::archive:
for (MemoryBufferRef member : getArchiveMembers(mb))
files.push_back(new ObjectFile(member));
break;
case file_magic::elf_relocatable:
files.push_back(new ObjectFile(mb));
break;
default:
error(path + ": unknown file type");
}
}
int main(int argc, char **argv) {
MyOptTable opt_table;
InputArgList args = opt_table.parse(argc - 1, argv + 1);
@ -69,19 +110,16 @@ int main(int argc, char **argv) {
std::vector<ObjectFile *> files;
for (auto *arg : args) {
switch (arg->getOption().getID()) {
case OPT_INPUT: {
MemoryBufferRef mb = readFile(arg->getValue());
files.push_back(new ObjectFile(mb));
break;
}
}
}
for (auto *arg : args)
if (arg->getOption().getID() == OPT_INPUT)
add_file(files, arg->getValue());
for (ObjectFile *file : files)
file->parse();
for (ObjectFile *file : files)
file->register_defined_symbols();
write();
return 0;
}