From 009505452b713ed2e3a8e99c5545a6e721c65495 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 6 Jun 2001 20:29:01 +0000 Subject: Initial revision git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/Makefile | 5 +++ tools/as/Makefile | 9 +++++ tools/as/as.cpp | 85 +++++++++++++++++++++++++++++++++++++++ tools/dis/Makefile | 10 +++++ tools/dis/dis.cpp | 64 +++++++++++++++++++++++++++++ tools/llvm-as/Makefile | 9 +++++ tools/llvm-as/as.cpp | 85 +++++++++++++++++++++++++++++++++++++++ tools/llvm-as/llvm-as.cpp | 85 +++++++++++++++++++++++++++++++++++++++ tools/llvm-dis/Makefile | 10 +++++ tools/llvm-dis/dis.cpp | 64 +++++++++++++++++++++++++++++ tools/llvm-dis/llvm-dis.cpp | 64 +++++++++++++++++++++++++++++ tools/opt/Makefile | 10 +++++ tools/opt/opt.cpp | 98 +++++++++++++++++++++++++++++++++++++++++++++ tools/opt/test.sh | 4 ++ tools/opt/testinline.sh | 3 ++ tools/opt/teststrip.sh | 3 ++ tools/setup | 5 +++ 17 files changed, 613 insertions(+) create mode 100644 tools/Makefile create mode 100644 tools/as/Makefile create mode 100644 tools/as/as.cpp create mode 100644 tools/dis/Makefile create mode 100644 tools/dis/dis.cpp create mode 100644 tools/llvm-as/Makefile create mode 100644 tools/llvm-as/as.cpp create mode 100644 tools/llvm-as/llvm-as.cpp create mode 100644 tools/llvm-dis/Makefile create mode 100644 tools/llvm-dis/dis.cpp create mode 100644 tools/llvm-dis/llvm-dis.cpp create mode 100644 tools/opt/Makefile create mode 100644 tools/opt/opt.cpp create mode 100755 tools/opt/test.sh create mode 100755 tools/opt/testinline.sh create mode 100755 tools/opt/teststrip.sh create mode 100644 tools/setup (limited to 'tools') diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 0000000..0c2cedb --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,5 @@ +LEVEL = .. +DIRS = dis as opt + +include $(LEVEL)/Makefile.common + diff --git a/tools/as/Makefile b/tools/as/Makefile new file mode 100644 index 0000000..3fa7984 --- /dev/null +++ b/tools/as/Makefile @@ -0,0 +1,9 @@ +LEVEL = ../.. +include $(LEVEL)/Makefile.common + +all:: as +clean:: + rm -f as + +as : $(ObjectsG) + $(LinkG) -o as $(ObjectsG) -lvmcore -lasmparser -lbcwriter -lanalysis -lasmwriter diff --git a/tools/as/as.cpp b/tools/as/as.cpp new file mode 100644 index 0000000..2c319a0 --- /dev/null +++ b/tools/as/as.cpp @@ -0,0 +1,85 @@ +//===------------------------------------------------------------------------=== +// LLVM 'AS' UTILITY +// +// This utility may be invoked in the following manner: +// as --help - Output information about command line switches +// as [options] - Read LLVM assembly from stdin, write bytecode to stdout +// as [options] x.ll - Read LLVM assembly from the x.ll file, write bytecode +// to the x.bc file. +// +//===------------------------------------------------------------------------=== + +#include +#include +#include +#include "llvm/Module.h" +#include "llvm/Assembly/Parser.h" +#include "llvm/Assembly/Writer.h" +#include "llvm/Bytecode/Writer.h" +#include "llvm/Tools/CommandLine.h" + + +int main(int argc, char **argv) { + ToolCommandLine Opts(argc, argv); + bool DumpAsm = false; + + for (int i = 1; i < argc; i++) { + if (string(argv[i]) == string("-d")) { + argv[i] = 0; DumpAsm = true; + } + } + + bool PrintMessage = false; + for (int i = 1; i < argc; i++) { + if (argv[i] == 0) continue; + + if (string(argv[i]) == string("--help")) { + PrintMessage = true; + } else { + cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n"; + } + } + + if (PrintMessage) { + cerr << argv[0] << " usage:\n" + << " " << argv[0] << " --help - Print this usage information\n" + << " " << argv[0] << " x.ll - Parse file and output " + << "bytecodes to x.bc\n" + << " " << argv[0] << " - Parse stdin and write to stdout.\n"; + return 1; + } + + ostream *Out = &cout; // Default to output to stdout... + try { + // Parse the file now... + Module *C = ParseAssemblyFile(Opts); + if (C == 0) { + cerr << "assembly didn't read correctly.\n"; + return 1; + } + + if (DumpAsm) + cerr << "Here's the assembly:\n" << C; + + if (Opts.getOutputFilename() != "-") { + Out = new ofstream(Opts.getOutputFilename().c_str(), + (Opts.getForce() ? 0 : ios::noreplace)|ios::out); + if (!Out->good()) { + cerr << "Error opening " << Opts.getOutputFilename() << "!\n"; + delete C; + return 1; + } + } + + WriteBytecodeToFile(C, *Out); + + delete C; + } catch (const ParseException &E) { + cerr << E.getMessage() << endl; + return 1; + } + + if (Out != &cout) delete Out; + return 0; +} + diff --git a/tools/dis/Makefile b/tools/dis/Makefile new file mode 100644 index 0000000..fc77cdd --- /dev/null +++ b/tools/dis/Makefile @@ -0,0 +1,10 @@ +LEVEL = ../.. +include $(LEVEL)/Makefile.common + +all:: dis +clean :: + rm -f dis + +dis : $(ObjectsG) + $(LinkG) -o $@ $(ObjectsG) -lvmcore -lasmwriter -lanalysis \ + -lbcreader diff --git a/tools/dis/dis.cpp b/tools/dis/dis.cpp new file mode 100644 index 0000000..3f45ee3 --- /dev/null +++ b/tools/dis/dis.cpp @@ -0,0 +1,64 @@ +//===------------------------------------------------------------------------=== +// LLVM 'DIS' UTILITY +// +// This utility may be invoked in the following manner: +// dis --help - Output information about command line switches +// dis [options] - Read LLVM bytecode from stdin, write assembly to stdout +// dis [options] x.bc - Read LLVM bytecode from the x.bc file, write assembly +// to the x.ll file. +// +//===------------------------------------------------------------------------=== + +#include +#include +#include "llvm/Module.h" +#include "llvm/Assembly/Writer.h" +#include "llvm/Bytecode/Reader.h" +#include "llvm/Tools/CommandLine.h" + +int main(int argc, char **argv) { + ToolCommandLine Opts(argc, argv, false); + + // We only support the options that the system parser does... if it left any + // then we don't know what to do. + // + if (argc > 1) { + for (int i = 1; i < argc; i++) { + if (string(argv[i]) != string("--help")) + cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n"; + } + + cerr << argv[0] << " usage:\n" + << " " << argv[0] << " --help - Print this usage information\n" + << " " << argv[0] << " x.bc - Parse file and output " + << "assembly to x.ll\n" + << " " << argv[0] << " - Parse stdin and write to stdout.\n"; + return 1; + } + + ostream *Out = &cout; // Default to printing to stdout... + + Module *C = ParseBytecodeFile(Opts.getInputFilename()); + if (C == 0) { + cerr << "bytecode didn't read correctly.\n"; + return 1; + } + + if (Opts.getOutputFilename() != "-") { + Out = new ofstream(Opts.getOutputFilename().c_str(), + (Opts.getForce() ? 0 : ios::noreplace)|ios::out); + if (!Out->good()) { + cerr << "Error opening " << Opts.getOutputFilename() + << ": sending to stdout instead!\n"; + Out = &cout; + } + } + + // All that dis does is write the assembly out to a file... which is exactly + // what the writer library is supposed to do... + (*Out) << C; + delete C; + + if (Out != &cout) delete Out; + return 0; +} diff --git a/tools/llvm-as/Makefile b/tools/llvm-as/Makefile new file mode 100644 index 0000000..3fa7984 --- /dev/null +++ b/tools/llvm-as/Makefile @@ -0,0 +1,9 @@ +LEVEL = ../.. +include $(LEVEL)/Makefile.common + +all:: as +clean:: + rm -f as + +as : $(ObjectsG) + $(LinkG) -o as $(ObjectsG) -lvmcore -lasmparser -lbcwriter -lanalysis -lasmwriter diff --git a/tools/llvm-as/as.cpp b/tools/llvm-as/as.cpp new file mode 100644 index 0000000..2c319a0 --- /dev/null +++ b/tools/llvm-as/as.cpp @@ -0,0 +1,85 @@ +//===------------------------------------------------------------------------=== +// LLVM 'AS' UTILITY +// +// This utility may be invoked in the following manner: +// as --help - Output information about command line switches +// as [options] - Read LLVM assembly from stdin, write bytecode to stdout +// as [options] x.ll - Read LLVM assembly from the x.ll file, write bytecode +// to the x.bc file. +// +//===------------------------------------------------------------------------=== + +#include +#include +#include +#include "llvm/Module.h" +#include "llvm/Assembly/Parser.h" +#include "llvm/Assembly/Writer.h" +#include "llvm/Bytecode/Writer.h" +#include "llvm/Tools/CommandLine.h" + + +int main(int argc, char **argv) { + ToolCommandLine Opts(argc, argv); + bool DumpAsm = false; + + for (int i = 1; i < argc; i++) { + if (string(argv[i]) == string("-d")) { + argv[i] = 0; DumpAsm = true; + } + } + + bool PrintMessage = false; + for (int i = 1; i < argc; i++) { + if (argv[i] == 0) continue; + + if (string(argv[i]) == string("--help")) { + PrintMessage = true; + } else { + cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n"; + } + } + + if (PrintMessage) { + cerr << argv[0] << " usage:\n" + << " " << argv[0] << " --help - Print this usage information\n" + << " " << argv[0] << " x.ll - Parse file and output " + << "bytecodes to x.bc\n" + << " " << argv[0] << " - Parse stdin and write to stdout.\n"; + return 1; + } + + ostream *Out = &cout; // Default to output to stdout... + try { + // Parse the file now... + Module *C = ParseAssemblyFile(Opts); + if (C == 0) { + cerr << "assembly didn't read correctly.\n"; + return 1; + } + + if (DumpAsm) + cerr << "Here's the assembly:\n" << C; + + if (Opts.getOutputFilename() != "-") { + Out = new ofstream(Opts.getOutputFilename().c_str(), + (Opts.getForce() ? 0 : ios::noreplace)|ios::out); + if (!Out->good()) { + cerr << "Error opening " << Opts.getOutputFilename() << "!\n"; + delete C; + return 1; + } + } + + WriteBytecodeToFile(C, *Out); + + delete C; + } catch (const ParseException &E) { + cerr << E.getMessage() << endl; + return 1; + } + + if (Out != &cout) delete Out; + return 0; +} + diff --git a/tools/llvm-as/llvm-as.cpp b/tools/llvm-as/llvm-as.cpp new file mode 100644 index 0000000..2c319a0 --- /dev/null +++ b/tools/llvm-as/llvm-as.cpp @@ -0,0 +1,85 @@ +//===------------------------------------------------------------------------=== +// LLVM 'AS' UTILITY +// +// This utility may be invoked in the following manner: +// as --help - Output information about command line switches +// as [options] - Read LLVM assembly from stdin, write bytecode to stdout +// as [options] x.ll - Read LLVM assembly from the x.ll file, write bytecode +// to the x.bc file. +// +//===------------------------------------------------------------------------=== + +#include +#include +#include +#include "llvm/Module.h" +#include "llvm/Assembly/Parser.h" +#include "llvm/Assembly/Writer.h" +#include "llvm/Bytecode/Writer.h" +#include "llvm/Tools/CommandLine.h" + + +int main(int argc, char **argv) { + ToolCommandLine Opts(argc, argv); + bool DumpAsm = false; + + for (int i = 1; i < argc; i++) { + if (string(argv[i]) == string("-d")) { + argv[i] = 0; DumpAsm = true; + } + } + + bool PrintMessage = false; + for (int i = 1; i < argc; i++) { + if (argv[i] == 0) continue; + + if (string(argv[i]) == string("--help")) { + PrintMessage = true; + } else { + cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n"; + } + } + + if (PrintMessage) { + cerr << argv[0] << " usage:\n" + << " " << argv[0] << " --help - Print this usage information\n" + << " " << argv[0] << " x.ll - Parse file and output " + << "bytecodes to x.bc\n" + << " " << argv[0] << " - Parse stdin and write to stdout.\n"; + return 1; + } + + ostream *Out = &cout; // Default to output to stdout... + try { + // Parse the file now... + Module *C = ParseAssemblyFile(Opts); + if (C == 0) { + cerr << "assembly didn't read correctly.\n"; + return 1; + } + + if (DumpAsm) + cerr << "Here's the assembly:\n" << C; + + if (Opts.getOutputFilename() != "-") { + Out = new ofstream(Opts.getOutputFilename().c_str(), + (Opts.getForce() ? 0 : ios::noreplace)|ios::out); + if (!Out->good()) { + cerr << "Error opening " << Opts.getOutputFilename() << "!\n"; + delete C; + return 1; + } + } + + WriteBytecodeToFile(C, *Out); + + delete C; + } catch (const ParseException &E) { + cerr << E.getMessage() << endl; + return 1; + } + + if (Out != &cout) delete Out; + return 0; +} + diff --git a/tools/llvm-dis/Makefile b/tools/llvm-dis/Makefile new file mode 100644 index 0000000..fc77cdd --- /dev/null +++ b/tools/llvm-dis/Makefile @@ -0,0 +1,10 @@ +LEVEL = ../.. +include $(LEVEL)/Makefile.common + +all:: dis +clean :: + rm -f dis + +dis : $(ObjectsG) + $(LinkG) -o $@ $(ObjectsG) -lvmcore -lasmwriter -lanalysis \ + -lbcreader diff --git a/tools/llvm-dis/dis.cpp b/tools/llvm-dis/dis.cpp new file mode 100644 index 0000000..3f45ee3 --- /dev/null +++ b/tools/llvm-dis/dis.cpp @@ -0,0 +1,64 @@ +//===------------------------------------------------------------------------=== +// LLVM 'DIS' UTILITY +// +// This utility may be invoked in the following manner: +// dis --help - Output information about command line switches +// dis [options] - Read LLVM bytecode from stdin, write assembly to stdout +// dis [options] x.bc - Read LLVM bytecode from the x.bc file, write assembly +// to the x.ll file. +// +//===------------------------------------------------------------------------=== + +#include +#include +#include "llvm/Module.h" +#include "llvm/Assembly/Writer.h" +#include "llvm/Bytecode/Reader.h" +#include "llvm/Tools/CommandLine.h" + +int main(int argc, char **argv) { + ToolCommandLine Opts(argc, argv, false); + + // We only support the options that the system parser does... if it left any + // then we don't know what to do. + // + if (argc > 1) { + for (int i = 1; i < argc; i++) { + if (string(argv[i]) != string("--help")) + cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n"; + } + + cerr << argv[0] << " usage:\n" + << " " << argv[0] << " --help - Print this usage information\n" + << " " << argv[0] << " x.bc - Parse file and output " + << "assembly to x.ll\n" + << " " << argv[0] << " - Parse stdin and write to stdout.\n"; + return 1; + } + + ostream *Out = &cout; // Default to printing to stdout... + + Module *C = ParseBytecodeFile(Opts.getInputFilename()); + if (C == 0) { + cerr << "bytecode didn't read correctly.\n"; + return 1; + } + + if (Opts.getOutputFilename() != "-") { + Out = new ofstream(Opts.getOutputFilename().c_str(), + (Opts.getForce() ? 0 : ios::noreplace)|ios::out); + if (!Out->good()) { + cerr << "Error opening " << Opts.getOutputFilename() + << ": sending to stdout instead!\n"; + Out = &cout; + } + } + + // All that dis does is write the assembly out to a file... which is exactly + // what the writer library is supposed to do... + (*Out) << C; + delete C; + + if (Out != &cout) delete Out; + return 0; +} diff --git a/tools/llvm-dis/llvm-dis.cpp b/tools/llvm-dis/llvm-dis.cpp new file mode 100644 index 0000000..3f45ee3 --- /dev/null +++ b/tools/llvm-dis/llvm-dis.cpp @@ -0,0 +1,64 @@ +//===------------------------------------------------------------------------=== +// LLVM 'DIS' UTILITY +// +// This utility may be invoked in the following manner: +// dis --help - Output information about command line switches +// dis [options] - Read LLVM bytecode from stdin, write assembly to stdout +// dis [options] x.bc - Read LLVM bytecode from the x.bc file, write assembly +// to the x.ll file. +// +//===------------------------------------------------------------------------=== + +#include +#include +#include "llvm/Module.h" +#include "llvm/Assembly/Writer.h" +#include "llvm/Bytecode/Reader.h" +#include "llvm/Tools/CommandLine.h" + +int main(int argc, char **argv) { + ToolCommandLine Opts(argc, argv, false); + + // We only support the options that the system parser does... if it left any + // then we don't know what to do. + // + if (argc > 1) { + for (int i = 1; i < argc; i++) { + if (string(argv[i]) != string("--help")) + cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n"; + } + + cerr << argv[0] << " usage:\n" + << " " << argv[0] << " --help - Print this usage information\n" + << " " << argv[0] << " x.bc - Parse file and output " + << "assembly to x.ll\n" + << " " << argv[0] << " - Parse stdin and write to stdout.\n"; + return 1; + } + + ostream *Out = &cout; // Default to printing to stdout... + + Module *C = ParseBytecodeFile(Opts.getInputFilename()); + if (C == 0) { + cerr << "bytecode didn't read correctly.\n"; + return 1; + } + + if (Opts.getOutputFilename() != "-") { + Out = new ofstream(Opts.getOutputFilename().c_str(), + (Opts.getForce() ? 0 : ios::noreplace)|ios::out); + if (!Out->good()) { + cerr << "Error opening " << Opts.getOutputFilename() + << ": sending to stdout instead!\n"; + Out = &cout; + } + } + + // All that dis does is write the assembly out to a file... which is exactly + // what the writer library is supposed to do... + (*Out) << C; + delete C; + + if (Out != &cout) delete Out; + return 0; +} diff --git a/tools/opt/Makefile b/tools/opt/Makefile new file mode 100644 index 0000000..71bdcb8 --- /dev/null +++ b/tools/opt/Makefile @@ -0,0 +1,10 @@ +LEVEL = ../.. +include $(LEVEL)/Makefile.common + +all:: opt +clean :: + rm -f opt + +opt : $(ObjectsG) + $(LinkG) -o $@ $(ObjectsG) -lvmcore -lanalysis -lbcreader -lbcwriter \ + -lopt -lasmwriter diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp new file mode 100644 index 0000000..a0cf140 --- /dev/null +++ b/tools/opt/opt.cpp @@ -0,0 +1,98 @@ +//===------------------------------------------------------------------------=== +// LLVM 'OPT' UTILITY +// +// This utility may be invoked in the following manner: +// opt --help - Output information about command line switches +// opt [options] -dce - Run a dead code elimination pass on input +// bytecodes +// opt [options] -constprop - Run a constant propogation pass on input +// bytecodes +// opt [options] -inline - Run a method inlining pass on input bytecodes +// opt [options] -strip - Strip symbol tables out of methods +// opt [options] -mstrip - Strip module & method symbol tables +// +// Optimizations may be specified an arbitrary number of times on the command +// line, they are run in the order specified. +// +// TODO: Add a -all option to keep applying all optimizations until the program +// stops permuting. +// TODO: Add a -h command line arg that prints all available optimizations +// TODO: Add a -q command line arg that quiets "XXX pass made modifications" +// +//===------------------------------------------------------------------------=== + +#include +#include +#include "llvm/Module.h" +#include "llvm/Bytecode/Reader.h" +#include "llvm/Bytecode/Writer.h" +#include "llvm/Tools/CommandLine.h" +#include "llvm/Opt/AllOpts.h" + +struct { + const string ArgName, Name; + bool (*OptPtr)(Module *C); +} OptTable[] = { + { "-dce", "Dead Code Elimination", DoDeadCodeElimination }, + { "-constprop","Constant Propogation", DoConstantPropogation }, + { "-inline" ,"Method Inlining", DoMethodInlining }, + { "-strip" ,"Strip Symbols", DoSymbolStripping }, + { "-mstrip" ,"Strip Module Symbols", DoFullSymbolStripping }, +}; + +int main(int argc, char **argv) { + ToolCommandLine Opts(argc, argv, false); + bool Quiet = false; + + for (int i = 1; i < argc; i++) { + if (string(argv[i]) == string("--help")) { + cerr << argv[0] << " usage:\n" + << " " << argv[0] << " --help - Print this usage information\n"; + return 1; + } else if (string(argv[i]) == string("-q")) { + Quiet = true; argv[i] = 0; + } + } + + ostream *Out = &cout; // Default to printing to stdout... + + Module *C = ParseBytecodeFile(Opts.getInputFilename()); + if (C == 0) { + cerr << "bytecode didn't read correctly.\n"; + return 1; + } + + + for (int i = 1; i < argc; i++) { + if (argv[i] == 0) continue; + unsigned j; + for (j = 0; j < sizeof(OptTable)/sizeof(OptTable[0]); j++) { + if (string(argv[i]) == OptTable[j].ArgName) { + if (OptTable[j].OptPtr(C) && !Quiet) + cerr << OptTable[j].Name << " pass made modifications!\n"; + break; + } + } + + if (j == sizeof(OptTable)/sizeof(OptTable[0])) + cerr << "'" << argv[i] << "' argument unrecognized: ignored\n"; + } + + if (Opts.getOutputFilename() != "-") { + Out = new ofstream(Opts.getOutputFilename().c_str(), + (Opts.getForce() ? 0 : ios::noreplace)|ios::out); + if (!Out->good()) { + cerr << "Error opening " << Opts.getOutputFilename() + << "!\n"; + delete C; + return 1; + } + } + + // Okay, we're done now... write out result... + WriteBytecodeToFile(C, *Out); + delete C; + + if (Out != &cout) delete Out; + return 0; +} diff --git a/tools/opt/test.sh b/tools/opt/test.sh new file mode 100755 index 0000000..b6d13f4 --- /dev/null +++ b/tools/opt/test.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +../as/as < ../../test/$1 | ./opt -constprop -dce | ../dis/dis + diff --git a/tools/opt/testinline.sh b/tools/opt/testinline.sh new file mode 100755 index 0000000..ff16a66 --- /dev/null +++ b/tools/opt/testinline.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +../as/as < ../../test/$1 | ./opt -inline -constprop -dce | dis diff --git a/tools/opt/teststrip.sh b/tools/opt/teststrip.sh new file mode 100755 index 0000000..2cff3bf --- /dev/null +++ b/tools/opt/teststrip.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +../as/as < ../../test/$1 | ./opt -strip | dis diff --git a/tools/setup b/tools/setup new file mode 100644 index 0000000..f0fc36c --- /dev/null +++ b/tools/setup @@ -0,0 +1,5 @@ +setenv LD_LIBRARY_PATH ../../lib/Assembly/Parser/Debug:../../lib/Assembly/Writer/Debug:../../lib/Analysis/Debug:../../lib/VMCore/Debug:../../lib/Bytecode/Writer/Debug:../../lib/Bytecode/Reader/Debug:../../lib/Optimizations/Debug + +setenv PATH ../dis:../opt:../strip:${PATH} + +alias as ../as/as -- cgit v1.1