[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