[llvm-commits] [www] r102894 - in /www/trunk/demo: DemoInfo.html index.cgi

Nick Lewycky nicholas at mxc.ca
Sun May 2 18:57:48 PDT 2010


Author: nicholas
Date: Sun May  2 20:57:48 2010
New Revision: 102894

URL: http://llvm.org/viewvc/llvm-project?rev=102894&view=rev
Log:
Update to new demo page which now supports clang! Patch by Bjarke Walling!

Modified:
    www/trunk/demo/DemoInfo.html
    www/trunk/demo/index.cgi

Modified: www/trunk/demo/DemoInfo.html
URL: http://llvm.org/viewvc/llvm-project/www/trunk/demo/DemoInfo.html?rev=102894&r1=102893&r2=102894&view=diff
==============================================================================
--- www/trunk/demo/DemoInfo.html (original)
+++ www/trunk/demo/DemoInfo.html Sun May  2 20:57:48 2010
@@ -30,14 +30,27 @@
 </ul>
 
 
-<h2><a name="demangle">Demangle C++ names with C++ filt</a></h2>
+<h2><a name="compiler">Compiler</a></h2>
 
 <p>
-Select this option if you want to run the output LLVM IR through "c++filt", 
-which converts 'mangled' C++ names to their unmangled version. 
-Note that LLVM code produced will not be lexically valid, but it will 
-be easier to understand.
-</p>
+Select the front-end compiler you want to use.
+<a href="http://clang.llvm.org/">Clang</a> is an LLVM front-end for the C, C++,
+and Objective-C languages. Clang aims to provide a better user experience
+through expressive diagnostics, a high level of conformance to language
+standards, fast compilation, and low memory use. Like LLVM, Clang provides a
+modular, library-based architecture that makes it suitable for creating or
+integrating with other development tools. Clang is considered a
+production-quality compiler for C and Objective-C on x86 (32- and 64-bit). </p>
+
+
+<h2><a name="language">Source language</a></h2>
+
+<p>
+Select the type of source code you want to compile. If you upload a file you
+don't need this as the language is detected from the file type. Note that clang
+does not support Fortran and llvm-gcc does not support the Objective-C
+languages. </p>
+
 
 <h2><a name="optlevel">Optimization level</a></h2>
 
@@ -74,23 +87,51 @@
 optimizers.</p>
 
 
-<h2><a name="bcanalyzer">Analyze generated bytecode</a></h2>
+<h2><a name="demangle">Demangle C++ names with C++ filt</a></h2>
 
 <p>
-Select this option to run the <a 
-href="http://llvm.org/cmds/llvm-bcanalyzer.html">llvm-bcanalyzer</a> tool
-on the generated bytecode, which introspects into the format of the .bc file
-itself.  </p>
+Select this option if you want to run the target output code through "c++filt", 
+which converts 'mangled' C++ names to their unmangled version. 
+Note that target code produced will not be lexically valid, but it will 
+be easier to understand.
+</p>
+
 
+<h2><a name="target">Target</a></h2>
 
-<h2><a name="llvm2cpp">Show C++ API code</a></h2>
+<p>
+Select the target you want to output code for. Generally a target uses the
+<a href="http://llvm.org/cmds/llc.html">llc</a> tool to output machine assembly
+code. However, a few special targets exists: </p>
+<dl>
+
+  <dt><tt><b>LLVM assembly</b></tt>: </dt>
+<dd>
+Select this option to run the LLVM dissambler
+(<a href="http://llvm.org/cmds/llvm-dis.html">llvm-dis</a> tool) to show the LLVM IR.
+</dd>
+
+  <dt><tt><b>LLVM C++ API code</b></tt>: </dt>
+<dd>
+Select this option to auto generate the C++ API calls that could be used to
+create the .bc file.
+</dd>
+
+  <dt><tt><b>C backend</b></tt>: </dt>
+<dd>
+Select this option to compile the resulting bitcode to low-level C code. Note that the
+<a href="http://llvm.org/PR1658">C code violates the ABI of common C++ programs</a>.
+</dd>
+</dl>
+
+
+<h2><a name="bcanalyzer">Analyze generated bytecode</a></h2>
 
 <p>
 Select this option to run the <a 
