Mercurial > projects > ldc
diff tester.d @ 50:6fcc08a4d406 trunk
[svn r54] Added support for nested delegates referencing parent's stack variables.
Replaced tester.sh with a version written in D.
A few bugfixes.
author | lindquist |
---|---|
date | Mon, 22 Oct 2007 15:40:56 +0200 |
parents | |
children | 1700239cab2e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tester.d Mon Oct 22 15:40:56 2007 +0200 @@ -0,0 +1,129 @@ +module tester; + +import std.file; +import std.path; +import std.process; +import std.stdio; +import std.string; + +void printUsage(string cmd) +{ + writefln("Usage:"); + writefln(" ",cmd," %%name %%cmd %%..."); + writefln("%%name:"); + writefln(" name of test without path or extension. eg: bug1"); + writefln("%%cmd:"); + writefln(" c = compile module"); + writefln(" gdb = same as 'c' but launches compiler in gdb"); + writefln(" ll = compile module and print the disassemled bitcode"); + writefln(" llo = compile and optimize module, then print the disassemled bitcode"); + writefln("%%..."); + writefln(" the rest of the command line options are passed directly to llvmdc"); +} + +string testFileName(string test, string ext="") +{ + return "test/"~test~ext; +} + +// couldnt get execvp to work +int execute(string cmd) +{ + return system(cmd); +} +int execute(string cmd, string[] args) +{ + char[] c = cmd.dup; + foreach(v; args) { + c ~= ' '; + c ~= v; + } + writefln(c); + return system(c); +} + +void compileTest(string test, string[] args) +{ + args = [testFileName(test,".d")] ~ args; + if (execute("llvmdc", args) != 0) { + throw new Exception("Failed to compile test: "~test); + } +} + +void disassembleTest(string test, bool print) +{ + string[] args = ["-f",testFileName(test,".bc")]; + if (execute("llvm-dis", args) != 0) { + throw new Exception("Failed to disassemble test: "~test); + } + if (print) { + execute("cat "~testFileName(test,".ll")); + } +} + +void debugTest(string test, string[] common) +{ + string[] args = ["--args", "llvmdc", testFileName(test,".d")]; + args ~= common; + if (execute("gdb", args) != 0) { + throw new Exception("Failed to compile test: '"~test~"' for debugging"); + } +} + +void optimizeTest(string test) +{ + string bc = testFileName(test,".bc"); + if (execute("opt -std-compile-opts -f -o="~bc~" "~bc)) { + throw new Exception("Failed to optimize test: "~test); + } +} + +void runTest(string test) +{ + if (execute(testFileName(test))) { + throw new Exception("Failed to run test: "~test); + } +} + +int main(string[] args) +{ + if (args.length < 3) { + printUsage(args[0]); + return 1; + } + + string test = args[1]; + string kind = args[2]; + + string[] compilelink = ["-Itest","-odtest"]; + compilelink ~= args[3..$]; + string[] compileonly = compilelink.dup; + + compileonly ~= "-c"; + compilelink ~= "-of"~testFileName(test); + + switch(kind) { + case "c": + compileTest(test,compileonly); + break; + case "gdb": + debugTest(test,compileonly); + break; + case "ll": + compileTest(test,compileonly); + disassembleTest(test,true); + break; + case "llo": + compileTest(test,compileonly); + optimizeTest(test); + disassembleTest(test,true); + break; + case "run": + compileTest(test,compilelink); + runTest(test); + break; + default: + throw new Exception("Invalid command: "~kind); + } + return 0; +}