diff options
-rw-r--r-- | tools/gccas/Makefile | 19 | ||||
-rw-r--r-- | tools/gccas/gccas.cpp | 215 | ||||
-rw-r--r-- | tools/gccas/gccas.sh | 63 |
3 files changed, 76 insertions, 221 deletions
diff --git a/tools/gccas/Makefile b/tools/gccas/Makefile index 8664354..d1dd626 100644 --- a/tools/gccas/Makefile +++ b/tools/gccas/Makefile @@ -2,14 +2,21 @@ # # The LLVM Compiler Infrastructure # -# 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 file was developed by Reid Spencer and is distributed under the +# University of Illinois Open Source License. See LICENSE.TXT for details. # ##===----------------------------------------------------------------------===## LEVEL = ../.. -TOOLNAME = gccas -LINK_COMPONENTS = asmparser bcwriter scalaropts ipo ipa transforms -REQUIRES_EH := 1 - include $(LEVEL)/Makefile.common + +install-local:: $(PROJ_bindir)/gccas + +$(PROJ_bindir)/gccas : gccas.sh + sed "s#@TOOLDIR@#$(PROJ_bindir)#" $< > $@ + +all-local:: $(ToolDir)/gccas + +$(ToolDir)/gccas : gccas.sh + sed "s#@TOOLDIR@#$(ToolDir)#" $< > $@ + diff --git a/tools/gccas/gccas.cpp b/tools/gccas/gccas.cpp deleted file mode 100644 index 747465b..0000000 --- a/tools/gccas/gccas.cpp +++ /dev/null @@ -1,215 +0,0 @@ -//===-- gccas.cpp - The "optimizing assembler" used by the GCC frontend ---===// -// -// The LLVM Compiler Infrastructure -// -// 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 utility is designed to be used by the GCC frontend for creating bytecode -// files from its intermediate LLVM assembly. The requirements for this utility -// are thus slightly different than that of the standard `as' util. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Module.h" -#include "llvm/PassManager.h" -#include "llvm/Analysis/LoadValueNumbering.h" -#include "llvm/Analysis/Verifier.h" -#include "llvm/Assembly/Parser.h" -#include "llvm/Bytecode/WriteBytecodePass.h" -#include "llvm/Target/TargetData.h" -#include "llvm/Transforms/IPO.h" -#include "llvm/Transforms/Scalar.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/Streams.h" -#include "llvm/Support/ManagedStatic.h" -#include "llvm/System/Signals.h" -#include <iostream> -#include <memory> -#include <fstream> -using namespace llvm; - -namespace { - cl::opt<std::string> - InputFilename(cl::Positional,cl::desc("<input llvm assembly>"),cl::init("-")); - - cl::opt<std::string> - OutputFilename("o", cl::desc("Override output filename"), - cl::value_desc("filename")); - - cl::opt<bool> - Verify("verify", cl::desc("Verify each pass result")); - - cl::opt<bool> - DisableInline("disable-inlining", cl::desc("Do not run the inliner pass")); - - cl::opt<bool> - DisableOptimizations("disable-opt", - cl::desc("Do not run any optimization passes")); - - cl::opt<bool> - StripDebug("strip-debug", - cl::desc("Strip debugger symbol info from translation unit")); - - cl::opt<bool> - NoCompress("disable-compression", cl::init(true), - cl::desc("Don't compress the generated bytecode")); - - cl::opt<bool> TF("traditional-format", cl::Hidden, - cl::desc("Compatibility option: ignored")); -} - - -static inline void addPass(PassManager &PM, Pass *P) { - // Add the pass to the pass manager... - PM.add(P); - - // If we are verifying all of the intermediate steps, add the verifier... - if (Verify) PM.add(createVerifierPass()); -} - - -void AddConfiguredTransformationPasses(PassManager &PM) { - PM.add(createVerifierPass()); // Verify that input is correct - - addPass(PM, createLowerSetJmpPass()); // Lower llvm.setjmp/.longjmp - addPass(PM, createFunctionResolvingPass()); // Resolve (...) functions - - // If the -strip-debug command line option was specified, do it. - if (StripDebug) - addPass(PM, createStripSymbolsPass(true)); - - if (DisableOptimizations) return; - - addPass(PM, createRaiseAllocationsPass()); // call %malloc -> malloc inst - addPass(PM, createCFGSimplificationPass()); // Clean up disgusting code - addPass(PM, createPromoteMemoryToRegisterPass());// Kill useless allocas - addPass(PM, createGlobalOptimizerPass()); // Optimize out global vars - addPass(PM, createGlobalDCEPass()); // Remove unused fns and globs - addPass(PM, createIPConstantPropagationPass());// IP Constant Propagation - addPass(PM, createDeadArgEliminationPass()); // Dead argument elimination - addPass(PM, createInstructionCombiningPass()); // Clean up after IPCP & DAE - addPass(PM, createCFGSimplificationPass()); // Clean up after IPCP & DAE - - addPass(PM, createPruneEHPass()); // Remove dead EH info - - if (!DisableInline) - addPass(PM, createFunctionInliningPass()); // Inline small functions - addPass(PM, createArgumentPromotionPass()); // Scalarize uninlined fn args - - addPass(PM, createRaisePointerReferencesPass());// Recover type information - addPass(PM, createTailDuplicationPass()); // Simplify cfg by copying code - addPass(PM, createInstructionCombiningPass()); // Cleanup for scalarrepl. - addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs - addPass(PM, createScalarReplAggregatesPass()); // Break up aggregate allocas - addPass(PM, createInstructionCombiningPass()); // Combine silly seq's - addPass(PM, createCondPropagationPass()); // Propagate conditionals - - addPass(PM, createTailCallEliminationPass()); // Eliminate tail calls - addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs - addPass(PM, createReassociatePass()); // Reassociate expressions - addPass(PM, createLICMPass()); // Hoist loop invariants - addPass(PM, createLoopUnswitchPass()); // Unswitch loops. - addPass(PM, createInstructionCombiningPass()); // Clean up after LICM/reassoc - addPass(PM, createIndVarSimplifyPass()); // Canonicalize indvars - addPass(PM, createLoopUnrollPass()); // Unroll small loops - addPass(PM, createInstructionCombiningPass()); // Clean up after the unroller - addPass(PM, createLoadValueNumberingPass()); // GVN for load instructions - addPass(PM, createGCSEPass()); // Remove common subexprs - addPass(PM, createSCCPPass()); // Constant prop with SCCP - - // Run instcombine after redundancy elimination to exploit opportunities - // opened up by them. - addPass(PM, createInstructionCombiningPass()); - addPass(PM, createCondPropagationPass()); // Propagate conditionals - - addPass(PM, createDeadStoreEliminationPass()); // Delete dead stores - addPass(PM, createAggressiveDCEPass()); // SSA based 'Aggressive DCE' - addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs - addPass(PM, createSimplifyLibCallsPass()); // Library Call Optimizations - addPass(PM, createDeadTypeEliminationPass()); // Eliminate dead types - addPass(PM, createConstantMergePass()); // Merge dup global constants -} - - -int main(int argc, char **argv) { - llvm_shutdown_obj X; // Call llvm_shutdown() on exit. - try { - cl::ParseCommandLineOptions(argc, argv, - " llvm .s -> .o assembler for GCC\n"); - sys::PrintStackTraceOnErrorSignal(); - - ParseError Err; - std::auto_ptr<Module> M(ParseAssemblyFile(InputFilename,&Err)); - if (M.get() == 0) { - cerr << argv[0] << ": " << Err.getMessage() << "\n"; - return 1; - } - - std::ostream *Out = 0; - if (OutputFilename == "") { // Didn't specify an output filename? - if (InputFilename == "-") { - OutputFilename = "-"; - } else { - std::string IFN = InputFilename; - int Len = IFN.length(); - if (IFN[Len-2] == '.' && IFN[Len-1] == 's') { // Source ends in .s? - OutputFilename = std::string(IFN.begin(), IFN.end()-2); - } else { - OutputFilename = IFN; // Append a .o to it - } - OutputFilename += ".o"; - } - } - - if (OutputFilename == "-") - // FIXME: cout is not binary! - Out = &std::cout; - else { - std::ios::openmode io_mode = std::ios::out | std::ios::trunc | - std::ios::binary; - Out = new std::ofstream(OutputFilename.c_str(), io_mode); - - // Make sure that the Out file gets unlinked from the disk if we get a - // signal - sys::RemoveFileOnSignal(sys::Path(OutputFilename)); - } - - - if (!Out->good()) { - cerr << argv[0] << ": error opening " << OutputFilename << "!\n"; - return 1; - } - - // In addition to just parsing the input from GCC, we also want to spiff - // it up a little bit. Do this now. - PassManager Passes; - - // Add an appropriate TargetData instance for this module... - Passes.add(new TargetData(M.get())); - - // Add all of the transformation passes to the pass manager to do the - // cleanup and optimization of the GCC output. - AddConfiguredTransformationPasses(Passes); - - // Make sure everything is still good. - Passes.add(createVerifierPass()); - - // Write bytecode to file... - OStream L(*Out); - Passes.add(new WriteBytecodePass(&L,false,!NoCompress)); - - // Run our queue of passes all at once now, efficiently. - Passes.run(*M.get()); - - if (Out != &std::cout) delete Out; - return 0; - } catch (const std::string& msg) { - cerr << argv[0] << ": " << msg << "\n"; - } catch (...) { - cerr << argv[0] << ": Unexpected unknown exception occurred.\n"; - } - return 1; -} diff --git a/tools/gccas/gccas.sh b/tools/gccas/gccas.sh new file mode 100644 index 0000000..d1dab73 --- /dev/null +++ b/tools/gccas/gccas.sh @@ -0,0 +1,63 @@ +#!/bin/sh +##===- tools/gccas.sh ------------------------------------------*- bash -*-===## +# +# 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. +# +##===----------------------------------------------------------------------===## +# +# Synopsis: This shell script is a replacement for the old "gccas" tool that +# existed in LLVM versions before 2.0. The functionality of gccas has +# now been moved to opt and llvm-as. This shell script provides +# backwards compatibility so build environments invoking gccas can +# still get the net effect of llvm-as/opt by running gccas. +# +# Syntax: gccas OPTIONS... [asm file] +# +##===----------------------------------------------------------------------===## +# +TOOLDIR=@TOOLDIR@ +OPTOPTS="-std-compile-opts -f" +ASOPTS="" +lastwasdasho=0 +for option in "$@" ; do + case "$option" in + -disable-opt) + OPTOPTS="$OPTOPTS $option" + ;; + -disable-inlining) + OPTOPTS="$OPTOPTS $option" + ;; + -verify) + OPTOPTS="$OPTOPTS -verify-each" + ;; + -strip-debug) + OPTOPTS="$OPTOPTS $option" + ;; + -o) + OPTOPTS="$OPTOPTS -o" + lastwasdasho=1 + ;; + -disable-compression) + # ignore + ;; + -traditional-format) + # ignore + ;; + -*) + echo "gccas: Unrecognized option '$option'" + exit 1 + ;; + *) + if test $lastwasdasho -eq 1 ; then + OPTOPTS="$OPTOPTS $option" + lastwasdasho=0 + else + ASOPTS="$ASOPTS $option" + fi + ;; + esac +done +${TOOLDIR}/llvm-as $ASOPTS -o - | ${TOOLDIR}/opt $OPTOPTS |