-href="http://llvm.org/cmds/llvm2cpp.html">llvm2cpp</a> tool
-on the generated bytecode, which auto generates the C++ API calls that could
-be used to create the .bc file.
-</p>
+href="http://llvm.org/cmds/llvm-bcanalyzer.html">llvm-bcanalyzer</a> tool
+on the generated bytecode, which introspects into the format of the .bc file
+itself.  </p>
 
 </body>
 </html>

Modified: www/trunk/demo/index.cgi
URL: http://llvm.org/viewvc/llvm-project/www/trunk/demo/index.cgi?rev=102894&r1=102893&r2=102894&view=diff
==============================================================================
--- www/trunk/demo/index.cgi (original)
+++ www/trunk/demo/index.cgi Sun May  2 20:57:48 2010
@@ -15,18 +15,46 @@
 
 if ( !-d $ROOT ) { mkdir( $ROOT, 0777 ); }
 
+# Automatically update shown llvm version.
+sub llvmVersion {
+    my $version = `llvm-config --version 2>&1`;
+    if ( $version =~ /^(\w+\.\w+)\s*$/ ) {
+      return $1;
+    } else {
+      return ""; # don't show any version if unknown
+    }
+}
+
 my $LOGFILE         = "$ROOT/log.txt";
 my $FORM_URL        = 'index.cgi';
 my $MAILADDR        = 'sabre at nondot.org';
 my $CONTACT_ADDRESS = 'Questions or comments?  Email the <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">LLVMdev mailing list</a>.';
-my $LOGO_IMAGE_URL  = 'cathead.png';
+my $LOGO_IMAGE_URL  = '/img/DragonSmall.png';
 my $TIMEOUTAMOUNT   = 20;
+my $LLVM_VERSION    = llvmVersion();
 
 my @PREPENDPATHDIRS =
   (  
     '/opt/llvm-gcc-releases/llvm-gcc/bin',
     '/opt/clang-releases/llvm/bin');
 
+my %COMPILER_LANGUAGE_COMBINATIONS =
+  (
+    'clang' =>
+      {
+        'C' => 1,
+        'C++' => 1,
+        'Objective-C' => 1,
+        'Objective-C++' => 1
+      },
+    'llvm-gcc' =>
+      {
+        'C' => 1,
+        'C++' => 1,
+        'Fortran' => 1
+      }
+  );
+
 my $defaultsrc = "#include <stdio.h>\n#include <stdlib.h>\n\n" .
                  "int factorial(int X) {\n  if (X == 0) return 1;\n" .
                  "  return X*factorial(X-1);\n}\n\n" .
@@ -91,6 +119,33 @@
     }
 }
 
