mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 05:32:25 +00:00
dd04df0ec3
Get rid of the difference between file paths and directory paths. The Path class now simply stores a path that can refer to either a file or a directory. This required various changes in the implementation and interface of the class with the corresponding impact to its users. Doxygen comments were also updated to reflect these changes. Interface changes are: appendDirectory -> appendComponent appendFile -> appendComponent elideDirectory -> eraseComponent elideFile -> eraseComponent elideSuffix -> eraseSuffix renameFile -> rename setDirectory -> set setFile -> set Changes pass Dejagnu and llvm-test/SingleSource tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22349 91177308-0d34-0410-b5e6-96231b3b80d8
93 lines
2.9 KiB
C++
93 lines
2.9 KiB
C++
//===-- llvm-ranlib.cpp - LLVM archive index generator --------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file was developed by Reid Spencer and is distributed under the
|
|
// University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Adds or updates an index (symbol table) for an LLVM archive file.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Module.h"
|
|
#include "llvm/Bytecode/Archive.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/System/Signals.h"
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
|
|
using namespace llvm;
|
|
|
|
// llvm-ar operation code and modifier flags
|
|
static cl::opt<std::string>
|
|
ArchiveName(cl::Positional, cl::Optional, cl::desc("<archive-file>"));
|
|
|
|
static cl::opt<bool>
|
|
Verbose("verbose",cl::Optional,cl::init(false),
|
|
cl::desc("Print the symbol table"));
|
|
|
|
// printSymbolTable - print out the archive's symbol table.
|
|
void printSymbolTable(Archive* TheArchive) {
|
|
std::cout << "\nArchive Symbol Table:\n";
|
|
const Archive::SymTabType& symtab = TheArchive->getSymbolTable();
|
|
for (Archive::SymTabType::const_iterator I=symtab.begin(), E=symtab.end();
|
|
I != E; ++I ) {
|
|
unsigned offset = TheArchive->getFirstFileOffset() + I->second;
|
|
std::cout << " " << std::setw(9) << offset << "\t" << I->first <<"\n";
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
// Have the command line options parsed and handle things
|
|
// like --help and --version.
|
|
cl::ParseCommandLineOptions(argc, argv,
|
|
" LLVM Archive Index Generator (llvm-ranlib)\n\n"
|
|
" This program adds or updates an index of bytecode symbols\n"
|
|
" to an LLVM archive file."
|
|
);
|
|
|
|
// Print a stack trace if we signal out.
|
|
sys::PrintStackTraceOnErrorSignal();
|
|
|
|
int exitCode = 0;
|
|
|
|
// Make sure we don't exit with "unhandled exception".
|
|
try {
|
|
|
|
// Check the path name of the archive
|
|
sys::Path ArchivePath;
|
|
if (!ArchivePath.set(ArchiveName))
|
|
throw std::string("Archive name invalid: ") + ArchiveName;
|
|
|
|
// Make sure it exists, we don't create empty archives
|
|
if (!ArchivePath.exists())
|
|
throw std::string("Archive file does not exist");
|
|
|
|
std::string err_msg;
|
|
std::auto_ptr<Archive>
|
|
AutoArchive(Archive::OpenAndLoad(ArchivePath,&err_msg));
|
|
Archive* TheArchive = AutoArchive.get();
|
|
if (!TheArchive)
|
|
throw err_msg;
|
|
|
|
TheArchive->writeToDisk(true, false, false );
|
|
|
|
if (Verbose)
|
|
printSymbolTable(TheArchive);
|
|
|
|
} catch (const char*msg) {
|
|
std::cerr << argv[0] << ": " << msg << "\n\n";
|
|
exitCode = 1;
|
|
} catch (const std::string& msg) {
|
|
std::cerr << argv[0] << ": " << msg << "\n";
|
|
exitCode = 2;
|
|
} catch (...) {
|
|
std::cerr << argv[0] << ": An unexpected unknown exception occurred.\n";
|
|
exitCode = 3;
|
|
}
|
|
return exitCode;
|
|
}
|