summaryrefslogtreecommitdiff
path: root/tools/gccas
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2001-10-31 04:28:11 +0000
committerChris Lattner <sabre@nondot.org>2001-10-31 04:28:11 +0000
commitecbde333a2ec5a32958fc5c9c4d87fb50c07b176 (patch)
tree4cc8b8f02eb0cd7245589ddea03bfe2c4211147c /tools/gccas
parenta3ad7bbbb1abc13950d67ef6d5114a45eb9f17f7 (diff)
downloadllvm-ecbde333a2ec5a32958fc5c9c4d87fb50c07b176.tar.gz
llvm-ecbde333a2ec5a32958fc5c9c4d87fb50c07b176.tar.bz2
llvm-ecbde333a2ec5a32958fc5c9c4d87fb50c07b176.tar.xz
Initial checkin of GCCAS
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1058 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/gccas')
-rw-r--r--tools/gccas/Makefile6
-rw-r--r--tools/gccas/gccas.cpp74
2 files changed, 80 insertions, 0 deletions
diff --git a/tools/gccas/Makefile b/tools/gccas/Makefile
new file mode 100644
index 0000000000..5efda5c1c0
--- /dev/null
+++ b/tools/gccas/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../..
+
+TOOLNAME = gccas
+USEDLIBS = asmparser bcwriter analysis transforms opt vmcore asmwriter support
+
+include $(LEVEL)/Makefile.common
diff --git a/tools/gccas/gccas.cpp b/tools/gccas/gccas.cpp
new file mode 100644
index 0000000000..4d1f0b2d79
--- /dev/null
+++ b/tools/gccas/gccas.cpp
@@ -0,0 +1,74 @@
+//===------------------------------------------------------------------------===
+// LLVM 'GCCAS' UTILITY
+//
+// This utility is designed to be used by the GCC frontend for creating
+// bytecode files from it's 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/Assembly/Parser.h"
+#include "llvm/Transforms/CleanupGCCOutput.h"
+#include "llvm/Optimizations/DCE.h"
+#include "llvm/Bytecode/Writer.h"
+#include "llvm/Support/CommandLine.h"
+#include <memory>
+#include <fstream>
+#include <string>
+
+cl::String InputFilename ("", "Parse <arg> file, compile to bytecode",
+ cl::Required, "");
+cl::String OutputFilename("o", "Override output filename", cl::NoFlags, "");
+
+int main(int argc, char **argv) {
+ cl::ParseCommandLineOptions(argc, argv, " llvm .ll -> .bc assembler\n");
+
+ ostream *Out = 0;
+ std::auto_ptr<Module> M;
+ try {
+ // Parse the file now...
+ M.reset(ParseAssemblyFile(InputFilename));
+ } catch (const ParseException &E) {
+ cerr << E.getMessage() << endl;
+ return 1;
+ }
+
+ if (M.get() == 0) {
+ cerr << "assembly didn't read correctly.\n";
+ return 1;
+ }
+
+ if (OutputFilename == "") { // Didn't specify an output filename?
+ string IFN = InputFilename;
+ int Len = IFN.length();
+ if (IFN[Len-2] == '.' && IFN[Len-1] == 's') { // Source ends in .s?
+ OutputFilename = string(IFN.begin(), IFN.end()-2);
+ } else {
+ OutputFilename = IFN; // Append a .o to it
+ }
+ OutputFilename += ".o";
+ }
+
+ Out = new ofstream(OutputFilename.c_str(), ios::out);
+ if (!Out->good()) {
+ cerr << "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.
+ //
+ vector<Pass*> Passes;
+ Passes.push_back(new CleanupGCCOutput());
+ Passes.push_back(new opt::DeadCodeElimination());
+
+ // Run our queue of passes all at once now, efficiently. This form of
+ // runAllPasses frees the Pass objects after runAllPasses completes.
+ //
+ Pass::runAllPassesAndFree(M.get(), Passes);
+
+ WriteBytecodeToFile(M.get(), *Out);
+ return 0;
+}
+