diff options
Diffstat (limited to 'projects/Stacker/lib')
-rw-r--r-- | projects/Stacker/lib/compiler/StackerCompiler.cpp | 25 | ||||
-rw-r--r-- | projects/Stacker/lib/runtime/stacker_rt.c | 38 |
2 files changed, 46 insertions, 17 deletions
diff --git a/projects/Stacker/lib/compiler/StackerCompiler.cpp b/projects/Stacker/lib/compiler/StackerCompiler.cpp index 4cd0646103..931796f9a8 100644 --- a/projects/Stacker/lib/compiler/StackerCompiler.cpp +++ b/projects/Stacker/lib/compiler/StackerCompiler.cpp @@ -131,8 +131,8 @@ StackerCompiler::compile( TheStack = new GlobalVariable( /*type=*/ stack_type, /*isConstant=*/ false, - /*Linkage=*/ GlobalValue::AppendingLinkage, - /*initializer=*/Constant::getNullValue(stack_type), + /*Linkage=*/ GlobalValue::LinkOnceLinkage, + /*initializer=*/ Constant::getNullValue(stack_type), /*name=*/ "_stack_", /*parent=*/ TheModule ); @@ -144,7 +144,7 @@ StackerCompiler::compile( /*type=*/Type::LongTy, /*isConstant=*/false, /*Linkage=*/GlobalValue::LinkOnceLinkage, - /*initializer=*/Constant::getNullValue(Type::LongTy), + /*initializer=*/ Constant::getNullValue(Type::LongTy), /*name=*/"_index_", /*parent=*/TheModule ); @@ -559,28 +559,19 @@ Function* StackerCompiler::handle_main_definition( Function* func ) { // Set the name of the function defined as the Stacker main + // This will get called by the "main" that is defined in + // the runtime library. func->setName( "_MAIN_"); - // Create the actual main for the runtime system. - //std::vector<const Type*> params; // No parameters - //FunctionType* main_type = FunctionType::get( Type::IntTy, params, false ); - Function* SystemMain = new Function( - DefinitionType, - GlobalValue::ExternalLinkage, - "main", TheModule); - - // Create a basic block that just calls the STACKERMAIN function. Note - // that the basic block is automatically inserted into the end of SystemMain - BasicBlock* bb = new BasicBlock( (echo?"main":"a"), SystemMain ) ; - bb->getInstList().push_back( new CallInst( func, no_arguments) ); - bb->getInstList().push_back( new ReturnInst() ); - // Turn "_stack_" into an initialized variable since this is the main // module. This causes it to not be "external" but defined in this module. TheStack->setInitializer( Constant::getNullValue(stack_type) ); + TheStack->setLinkage( GlobalValue::LinkOnceLinkage ); // Turn "_index_" into an intialized variable for the same reason. TheIndex->setInitializer( Constant::getNullValue(Type::LongTy) ); + TheIndex->setLinkage( GlobalValue::LinkOnceLinkage ); + return func; } diff --git a/projects/Stacker/lib/runtime/stacker_rt.c b/projects/Stacker/lib/runtime/stacker_rt.c index 46edf14c13..7deb54d6ea 100644 --- a/projects/Stacker/lib/runtime/stacker_rt.c +++ b/projects/Stacker/lib/runtime/stacker_rt.c @@ -17,10 +17,13 @@ // //===----------------------------------------------------------------------===// +#include "ctype.h" #include "stdio.h" +#include "stdlib.h" extern long _index_; extern int _stack_[1024]; +extern void _MAIN_(); void _stacker_dump_stack_() @@ -32,3 +35,38 @@ _stacker_dump_stack_() printf("#%03d: %d\n", i, _stack_[i] ); } } + +int +main ( int argc, char** argv ) +{ + // Avoid modifying argc + int a = argc; + + // Make sure we're starting with the right index + _index_ = 0; + + // Copy the arguments to the stack in reverse order + // so that they get popped in the order presented + while ( a > 0 ) + { + if ( isdigit( argv[--a][0] ) ) + { + _stack_[_index_++] = atoi( argv[a] ); + } + else + { + _stack_[_index_++] = (int) argv[a]; + } + } + + // Put the argument count on the stack + _stack_[_index_] = argc; + + // Invoke the user's main program + _MAIN_(); + + // Return last item on the stack + if ( _index_ >= 0 ) + return _stack_[_index_]; + return -1; +} |