1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00

Driver and options for the llc compiler.

llvm-svn: 234
This commit is contained in:
Vikram S. Adve 2001-07-21 12:42:29 +00:00
parent 75d94738e6
commit b7ca711494
3 changed files with 251 additions and 0 deletions

125
tools/llc/LLCOptions.cpp Normal file
View File

@ -0,0 +1,125 @@
// $Id$
//**************************************************************************/
// File:
// LLCOptions.cpp
//
// Purpose:
// Options for the llc compiler.
//
// History:
// 7/15/01 - Vikram Adve - Created
//
//**************************************************************************/
//************************** System Include Files **************************/
#include <iostream.h>
#include <unistd.h>
//*************************** User Include Files ***************************/
#include "llvm/Support/ProgramOptions.h"
#include "llvm/Support/ProgramOption.h"
#include "llvm/LLC/LLCOptions.h"
//---------------------------------------------------------------------------
// class LLCOptions
//---------------------------------------------------------------------------
/*ctor*/
LLCOptions::LLCOptions (int _argc,
const char* _argv[],
const char* _envp[])
: ProgramOptions(_argc, _argv, _envp)
{
InitializeOptions();
ParseArgs(argc, argv, envp);
CheckParse();
}
/*dtor*/
LLCOptions::~LLCOptions()
{}
//--------------------------------------------------------------------
// Initialize all our compiler options
//--------------------------------------------------------------------
void
LLCOptions::InitializeOptions()
{
Register(new FlagOption(HELP_OPT,
"print usage message",
false /*initValue*/));
Register(new FlagOption(DEBUG_OPT,
"turn on default debugging options",
false /*initValue*/));
Register(new FlagOption(DEBUG_OPT,
"turn off all diagnostic messages",
false /*initValue*/));
Register(new StringOption(OUTFILENAME_OPT,
"output file name",
"" /*initValue*/));
Register(new IntegerValuedOption(DEBUG_INSTR_SELECT_OPT,
"control amount of debugging information for instruction selection",
0 /*initValue*/));
}
void
LLCOptions::ParseExtraArgs()
{
if (argsConsumed != argc-1)
Usage();
// input file name should be the last argument
inputFileName = argv[argc-1];
// output file name may be specified with -o option;
// otherwise create it from the input file name by replace ".ll" with ".o"
const char* outfilenameOpt = this->StringOptionValue(OUTFILENAME_OPT);
if (outfilenameOpt)
{// "-o" option was used
outputFileName = outfilenameOpt;
}
else
{
outputFileName = inputFileName;
unsigned int suffixPos = outputFileName.rfind(".bc");
if (suffixPos >= outputFileName.length())
suffixPos = outputFileName.rfind(".ll");
if (suffixPos >= outputFileName.length())
{
cerr << "Unrecognized suffix in file name " << inputFileName << endl;
Usage();
}
outputFileName.replace(suffixPos, 3, ".o");
}
}
//--------------------------------------------------------------------
// Functions that must be overridden in subclass of ProgramOptions
//--------------------------------------------------------------------
void
LLCOptions::CheckParse()
{}
void
LLCOptions::PrintUsage(ostream& stream) const
{
stream << "\nUSAGE:\n\t" << ProgramName() << " [options] "
<< "llvm-file" << endl << endl;
PrintOptions(stream);
}

23
tools/llc/Makefile Normal file
View File

@ -0,0 +1,23 @@
LEVEL = ../..
DIRS =
LIBRARYNAME = llc
## List source files in link order
Source = \
llc.o \
LLCOptions.o
include $(LEVEL)/Makefile.common
all:: llc
clean::
rm -f llc
llc : $(ObjectsG) $(LibsG)
$(LinkG) -o $@ -static \
-lllc -lselect -lsparc -ltarget \
-lopt -lbcreader -lbcwriter \
-lvmcore -lasmwriter -lanalysis -lsupport

103
tools/llc/llc.cpp Normal file
View File

@ -0,0 +1,103 @@
// $Id$
//***************************************************************************
// File:
// llc.cpp
//
// Purpose:
// Driver for llc compiler.
//
// History:
// 7/15/01 - Vikram Adve - Created
//
//**************************************************************************/
//************************** System Include Files **************************/
//*************************** User Include Files ***************************/
#include "llvm/Module.h"
#include "llvm/Method.h"
#include "llvm/Bytecode/Reader.h"
#include "llvm/Bytecode/Writer.h"
#include "llvm/Codegen/InstrForest.h"
#include "llvm/Codegen/InstrSelection.h"
#include "llvm/LLC/LLCOptions.h"
#include "llvm/LLC/CompileContext.h"
//************************** Forward Declarations **************************/
class Module;
class CompileContext;
static bool CompileModule (Module *module,
CompileContext& compileContext);
int DebugInstrSelectLevel = DEBUG_INSTR_TREES;
//---------------------------------------------------------------------------
// Function main()
//
// Entry point for the driver.
//---------------------------------------------------------------------------
int
main(int argc, const char** argv, const char** envp)
{
CompileContext compileContext(argc, argv, envp);
Module *module =
ParseBytecodeFile(compileContext.getOptions().getInputFileName());
if (module == 0) {
cerr << "bytecode didn't read correctly.\n";
return 1;
}
bool failure = CompileModule(module, compileContext);
if (failure)
{
cerr << "Error compiling "
<< compileContext.getOptions().getInputFileName() << "!\n";
delete module;
return 1;
}
// Okay, we're done now... write out result...
// WriteBytecodeToFile(module,
// compileContext.getOptions().getOutputFileName);
// Clean up and exit
delete module;
return 0;
}
static bool
CompileModule(Module *module,
CompileContext& ccontext)
{
bool failed = false;
for (Module::MethodListType::const_iterator
methodIter = module->getMethodList().begin();
methodIter != module->getMethodList().end();
++methodIter)
{
Method* method = *methodIter;
if (SelectInstructionsForMethod(method, ccontext))
{
failed = true;
cerr << "Instruction selection failed for method "
<< (method->hasName()? method->getName() : "")
<< endl << endl;
}
}
return failed;
}