1*67e74705SXin Li#!/usr/dcs/software/supported/bin/perl -w 2*67e74705SXin Li# LLVM Web Demo script 3*67e74705SXin Li# 4*67e74705SXin Li 5*67e74705SXin Liuse strict; 6*67e74705SXin Liuse CGI; 7*67e74705SXin Liuse POSIX; 8*67e74705SXin Liuse Mail::Send; 9*67e74705SXin Li 10*67e74705SXin Li$| = 1; 11*67e74705SXin Li 12*67e74705SXin Limy $ROOT = "/tmp/webcompile"; 13*67e74705SXin Li#my $ROOT = "/home/vadve/lattner/webcompile"; 14*67e74705SXin Li 15*67e74705SXin Liopen( STDERR, ">&STDOUT" ) or die "can't redirect stderr to stdout"; 16*67e74705SXin Li 17*67e74705SXin Liif ( !-d $ROOT ) { mkdir( $ROOT, 0777 ); } 18*67e74705SXin Li 19*67e74705SXin Limy $LOGFILE = "$ROOT/log.txt"; 20*67e74705SXin Limy $FORM_URL = 'index.cgi'; 21*67e74705SXin Limy $MAILADDR = '[email protected]'; 22*67e74705SXin Limy $CONTACT_ADDRESS = 'Questions or comments? Email the <a href="http://lists.llvm.org/mailman/listinfo/llvm-dev">LLVM-dev mailing list</a>.'; 23*67e74705SXin Limy $LOGO_IMAGE_URL = 'cathead.png'; 24*67e74705SXin Limy $TIMEOUTAMOUNT = 20; 25*67e74705SXin Li$ENV{'LD_LIBRARY_PATH'} = '/home/vadve/shared/localtools/fc1/lib/'; 26*67e74705SXin Li 27*67e74705SXin Limy @PREPENDPATHDIRS = 28*67e74705SXin Li ( 29*67e74705SXin Li '/home/vadve/shared/llvm-gcc4.0-2.1/bin/', 30*67e74705SXin Li '/home/vadve/shared/llvm-2.1/Release/bin'); 31*67e74705SXin Li 32*67e74705SXin Limy $defaultsrc = "#include <stdio.h>\n#include <stdlib.h>\n\n" . 33*67e74705SXin Li "int power(int X) {\n if (X == 0) return 1;\n" . 34*67e74705SXin Li " return X*power(X-1);\n}\n\n" . 35*67e74705SXin Li "int main(int argc, char **argv) {\n" . 36*67e74705SXin Li " printf(\"%d\\n\", power(atoi(argv[0])));\n}\n"; 37*67e74705SXin Li 38*67e74705SXin Lisub getname { 39*67e74705SXin Li my ($extension) = @_; 40*67e74705SXin Li for ( my $count = 0 ; ; $count++ ) { 41*67e74705SXin Li my $name = 42*67e74705SXin Li sprintf( "$ROOT/_%d_%d%s", $$, $count, $extension ); 43*67e74705SXin Li if ( !-f $name ) { return $name; } 44*67e74705SXin Li } 45*67e74705SXin Li} 46*67e74705SXin Li 47*67e74705SXin Limy $c; 48*67e74705SXin Li 49*67e74705SXin Lisub barf { 50*67e74705SXin Li print "<b>", @_, "</b>\n"; 51*67e74705SXin Li print $c->end_html; 52*67e74705SXin Li system("rm -f $ROOT/locked"); 53*67e74705SXin Li exit 1; 54*67e74705SXin Li} 55*67e74705SXin Li 56*67e74705SXin Lisub writeIntoFile { 57*67e74705SXin Li my $extension = shift @_; 58*67e74705SXin Li my $contents = join "", @_; 59*67e74705SXin Li my $name = getname($extension); 60*67e74705SXin Li local (*FILE); 61*67e74705SXin Li open( FILE, ">$name" ) or barf("Can't write to $name: $!"); 62*67e74705SXin Li print FILE $contents; 63*67e74705SXin Li close FILE; 64*67e74705SXin Li return $name; 65*67e74705SXin Li} 66*67e74705SXin Li 67*67e74705SXin Lisub addlog { 68*67e74705SXin Li my ( $source, $pid, $result ) = @_; 69*67e74705SXin Li open( LOG, ">>$LOGFILE" ); 70*67e74705SXin Li my $time = scalar localtime; 71*67e74705SXin Li my $remotehost = $ENV{'REMOTE_ADDR'}; 72*67e74705SXin Li print LOG "[$time] [$remotehost]: $pid\n"; 73*67e74705SXin Li print LOG "<<<\n$source\n>>>\nResult is: <<<\n$result\n>>>\n"; 74*67e74705SXin Li close LOG; 75*67e74705SXin Li} 76*67e74705SXin Li 77*67e74705SXin Lisub dumpFile { 78*67e74705SXin Li my ( $header, $file ) = @_; 79*67e74705SXin Li my $result; 80*67e74705SXin Li open( FILE, "$file" ) or barf("Can't read $file: $!"); 81*67e74705SXin Li while (<FILE>) { 82*67e74705SXin Li $result .= $_; 83*67e74705SXin Li } 84*67e74705SXin Li close FILE; 85*67e74705SXin Li my $UnhilightedResult = $result; 86*67e74705SXin Li my $HtmlResult = 87*67e74705SXin Li "<h3>$header</h3>\n<pre>\n" . $c->escapeHTML($result) . "\n</pre>\n"; 88*67e74705SXin Li if (wantarray) { 89*67e74705SXin Li return ( $UnhilightedResult, $HtmlResult ); 90*67e74705SXin Li } 91*67e74705SXin Li else { 92*67e74705SXin Li return $HtmlResult; 93*67e74705SXin Li } 94*67e74705SXin Li} 95*67e74705SXin Li 96*67e74705SXin Lisub syntaxHighlightLLVM { 97*67e74705SXin Li my ($input) = @_; 98*67e74705SXin Li $input =~ s@\b(void|i8|i1|i16|i32|i64|float|double|type|label|opaque)\b@<span class="llvm_type">$1</span>@g; 99*67e74705SXin Li $input =~ s@\b(add|sub|mul|div|rem|and|or|xor|setne|seteq|setlt|setgt|setle|setge|phi|tail|call|cast|to|shl|shr|vaarg|vanext|ret|br|switch|invoke|unwind|malloc|alloca|free|load|store|getelementptr|begin|end|true|false|declare|global|constant|const|internal|uninitialized|external|implementation|linkonce|weak|appending|null|to|except|not|target|endian|pointersize|big|little|volatile)\b@<span class="llvm_keyword">$1</span>@g; 100*67e74705SXin Li 101*67e74705SXin Li # Add links to the FAQ. 102*67e74705SXin Li $input =~ s@(_ZNSt8ios_base4Init[DC]1Ev)@<a href="../docs/FAQ.html#iosinit">$1</a>@g; 103*67e74705SXin Li $input =~ s@\bundef\b@<a href="../docs/FAQ.html#undef">undef</a>@g; 104*67e74705SXin Li return $input; 105*67e74705SXin Li} 106*67e74705SXin Li 107*67e74705SXin Lisub mailto { 108*67e74705SXin Li my ( $recipient, $body ) = @_; 109*67e74705SXin Li my $msg = 110*67e74705SXin Li new Mail::Send( Subject => "LLVM Demo Page Run", To => $recipient ); 111*67e74705SXin Li my $fh = $msg->open(); 112*67e74705SXin Li print $fh $body; 113*67e74705SXin Li $fh->close(); 114*67e74705SXin Li} 115*67e74705SXin Li 116*67e74705SXin Li$c = new CGI; 117*67e74705SXin Liprint $c->header; 118*67e74705SXin Li 119*67e74705SXin Liprint <<EOF; 120*67e74705SXin Li<html> 121*67e74705SXin Li<head> 122*67e74705SXin Li <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 123*67e74705SXin Li <title>Try out LLVM in your browser!</title> 124*67e74705SXin Li <style> 125*67e74705SXin Li \@import url("syntax.css"); 126*67e74705SXin Li \@import url("http://llvm.org/llvm.css"); 127*67e74705SXin Li </style> 128*67e74705SXin Li</head> 129*67e74705SXin Li<body leftmargin="10" marginwidth="10"> 130*67e74705SXin Li 131*67e74705SXin Li<div class="www_sectiontitle"> 132*67e74705SXin Li Try out LLVM in your browser! 133*67e74705SXin Li</div> 134*67e74705SXin Li 135*67e74705SXin Li<table border=0><tr><td> 136*67e74705SXin Li<img align=right width=100 height=111 src="$LOGO_IMAGE_URL"> 137*67e74705SXin Li</td><td> 138*67e74705SXin LiEOF 139*67e74705SXin Li 140*67e74705SXin Liif ( -f "$ROOT/locked" ) { 141*67e74705SXin Li my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$locktime) = 142*67e74705SXin Li stat("$ROOT/locked"); 143*67e74705SXin Li my $currtime = time(); 144*67e74705SXin Li if ($locktime + 60 > $currtime) { 145*67e74705SXin Li print "This page is already in use by someone else at this "; 146*67e74705SXin Li print "time, try reloading in a second or two. Meow!</td></tr></table>'\n"; 147*67e74705SXin Li exit 0; 148*67e74705SXin Li } 149*67e74705SXin Li} 150*67e74705SXin Li 151*67e74705SXin Lisystem("touch $ROOT/locked"); 152*67e74705SXin Li 153*67e74705SXin Liprint <<END; 154*67e74705SXin LiBitter Melon the cat says, paste a C/C++ program in the text box or upload 155*67e74705SXin Lione from your computer, and you can see LLVM compile it, meow!! 156*67e74705SXin Li</td></tr></table><p> 157*67e74705SXin LiEND 158*67e74705SXin Li 159*67e74705SXin Liprint $c->start_multipart_form( 'POST', $FORM_URL ); 160*67e74705SXin Li 161*67e74705SXin Limy $source = $c->param('source'); 162*67e74705SXin Li 163*67e74705SXin Li 164*67e74705SXin Li# Start the user out with something valid if no code. 165*67e74705SXin Li$source = $defaultsrc if (!defined($source)); 166*67e74705SXin Li 167*67e74705SXin Liprint '<table border="0"><tr><td>'; 168*67e74705SXin Li 169*67e74705SXin Liprint "Type your source code in below: (<a href='DemoInfo.html#hints'>hints and 170*67e74705SXin Liadvice</a>)<br>\n"; 171*67e74705SXin Li 172*67e74705SXin Liprint $c->textarea( 173*67e74705SXin Li -name => "source", 174*67e74705SXin Li -rows => 16, 175*67e74705SXin Li -columns => 60, 176*67e74705SXin Li -default => $source 177*67e74705SXin Li), "<br>"; 178*67e74705SXin Li 179*67e74705SXin Liprint "Or upload a file: "; 180*67e74705SXin Liprint $c->filefield( -name => 'uploaded_file', -default => '' ); 181*67e74705SXin Li 182*67e74705SXin Liprint "<p />\n"; 183*67e74705SXin Li 184*67e74705SXin Li 185*67e74705SXin Liprint '<p></td><td valign=top>'; 186*67e74705SXin Li 187*67e74705SXin Liprint "<center><h3>General Options</h3></center>"; 188*67e74705SXin Li 189*67e74705SXin Liprint "Source language: ", 190*67e74705SXin Li $c->radio_group( 191*67e74705SXin Li -name => 'language', 192*67e74705SXin Li -values => [ 'C', 'C++' ], 193*67e74705SXin Li -default => 'C' 194*67e74705SXin Li ), "<p>"; 195*67e74705SXin Li 196*67e74705SXin Liprint $c->checkbox( 197*67e74705SXin Li -name => 'linkopt', 198*67e74705SXin Li -label => 'Run link-time optimizer', 199*67e74705SXin Li -checked => 'checked' 200*67e74705SXin Li ),' <a href="DemoInfo.html#lto">?</a><br>'; 201*67e74705SXin Li 202*67e74705SXin Liprint $c->checkbox( 203*67e74705SXin Li -name => 'showstats', 204*67e74705SXin Li -label => 'Show detailed pass statistics' 205*67e74705SXin Li ), ' <a href="DemoInfo.html#stats">?</a><br>'; 206*67e74705SXin Li 207*67e74705SXin Liprint $c->checkbox( 208*67e74705SXin Li -name => 'cxxdemangle', 209*67e74705SXin Li -label => 'Demangle C++ names' 210*67e74705SXin Li ),' <a href="DemoInfo.html#demangle">?</a><p>'; 211*67e74705SXin Li 212*67e74705SXin Li 213*67e74705SXin Liprint "<center><h3>Output Options</h3></center>"; 214*67e74705SXin Li 215*67e74705SXin Liprint $c->checkbox( 216*67e74705SXin Li -name => 'showbcanalysis', 217*67e74705SXin Li -label => 'Show detailed bytecode analysis' 218*67e74705SXin Li ),' <a href="DemoInfo.html#bcanalyzer">?</a><br>'; 219*67e74705SXin Li 220*67e74705SXin Liprint $c->checkbox( 221*67e74705SXin Li -name => 'showllvm2cpp', 222*67e74705SXin Li -label => 'Show LLVM C++ API code' 223*67e74705SXin Li ), ' <a href="DemoInfo.html#llvm2cpp">?</a>'; 224*67e74705SXin Li 225*67e74705SXin Liprint "</td></tr></table>"; 226*67e74705SXin Li 227*67e74705SXin Liprint "<center>", $c->submit(-value=> 'Compile Source Code'), 228*67e74705SXin Li "</center>\n", $c->endform; 229*67e74705SXin Li 230*67e74705SXin Liprint "\n<p>If you have questions about the LLVM code generated by the 231*67e74705SXin Lifront-end, please check the <a href='/docs/FAQ.html#cfe_code'>FAQ</a> and 232*67e74705SXin Lithe demo page <a href='DemoInfo.html#hints'>hints section</a>. 233*67e74705SXin Li</p>\n"; 234*67e74705SXin Li 235*67e74705SXin Li$ENV{'PATH'} = ( join ( ':', @PREPENDPATHDIRS ) ) . ":" . $ENV{'PATH'}; 236*67e74705SXin Li 237*67e74705SXin Lisub sanitychecktools { 238*67e74705SXin Li my $sanitycheckfail = ''; 239*67e74705SXin Li 240*67e74705SXin Li # insert tool-specific sanity checks here 241*67e74705SXin Li $sanitycheckfail .= ' llvm-dis' 242*67e74705SXin Li if `llvm-dis --help 2>&1` !~ /ll disassembler/; 243*67e74705SXin Li 244*67e74705SXin Li $sanitycheckfail .= ' llvm-gcc' 245*67e74705SXin Li if ( `llvm-gcc --version 2>&1` !~ /Free Software Foundation/ ); 246*67e74705SXin Li 247*67e74705SXin Li $sanitycheckfail .= ' llvm-ld' 248*67e74705SXin Li if `llvm-ld --help 2>&1` !~ /llvm linker/; 249*67e74705SXin Li 250*67e74705SXin Li $sanitycheckfail .= ' llvm-bcanalyzer' 251*67e74705SXin Li if `llvm-bcanalyzer --help 2>&1` !~ /bcanalyzer/; 252*67e74705SXin Li 253*67e74705SXin Li barf( 254*67e74705SXin Li"<br/>The demo page is currently unavailable. [tools: ($sanitycheckfail ) failed sanity check]" 255*67e74705SXin Li ) 256*67e74705SXin Li if $sanitycheckfail; 257*67e74705SXin Li} 258*67e74705SXin Li 259*67e74705SXin Lisanitychecktools(); 260*67e74705SXin Li 261*67e74705SXin Lisub try_run { 262*67e74705SXin Li my ( $program, $commandline, $outputFile ) = @_; 263*67e74705SXin Li my $retcode = 0; 264*67e74705SXin Li 265*67e74705SXin Li eval { 266*67e74705SXin Li local $SIG{ALRM} = sub { die "timeout"; }; 267*67e74705SXin Li alarm $TIMEOUTAMOUNT; 268*67e74705SXin Li $retcode = system($commandline); 269*67e74705SXin Li alarm 0; 270*67e74705SXin Li }; 271*67e74705SXin Li if ( $@ and $@ =~ /timeout/ ) { 272*67e74705SXin Li barf("Program $program took too long, compile time limited for the web script, sorry!\n"); 273*67e74705SXin Li } 274*67e74705SXin Li if ( -s $outputFile ) { 275*67e74705SXin Li print scalar dumpFile( "Output from $program", $outputFile ); 276*67e74705SXin Li } 277*67e74705SXin Li #print "<p>Finished dumping command output.</p>\n"; 278*67e74705SXin Li if ( WIFEXITED($retcode) && WEXITSTATUS($retcode) != 0 ) { 279*67e74705SXin Li barf( 280*67e74705SXin Li"$program exited with an error. Please correct source and resubmit.<p>\n" . 281*67e74705SXin Li"Please note that this form only allows fully formed and correct source" . 282*67e74705SXin Li" files. It will not compile fragments of code.<p>" 283*67e74705SXin Li ); 284*67e74705SXin Li } 285*67e74705SXin Li if ( WIFSIGNALED($retcode) != 0 ) { 286*67e74705SXin Li my $sig = WTERMSIG($retcode); 287*67e74705SXin Li barf( 288*67e74705SXin Li "Ouch, $program caught signal $sig. Sorry, better luck next time!\n" 289*67e74705SXin Li ); 290*67e74705SXin Li } 291*67e74705SXin Li} 292*67e74705SXin Li 293*67e74705SXin Limy %suffixes = ( 294*67e74705SXin Li 'Java' => '.java', 295*67e74705SXin Li 'JO99' => '.jo9', 296*67e74705SXin Li 'C' => '.c', 297*67e74705SXin Li 'C++' => '.cc', 298*67e74705SXin Li 'Stacker' => '.st', 299*67e74705SXin Li 'preprocessed C' => '.i', 300*67e74705SXin Li 'preprocessed C++' => '.ii' 301*67e74705SXin Li); 302*67e74705SXin Limy %languages = ( 303*67e74705SXin Li '.jo9' => 'JO99', 304*67e74705SXin Li '.java' => 'Java', 305*67e74705SXin Li '.c' => 'C', 306*67e74705SXin Li '.i' => 'preprocessed C', 307*67e74705SXin Li '.ii' => 'preprocessed C++', 308*67e74705SXin Li '.cc' => 'C++', 309*67e74705SXin Li '.cpp' => 'C++', 310*67e74705SXin Li '.st' => 'Stacker' 311*67e74705SXin Li); 312*67e74705SXin Li 313*67e74705SXin Limy $uploaded_file_name = $c->param('uploaded_file'); 314*67e74705SXin Liif ($uploaded_file_name) { 315*67e74705SXin Li if ($source) { 316*67e74705SXin Li barf( 317*67e74705SXin Li"You must choose between uploading a file and typing code in. You can't do both at the same time." 318*67e74705SXin Li ); 319*67e74705SXin Li } 320*67e74705SXin Li $uploaded_file_name =~ s/^.*(\.[A-Za-z]+)$/$1/; 321*67e74705SXin Li my $language = $languages{$uploaded_file_name}; 322*67e74705SXin Li $c->param( 'language', $language ); 323*67e74705SXin Li 324*67e74705SXin Li print "<p>Processing uploaded file. It looks like $language.</p>\n"; 325*67e74705SXin Li my $fh = $c->upload('uploaded_file'); 326*67e74705SXin Li if ( !$fh ) { 327*67e74705SXin Li barf( "Error uploading file: " . $c->cgi_error ); 328*67e74705SXin Li } 329*67e74705SXin Li while (<$fh>) { 330*67e74705SXin Li $source .= $_; 331*67e74705SXin Li } 332*67e74705SXin Li close $fh; 333*67e74705SXin Li} 334*67e74705SXin Li 335*67e74705SXin Liif ($c->param('source')) { 336*67e74705SXin Li print $c->hr; 337*67e74705SXin Li my $extension = $suffixes{ $c->param('language') }; 338*67e74705SXin Li barf "Unknown language; can't compile\n" unless $extension; 339*67e74705SXin Li 340*67e74705SXin Li # Add a newline to the source here to avoid a warning from gcc. 341*67e74705SXin Li $source .= "\n"; 342*67e74705SXin Li 343*67e74705SXin Li # Avoid security hole due to #including bad stuff. 344*67e74705SXin Li $source =~ 345*67e74705SXin Lis@(\n)?#include.*[<"](.*\.\..*)[">].*\n@$1#error "invalid #include file $2 detected"\n@g; 346*67e74705SXin Li 347*67e74705SXin Li my $inputFile = writeIntoFile( $extension, $source ); 348*67e74705SXin Li my $pid = $$; 349*67e74705SXin Li 350*67e74705SXin Li my $bytecodeFile = getname(".bc"); 351*67e74705SXin Li my $outputFile = getname(".llvm-gcc.out"); 352*67e74705SXin Li my $timerFile = getname(".llvm-gcc.time"); 353*67e74705SXin Li 354*67e74705SXin Li my $stats = ''; 355*67e74705SXin Li if ( $extension eq ".st" ) { 356*67e74705SXin Li $stats = "-stats -time-passes " 357*67e74705SXin Li if ( $c->param('showstats') ); 358*67e74705SXin Li try_run( "llvm Stacker front-end (stkrc)", 359*67e74705SXin Li "stkrc $stats -o $bytecodeFile $inputFile > $outputFile 2>&1", 360*67e74705SXin Li $outputFile ); 361*67e74705SXin Li } else { 362*67e74705SXin Li #$stats = "-Wa,--stats,--time-passes,--info-output-file=$timerFile" 363*67e74705SXin Li $stats = "-ftime-report" 364*67e74705SXin Li if ( $c->param('showstats') ); 365*67e74705SXin Li try_run( "llvm C/C++ front-end (llvm-gcc)", 366*67e74705SXin Li "llvm-gcc -emit-llvm -W -Wall -O2 $stats -o $bytecodeFile -c $inputFile > $outputFile 2>&1", 367*67e74705SXin Li $outputFile ); 368*67e74705SXin Li } 369*67e74705SXin Li 370*67e74705SXin Li if ( $c->param('showstats') && -s $timerFile ) { 371*67e74705SXin Li my ( $UnhilightedResult, $HtmlResult ) = 372*67e74705SXin Li dumpFile( "Statistics for front-end compilation", $timerFile ); 373*67e74705SXin Li print "$HtmlResult\n"; 374*67e74705SXin Li } 375*67e74705SXin Li 376*67e74705SXin Li if ( $c->param('linkopt') ) { 377*67e74705SXin Li my $stats = ''; 378*67e74705SXin Li my $outputFile = getname(".gccld.out"); 379*67e74705SXin Li my $timerFile = getname(".gccld.time"); 380*67e74705SXin Li $stats = "--stats --time-passes --info-output-file=$timerFile" 381*67e74705SXin Li if ( $c->param('showstats') ); 382*67e74705SXin Li my $tmpFile = getname(".bc"); 383*67e74705SXin Li try_run( 384*67e74705SXin Li "optimizing linker (llvm-ld)", 385*67e74705SXin Li"llvm-ld $stats -o=$tmpFile $bytecodeFile > $outputFile 2>&1", 386*67e74705SXin Li $outputFile 387*67e74705SXin Li ); 388*67e74705SXin Li system("mv $tmpFile.bc $bytecodeFile"); 389*67e74705SXin Li system("rm $tmpFile"); 390*67e74705SXin Li 391*67e74705SXin Li if ( $c->param('showstats') && -s $timerFile ) { 392*67e74705SXin Li my ( $UnhilightedResult, $HtmlResult ) = 393*67e74705SXin Li dumpFile( "Statistics for optimizing linker", $timerFile ); 394*67e74705SXin Li print "$HtmlResult\n"; 395*67e74705SXin Li } 396*67e74705SXin Li } 397*67e74705SXin Li 398*67e74705SXin Li print " Bytecode size is ", -s $bytecodeFile, " bytes.\n"; 399*67e74705SXin Li 400*67e74705SXin Li my $disassemblyFile = getname(".ll"); 401*67e74705SXin Li try_run( "llvm-dis", 402*67e74705SXin Li "llvm-dis -o=$disassemblyFile $bytecodeFile > $outputFile 2>&1", 403*67e74705SXin Li $outputFile ); 404*67e74705SXin Li 405*67e74705SXin Li if ( $c->param('cxxdemangle') ) { 406*67e74705SXin Li print " Demangling disassembler output.\n"; 407*67e74705SXin Li my $tmpFile = getname(".ll"); 408*67e74705SXin Li system("c++filt < $disassemblyFile > $tmpFile 2>&1"); 409*67e74705SXin Li system("mv $tmpFile $disassemblyFile"); 410*67e74705SXin Li } 411*67e74705SXin Li 412*67e74705SXin Li my ( $UnhilightedResult, $HtmlResult ); 413*67e74705SXin Li if ( -s $disassemblyFile ) { 414*67e74705SXin Li ( $UnhilightedResult, $HtmlResult ) = 415*67e74705SXin Li dumpFile( "Output from LLVM disassembler", $disassemblyFile ); 416*67e74705SXin Li print syntaxHighlightLLVM($HtmlResult); 417*67e74705SXin Li } 418*67e74705SXin Li else { 419*67e74705SXin Li print "<p>Hmm, that's weird, llvm-dis didn't produce any output.</p>\n"; 420*67e74705SXin Li } 421*67e74705SXin Li 422*67e74705SXin Li if ( $c->param('showbcanalysis') ) { 423*67e74705SXin Li my $analFile = getname(".bca"); 424*67e74705SXin Li try_run( "llvm-bcanalyzer", "llvm-bcanalyzer $bytecodeFile > $analFile 2>&1", 425*67e74705SXin Li $analFile); 426*67e74705SXin Li } 427*67e74705SXin Li if ($c->param('showllvm2cpp') ) { 428*67e74705SXin Li my $l2cppFile = getname(".l2cpp"); 429*67e74705SXin Li try_run("llvm2cpp","llvm2cpp $bytecodeFile -o $l2cppFile 2>&1", 430*67e74705SXin Li $l2cppFile); 431*67e74705SXin Li } 432*67e74705SXin Li 433*67e74705SXin Li # Get the source presented by the user to CGI, convert newline sequences to simple \n. 434*67e74705SXin Li my $actualsrc = $c->param('source'); 435*67e74705SXin Li $actualsrc =~ s/\015\012/\n/go; 436*67e74705SXin Li # Don't log this or mail it if it is the default code. 437*67e74705SXin Li if ($actualsrc ne $defaultsrc) { 438*67e74705SXin Li addlog( $source, $pid, $UnhilightedResult ); 439*67e74705SXin Li 440*67e74705SXin Li my ( $ip, $host, $lg, $lines ); 441*67e74705SXin Li chomp( $lines = `wc -l < $inputFile` ); 442*67e74705SXin Li $lg = $c->param('language'); 443*67e74705SXin Li $ip = $c->remote_addr(); 444*67e74705SXin Li chomp( $host = `host $ip` ) if $ip; 445*67e74705SXin Li mailto( $MAILADDR, 446*67e74705SXin Li "--- Query: ---\nFrom: ($ip) $host\nInput: $lines lines of $lg\n" 447*67e74705SXin Li . "C++ demangle = " 448*67e74705SXin Li . ( $c->param('cxxdemangle') ? 1 : 0 ) 449*67e74705SXin Li . ", Link opt = " 450*67e74705SXin Li . ( $c->param('linkopt') ? 1 : 0 ) . "\n\n" 451*67e74705SXin Li . ", Show stats = " 452*67e74705SXin Li . ( $c->param('showstats') ? 1 : 0 ) . "\n\n" 453*67e74705SXin Li . "--- Source: ---\n$source\n" 454*67e74705SXin Li . "--- Result: ---\n$UnhilightedResult\n" ); 455*67e74705SXin Li } 456*67e74705SXin Li unlink( $inputFile, $bytecodeFile, $outputFile, $disassemblyFile ); 457*67e74705SXin Li} 458*67e74705SXin Li 459*67e74705SXin Liprint $c->hr, "<address>$CONTACT_ADDRESS</address>", $c->end_html; 460*67e74705SXin Lisystem("rm $ROOT/locked"); 461*67e74705SXin Liexit 0; 462