+sub llvmTargets {
+    my %targets = ();
+    my $isReadingTargets = 0;
+    # Read list of available targets from llc tool.
+    open( LLC, 'llc -version 2>&1|' ) or barf("Can't read llc output: $!");
+    while ( <LLC> ) {
+        chomp;
+        if ( /Registered Targets:/ ) {
+            $isReadingTargets = 1;
+            next;
+        }
+        if ( $isReadingTargets and /^\s*(\S+)\s+- ([^[]+)( \[experimental\])?$/ ) {
+            $targets{$1} = { label => $2, experimental => $3 };
+        }
+    }
+    close( LLC );
+    # Fail to user if we didn't get a list. Possible error: The list format of
+    # targets from `llc -version` changed. If so, update the above code.
+    barf(
+      "This page is currently unavailable. The llc tool failed sanity check: Didn't return any list of available targets."
+    ) unless %targets;
+    # Insert standard targets.
+    $targets{'llvm'} = { label => 'LLVM assembly', experimental => 0 };
+    $targets{'cpp'}  = { label => 'LLVM C++ API code', experimental => 0 };
+    return %targets;
+}
+
 sub syntaxHighlightLLVM {
   my ($input) = @_;
   $input =~ s@\b(void|i\d+|float|double|x86_fp80|fp128|ppc_fp128|type|label|opaque)\b@<span class="llvm_type">$1</span>@g;
@@ -127,12 +182,12 @@
 <body leftmargin="10" marginwidth="10">
 
 <div class="www_sectiontitle">
-  Try out LLVM 2.7 in your browser!
+  Try out LLVM $LLVM_VERSION in your browser!
 </div>
 
 <table border=0><tr><td>
-<img align=right width=100 height=111 src="$LOGO_IMAGE_URL">
-</td><td>
+<img src="$LOGO_IMAGE_URL" alt="small dragon logo" width="136" height="136">
+</td><td style="padding-left: 10px">
 EOF
 
 if ( -f "$ROOT/locked" ) {
@@ -141,7 +196,7 @@
   my $currtime = time();
   if ($locktime + 60 > $currtime) {
     print "This page is already in use by someone else at this ";
-    print "time, try reloading in a second or two.  Meow!</td></tr></table>'\n";
+    print "time, try reloading in a second or two.  Rarh!</td></tr></table>'\n";
     exit 0;
   }
 }
@@ -149,11 +204,27 @@
 system("touch $ROOT/locked");
 
 print <<END;
-Bitter Melon the cat says, paste a C/C++/Fortran program in the text box or
-upload one from your computer, and you can see LLVM compile it, meow!!
+The mighty LLVM dragon says, paste a C/Obj-C/C++/Fortran program in the text
+box or upload one from your computer, and you can see LLVM compile it, rarh!!
 </td></tr></table><p>
 END
 
+# Load list of available targets, before we output the rest of the page. If it
+# fails, an error message will be displayed.
+my %llvmTargets = llvmTargets();
+my %targetLabels = map { $_ => $llvmTargets{$_}->{'label'} } keys %llvmTargets;
+
+sub llvmTargetsSortedByLabel {
+  $llvmTargets{$a}->{'label'} cmp $llvmTargets{$b}->{'label'};
+}
+
+my @experimentalTargets = sort llvmTargetsSortedByLabel grep {     $llvmTargets{$_}->{'experimental'} } keys %llvmTargets;
+my @stableTargets       = sort llvmTargetsSortedByLabel grep { not $llvmTargets{$_}->{'experimental'} } keys %llvmTargets;
+# Show llvm and cpp targets first in list as they're kind of special.
+ at stableTargets = grep { $_ ne 'llvm' and $_ ne 'cpp' } @stableTargets;
+ at stableTargets = ('llvm', 'cpp', @stableTargets);
+
+
 print $c->start_multipart_form( 'POST', $FORM_URL );
 
 my $source = $c->param('source');
@@ -169,7 +240,7 @@
 
 print $c->textarea(
     -name    => "source",
-    -rows    => 16,
+    -rows    => 20,
     -columns => 60,
     -default => $source
 ), "<br>";
@@ -184,12 +255,19 @@
 
 print "<center><h3>General Options</h3></center>";
 
+print "Compiler: ",
+  $c->radio_group(
+    -name    => 'compiler',
+    -values  => [ 'clang', 'llvm-gcc' ],
+    -default => 'clang'
+  ), ' <a href="DemoInfo.html#compiler">?</a><p>';
+
 print "Source language: ",
   $c->radio_group(
     -name    => 'language',
-    -values  => [ 'C', 'C++', 'Fortran' ],
+    -values  => [ 'C', 'C++', 'Objective-C', 'Objective-C++', 'Fortran' ],
     -default => 'C'
-  ), "<p>";
+  ), ' <a href="DemoInfo.html#language">?</a><p>';
 
 print "Optimization level: ",
   $c->radio_group(
@@ -211,16 +289,27 @@
 
 print "<center><h3>Output Options</h3></center>";
 
+print "Target: ",
+  $c->popup_menu(
+    -name    => 'target',
+    -default => 'llvm',
+    -values  => [
+      $c->optgroup(
+        -name   => 'Stable targets',
+        -values => \@stableTargets,
+        -labels => \%targetLabels
+      ), $c->optgroup(
+        -name   => 'Experimental targets',
+        -values => \@experimentalTargets,
+        -labels => \%targetLabels
+      )]
+  ), ' <a href="DemoInfo.html#target">?</a><p>';
+
 print $c->checkbox(
     -name => 'showbcanalysis',
     -label => 'Show detailed bytecode analysis'
   ),' <a href="DemoInfo.html#bcanalyzer">?</a><br>';
 
-print $c->checkbox(
-    -name => 'showllvm2cpp',
-    -label => 'Show LLVM C++ API code'
-  ), ' <a href="DemoInfo.html#llvm2cpp">?</a>';
-
 print "</td></tr></table>";
 
 print "<center>", $c->submit(-value=> 'Compile Source Code'), 
@@ -243,9 +332,15 @@
     $sanitycheckfail .= ' llvm-gcc'
       if ( `llvm-gcc --version 2>&1` !~ /Free Software Foundation/ );
 
+    $sanitycheckfail .= ' clang'
+      if `clang --help 2>&1` !~ /clang "gcc-compatible" driver/;
+
     $sanitycheckfail .= ' llvm-ld'
       if `llvm-ld --help 2>&1` !~ /llvm linker/;
 
+    $sanitycheckfail .= ' llc'
+      if `llc --help 2>&1` !~ /llvm system compiler/;
+
     $sanitycheckfail .= ' llvm-bcanalyzer'
       if `llvm-bcanalyzer --help 2>&1` !~ /bcanalyzer/;
 
@@ -295,6 +390,8 @@
     'C'                => '.c',
     'C++'              => '.cc',
     'Fortran'          => '.f90',
+    'Objective-C'      => '.m',
+    'Objective-C++'    => '.mm',
     'preprocessed C'   => '.i',
     'preprocessed C++' => '.ii'
 );
@@ -306,15 +403,19 @@
     '.ii'   => 'preprocessed C++',
     '.cc'   => 'C++',
     '.cpp'  => 'C++',
+    '.m'    => 'Objective-C',
+    '.mm'   => 'Objective-C++',
     '.f'    => 'Fortran',
     '.f90'  => 'Fortran'
 );
