[llvm-commits] [poolalloc] r47772 - in /poolalloc/trunk/tools: ./ Makefile Pa/ Pa/Makefile Pa/pa.cpp
John Criswell
criswell at uiuc.edu
Fri Feb 29 14:55:38 PST 2008
Author: criswell
Date: Fri Feb 29 16:55:37 2008
New Revision: 47772
URL: http://llvm.org/viewvc/llvm-project?rev=47772&view=rev
Log:
Adding the pa tool for Automatically Pool Allocating programs.
Added:
poolalloc/trunk/tools/
poolalloc/trunk/tools/Makefile
poolalloc/trunk/tools/Pa/
poolalloc/trunk/tools/Pa/Makefile
poolalloc/trunk/tools/Pa/pa.cpp
Added: poolalloc/trunk/tools/Makefile
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/tools/Makefile?rev=47772&view=auto
==============================================================================
--- poolalloc/trunk/tools/Makefile (added)
+++ poolalloc/trunk/tools/Makefile Fri Feb 29 16:55:37 2008
@@ -0,0 +1,11 @@
+#
+# Relative path to the top of the source tree.
+#
+LEVEL=..
+
+#
+# List all of the subdirectories that we will compile.
+#
+PARALLEL_DIRS=Pa
+
+include $(LEVEL)/Makefile.common
Added: poolalloc/trunk/tools/Pa/Makefile
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/tools/Pa/Makefile?rev=47772&view=auto
==============================================================================
--- poolalloc/trunk/tools/Pa/Makefile (added)
+++ poolalloc/trunk/tools/Pa/Makefile Fri Feb 29 16:55:37 2008
@@ -0,0 +1,24 @@
+#===- tools/pa/Makefile ------------------------------------*- Makefile -*-===##
+#
+# Automatic Pool Allocation Project
+#
+# This file was developed by the LLVM research group and is distributed under
+# the University of Illinois Open Source License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../..
+TOOLNAME=pa
+
+# Initialize the USEDLIBS so we can add to it
+
+LINK_COMPONENTS := bitreader bitwriter instrumentation scalaropts ipo
+
+USEDLIBS := poolalloc LLVMDataStructure
+
+# Include this here so we can get the configuration of the targets
+# that have been configured for construction. We have to do this
+# early so we can set up USEDLIBS properly before includeing Makefile.rules
+include $(LEVEL)/Makefile.common
+
+
Added: poolalloc/trunk/tools/Pa/pa.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/tools/Pa/pa.cpp?rev=47772&view=auto
==============================================================================
--- poolalloc/trunk/tools/Pa/pa.cpp (added)
+++ poolalloc/trunk/tools/Pa/pa.cpp Fri Feb 29 16:55:37 2008
@@ -0,0 +1,167 @@
+//===-- pa - Automatic Pool Allocation Compiler Tool --------------------===//
+//
+// Automatic Pool Allocation Project
+//
+// This file was developed by the LLVM research group and is distributed
+// under the University of Illinois Open Source License. See LICENSE.TXT for
+// details.
+//
+//===--------------------------------------------------------------------===//
+//
+// This program is a tool to run the Automatic Pool Allocation passes on a
+// bytecode input file.
+//
+//===--------------------------------------------------------------------===//
+
+#include "llvm/Module.h"
+#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/PassManager.h"
+#include "llvm/Pass.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/PluginLoader.h"
+#include "llvm/Support/FileUtilities.h"
+#include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Analysis/Verifier.h"
+#include "llvm/System/Signals.h"
+#include "llvm/Config/config.h"
+
+#include "poolalloc/PoolAllocate.h"
+
+#include <fstream>
+#include <iostream>
+#include <memory>
+
+using namespace llvm;
+
+// General options for sc.
+static cl::opt<std::string>
+InputFilename(cl::Positional, cl::desc("<input bytecode>"), cl::init("-"));
+
+static cl::opt<std::string>
+OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"));
+
+static cl::opt<bool> Force("f", cl::desc("Overwrite output files"));
+
+// GetFileNameRoot - Helper function to get the basename of a filename.
+static inline std::string
+GetFileNameRoot(const std::string &InputFilename) {
+ std::string IFN = InputFilename;
+ std::string outputFilename;
+ int Len = IFN.length();
+ if ((Len > 2) &&
+ IFN[Len-3] == '.' && IFN[Len-2] == 'b' && IFN[Len-1] == 'c') {
+ outputFilename = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/
+ } else {
+ outputFilename = IFN;
+ }
+ return outputFilename;
+}
+
+
+// main - Entry point for the sc compiler.
+//
+int main(int argc, char **argv) {
+ std::string mt;
+ std::string & msg = mt;
+ try {
+ cl::ParseCommandLineOptions(argc, argv, " llvm system compiler\n");
+ sys::PrintStackTraceOnErrorSignal();
+
+ // Load the module to be compiled...
+ std::auto_ptr<Module> M;
+ std::string ErrorMessage;
+ if (MemoryBuffer *Buffer
+ = MemoryBuffer::getFileOrSTDIN(InputFilename, &ErrorMessage)) {
+ M.reset(ParseBitcodeFile(Buffer, &ErrorMessage));
+ delete Buffer;
+ }
+
+ if (M.get() == 0) {
+ std::cerr << argv[0] << ": bytecode didn't read correctly.\n";
+ return 1;
+ }
+ Module &mod = *M.get();
+
+ // Build up all of the passes that we want to do to the module...
+ PassManager Passes;
+
+ Passes.add(new TargetData(M.get()));
+
+ // Currently deactiviated
+ Passes.add(new PoolAllocate());
+
+ // Verify the final result
+ Passes.add(createVerifierPass());
+
+ // Figure out where we are going to send the output...
+ std::ostream *Out = 0;
+ if (OutputFilename != "") {
+ if (OutputFilename != "-") {
+ // Specified an output filename?
+ if (!Force && std::ifstream(OutputFilename.c_str())) {
+ // If force is not specified, make sure not to overwrite a file!
+ std::cerr << argv[0] << ": error opening '" << OutputFilename
+ << "': file exists!\n"
+ << "Use -f command line argument to force output\n";
+ return 1;
+ }
+ Out = new std::ofstream(OutputFilename.c_str());
+
+ // Make sure that the Out file gets unlinked from the disk if we get a
+ // SIGINT
+ sys::RemoveFileOnSignal(sys::Path(OutputFilename));
+ } else {
+ Out = &std::cout;
+ }
+ } else {
+ if (InputFilename == "-") {
+ OutputFilename = "-";
+ Out = &std::cout;
+ } else {
+ OutputFilename = GetFileNameRoot(InputFilename);
+
+ OutputFilename += ".abc.bc";
+ }
+
+ if (!Force && std::ifstream(OutputFilename.c_str())) {
+ // If force is not specified, make sure not to overwrite a file!
+ std::cerr << argv[0] << ": error opening '" << OutputFilename
+ << "': file exists!\n"
+ << "Use -f command line argument to force output\n";
+ return 1;
+ }
+
+ Out = new std::ofstream(OutputFilename.c_str());
+ if (!Out->good()) {
+ std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
+ delete Out;
+ return 1;
+ }
+
+ // Make sure that the Out file gets unlinked from the disk if we get a
+ // SIGINT
+ sys::RemoveFileOnSignal(sys::Path(OutputFilename));
+ }
+
+ // Add the writing of the output file to the list of passes
+ Passes.add (CreateBitcodeWriterPass(*Out));
+
+ // Run our queue of passes all at once now, efficiently.
+ Passes.run(*M.get());
+
+
+
+ // Delete the ostream if it's not a stdout stream
+ if (Out != &std::cout) delete Out;
+
+ return 0;
+ } catch (msg) {
+ std::cerr << argv[0] << ": " << msg << "\n";
+ } catch (...) {
+ std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+ }
+ return 1;
+}
+
More information about the llvm-commits
mailing list