diff options
author | Chris Lattner <sabre@nondot.org> | 2002-02-03 07:54:10 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-02-03 07:54:10 +0000 |
commit | c8896771951d0cc769b6b40b27bcb420685cf718 (patch) | |
tree | de203437b1377ab8c24e6551af90c4496aa4b7e7 /tools/llc | |
parent | 71947fdbc607c2eca3ddd456197c240ad5157f40 (diff) | |
download | llvm-c8896771951d0cc769b6b40b27bcb420685cf718.tar.gz llvm-c8896771951d0cc769b6b40b27bcb420685cf718.tar.bz2 llvm-c8896771951d0cc769b6b40b27bcb420685cf718.tar.xz |
Switch over to a model where we compile each method, emit assembly, then free
machineinstr memory before starting on the next method.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1659 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llc')
-rw-r--r-- | tools/llc/llc.cpp | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index 8d9094c4c3..64fd833774 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -71,22 +71,42 @@ public: //===---------------------------------------------------------------------===// -// EmitAssembly Pass +// EmitMethodAssembly Pass // -// Write assembly code to specified output stream +// Write assembly code for each method to specified output stream //===---------------------------------------------------------------------===// -class EmitAssembly : public Pass { +class EmitMethodAssembly : public MethodPass { + TargetMachine &Target; // Target to compile for + std::ostream *Out; // Stream to print on +public: + inline EmitMethodAssembly(TargetMachine &T, std::ostream *O) + : Target(T), Out(O) {} + + virtual bool runOnMethod(Method *M) { + Target.emitAssembly(M, *Out); + Target.freeCompiledMethod(M); // Release memory for the method + return false; + } +}; + + +//===---------------------------------------------------------------------===// +// EmitGlobalsAssembly Pass +// +// Write assembly code for global values to specified output stream +//===---------------------------------------------------------------------===// + +class EmitGlobalsAssembly : public Pass { const TargetMachine &Target; // Target to compile for std::ostream *Out; // Stream to print on bool DeleteStream; // Delete stream in dtor? public: - inline EmitAssembly(const TargetMachine &T, std::ostream *O, bool D) + inline EmitGlobalsAssembly(const TargetMachine &T, std::ostream *O, bool D) : Target(T), Out(O), DeleteStream(D) {} virtual bool run(Module *M) { Target.emitAssembly(M, *Out); - if (DeleteStream) delete Out; return false; } @@ -201,8 +221,16 @@ int main(int argc, char **argv) { } } - // Output assembly language to the .s file - Passes.add(new EmitAssembly(Target, Out, Out != &std::cout)); + // Output assembly language to the .s file. Assembly emission is split into + // two parts: Method output and Global value output. This is because method + // output is pipelined with all of the rest of code generation stuff, + // allowing machine code representations for methods to be free'd after the + // method has been emitted. + // + Passes.add(new EmitMethodAssembly(Target, Out)); // for methods + + // For global values... + Passes.add(new EmitGlobalsAssembly(Target, Out, Out != &std::cout)); } // Run our queue of passes all at once now, efficiently. |