Modulinos: Difference between revisions

Content added Content deleted
(Removed "Incorrect". If you compile scriptedmain.c/.cpp and a test file test.c/test.cpp, scriptedmain's main() will not run, which is the intended behavior.)
(Added LLVM)
Line 237: Line 237:
}
}
}
}
}</lang>

=={{header|LLVM}}==
LLVM has scripted main by default.

<lang llvm>@msg_directory = internal constant [15 x i8] c"Directory: %s\0A\00"
@msg_program = internal constant [13 x i8] c"Program: %s\0A\00"
@msg_argc = internal constant [20 x i8] c"Number of Args: %d\0A\00"
@msg_arg = internal constant [10 x i8] c"Arg = %s\0A\00"

declare i32 @printf(i8* noalias nocapture, ...)
declare i8* @getcwd(i8*, i32)

define i32 @main(i32 %argc, i8** %argv) {
%cwd = alloca [1024 x i8]

%cwd_ptr = getelementptr inbounds [1024 x i8]* %cwd, i32 0, i32 0

call i8* @getcwd(i8* %cwd_ptr, i32 1024)

call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @msg_directory, i32 0, i32 0), i8* %cwd_ptr)

%program_ptr = getelementptr inbounds i8** %argv, i32 0

%program = load i8** %program_ptr

call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @msg_program, i32 0, i32 0), i8* %program)

call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([20 x i8]* @msg_argc, i32 0, i32 0), i32 %argc)

%i = alloca i32
store i32 0, i32* %i
br label %for_args

for_args:

%i_val = load i32* %i

%arg_ptr = getelementptr inbounds i8** %argv, i32 %i_val
%arg = load i8** %arg_ptr
call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @msg_arg, i32 0, i32 0), i8* %arg)

%new_i_val = add i32 %i_val, 1
store i32 %new_i_val, i32* %i

%more_args = icmp slt i32 %new_i_val, %argc
br i1 %more_args, label %for_args, label %end_for_args

end_for_args:

ret i32 0
}</lang>
}</lang>