-my %language_options = (
+my %gcc_options = (
     'Java'             => '',
     'JO99'             => '',
     'C'                => '-fnested-functions',
     'C++'              => '',
     'Fortran'          => '',
+    'Objective-C'      => '',
+    'Objective-C++'    => '',
     'preprocessed C'   => '-fnested-functions',
     'preprocessed C++' => ''
 );
@@ -341,6 +442,27 @@
     close $fh;
 }
 
+# Sanity checks on input.
+if ($c->param) {
+
+    # Ensure that the combination of compiler and language is valid.
+    my $compiler = $c->param('compiler');
+    my $language = $c->param('language');
+    my $compilerHTML = $c->escapeHTML($compiler);
+    my $languageHTML = $c->escapeHTML($language);
+    barf(
+      "The $compilerHTML compiler does not support $languageHTML code. Please choose another compiler."
+    ) unless exists $COMPILER_LANGUAGE_COMBINATIONS{$compiler}{$language};
+
+    # Since we inject target name in command line tool (llc), we need to
+    # validate it properly. Check if chosen target is an known valid target.
+    my $target = $c->param('target');
+    my $targetHTML = $c->escapeHTML($target);
+    barf(
+      "Unknown target $targetHTML. Please choose another one."
+    ) unless exists $llvmTargets{$target};
+}
+
 if ($c->param && $source) {
     print $c->hr;
     my $extension = $suffixes{ $c->param('language') };
@@ -365,12 +487,23 @@
     $stats = "-ftime-report"
 	if ( $c->param('showstats') );
 
-    my $options = $language_options{ $c->param('language') };
-    $options .= " -O3" if $c->param('optlevel') ne "None";
-
-    try_run( "llvm C/C++/Fortran front-end (llvm-gcc)",
-	"llvm-gcc -emit-llvm -msse3 -W -Wall $options $stats -o $bytecodeFile -c $inputFile > $outputFile 2>&1",
-      $outputFile );
+    my $compiler = $c->param('compiler');
+    if ( $compiler eq 'clang' ) {
+        my $options = ( $c->param('optlevel') eq "None" ) ? "-O0" : "-O3";
+        try_run( "llvm C/C++/Objective-C/Objective-C++ front-end (clang)",
+          "clang -emit-llvm -msse3 -W -Wall $options $stats -o $bytecodeFile -c $inputFile > $outputFile 2>&1",
+          $outputFile );
+    } elsif ( $compiler eq 'llvm-gcc' ) {
+        my $options = $gcc_options{ $c->param('language') };
+        $options .= " -O3" if $c->param('optlevel') ne "None";
+        try_run( "llvm C/C++/Fortran front-end (llvm-gcc)",
+          "llvm-gcc -emit-llvm -msse3 -W -Wall $options $stats -o $bytecodeFile -c $inputFile > $outputFile 2>&1",
+          $outputFile );
+    } else {
+        # This shouldn't happen as we already checked whether the compiler/
+        # language combination is valid, which implies the compiler is known.
+        barf("Unknown compiler.");
+    }
 
     if ( $c->param('showstats') && -s $timerFile ) {
         my ( $UnhilightedResult, $HtmlResult ) =
@@ -402,13 +535,25 @@
 
     print " Bytecode size is ", -s $bytecodeFile, " bytes.\n";
 
-    my $disassemblyFile = getname(".ll");
-    try_run( "llvm-dis",
-        "llvm-dis -o=$disassemblyFile $bytecodeFile > $outputFile 2>&1",
-        $outputFile );
+    my $target = $c->param('target');
+    my $targetLabel = $llvmTargets{$target}->{'label'};
+
+    my $disassemblyFile;
+    if ( $target eq 'llvm' ) {
+        $disassemblyFile = getname(".ll");
+        try_run( "llvm-dis",
+            "llvm-dis -o=$disassemblyFile $bytecodeFile > $outputFile 2>&1",
+            $outputFile );
+    } else {
+        $disassemblyFile = getname(".s");
+        my $options = ( $c->param('optlevel') eq "None" ) ? "-O0" : "-O3";
+        try_run( "llc",
+            "llc -march=$target -asm-verbose $options -o=$disassemblyFile $bytecodeFile > $outputFile 2>&1",
+            $outputFile );
+    }
 
     if ( $c->param('cxxdemangle') ) {
-        print " Demangling disassembler output.\n";
+        print " Demangling target output.\n";
         my $tmpFile = getname(".ll");
         system("c++filt < $disassemblyFile > $tmpFile 2>&1");
         system("mv $tmpFile $disassemblyFile");
@@ -416,12 +561,17 @@
 
     my ( $UnhilightedResult, $HtmlResult );
     if ( -s $disassemblyFile ) {
+        my $programName = ( $target eq 'llvm' ) ? 'disassembler' : 'static compiler';
         ( $UnhilightedResult, $HtmlResult ) =
-          dumpFile( "Output from LLVM disassembler", $disassemblyFile );
-        print syntaxHighlightLLVM($HtmlResult);
+          dumpFile( "Output from llvm $programName targeting $targetLabel", $disassemblyFile );
+        if ( $target eq 'llvm' ) {
+            $HtmlResult = syntaxHighlightLLVM($HtmlResult);
+        }
+        # It would be nice to support highlighting of other assembly files.
+        print $HtmlResult;
     }
     else {
-        print "<p>Hmm, that's weird, llvm-dis didn't produce any output.</p>\n";
+        print "<p>Hmm, that's weird, llvm-dis/llc didn't produce any output.</p>\n";
     }
 
     if ( $c->param('showbcanalysis') ) {
@@ -429,11 +579,6 @@
       try_run( "llvm-bcanalyzer", "llvm-bcanalyzer $bytecodeFile > $analFile 2>&1", 
         $analFile);
     }
-    if ($c->param('showllvm2cpp') ) {
-      my $l2cppFile = getname(".l2cpp");
-      try_run("llvm2cpp","llc -march=cpp $bytecodeFile -o $l2cppFile 2>&1",
-        $l2cppFile);
-    }
 
     # Get the source presented by the user to CGI, convert newline sequences to simple \n.
     my $actualsrc = $c->param('source');





More information about the llvm-commits mailing list