зеркало из https://github.com/microsoft/clang.git
New directory.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42680 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
36f0935143
Коммит
d68c8f4c00
|
@ -0,0 +1,83 @@
|
|||
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
Demo page information
|
||||
</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>Demo page information</h1>
|
||||
|
||||
<p>Press "back" or <a href=".">click here</a> to return to the demo
|
||||
page.</p>
|
||||
|
||||
<h2><a name="hints">Hints and Advice</a></h2>
|
||||
|
||||
<ul>
|
||||
<li>The generated LLVM code will be easier to read if
|
||||
you use stdio (e.g., printf) than iostreams (e.g., std::cout).</li>
|
||||
|
||||
<li>Unused inline functions and methods are not generated. Instead
|
||||
of '<tt>class foo { void bar() {}};</tt>',
|
||||
try writing '<tt>class foo { void bar(); }; void foo::bar() {}</tt>'.</li>
|
||||
|
||||
<li>If you want to try out a file that uses non-standard header files, you should
|
||||
preprocess it (e.g., with the <tt>-save-temps</tt> or <tt>-E</tt> options to
|
||||
<tt>gcc</tt>) then upload the result.</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2><a name="demangle">Demangle C++ names with C++ filt</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>
|
||||
|
||||
<h2><a name="lto">Run link-time optimizer</a></h2>
|
||||
|
||||
<p>
|
||||
Select this option to run the LLVM link-time optimizer, which is designed to
|
||||
optimize across files in your application. Since the demo page doesn't allow
|
||||
you to upload multiple files at once, and does not link in any libraries, we
|
||||
configured the demo page optimizer to assume there are no calls
|
||||
coming in from outside the source file, allowing it to optimize more
|
||||
aggressively.</p>
|
||||
|
||||
<p>Note that you have to define 'main' in your program for this
|
||||
to make much of a difference.
|
||||
</p>
|
||||
|
||||
<h2><a name="stats">Show detailed pass statistics</a></h2>
|
||||
|
||||
<p>
|
||||
Select this option to enable compilation timings and statistics from various
|
||||
optimizers.</p>
|
||||
|
||||
|
||||
<h2><a name="bcanalyzer">Analyze generated bytecode</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>
|
||||
|
||||
|
||||
<h2><a name="llvm2cpp">Show C++ API code</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>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 21 KiB |
|
@ -0,0 +1,461 @@
|
|||
#!/usr/dcs/software/supported/bin/perl -w
|
||||
# LLVM Web Demo script
|
||||
#
|
||||
|
||||
use strict;
|
||||
use CGI;
|
||||
use POSIX;
|
||||
use Mail::Send;
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $ROOT = "/tmp/webcompile";
|
||||
#my $ROOT = "/home/vadve/lattner/webcompile";
|
||||
|
||||
open( STDERR, ">&STDOUT" ) or die "can't redirect stderr to stdout";
|
||||
|
||||
if ( !-d $ROOT ) { mkdir( $ROOT, 0777 ); }
|
||||
|
||||
my $LOGFILE = "$ROOT/log.txt";
|
||||
my $FORM_URL = 'index.cgi';
|
||||
my $MAILADDR = 'sabre@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 $TIMEOUTAMOUNT = 20;
|
||||
$ENV{'LD_LIBRARY_PATH'} = '/home/vadve/shared/localtools/fc1/lib/';
|
||||
|
||||
my @PREPENDPATHDIRS =
|
||||
(
|
||||
'/home/vadve/shared/llvm-gcc4.0-2.1/bin/',
|
||||
'/home/vadve/shared/llvm-2.1/Release/bin');
|
||||
|
||||
my $defaultsrc = "#include <stdio.h>\n#include <stdlib.h>\n\n" .
|
||||
"int power(int X) {\n if (X == 0) return 1;\n" .
|
||||
" return X*power(X-1);\n}\n\n" .
|
||||
"int main(int argc, char **argv) {\n" .
|
||||
" printf(\"%d\\n\", power(atoi(argv[0])));\n}\n";
|
||||
|
||||
sub getname {
|
||||
my ($extension) = @_;
|
||||
for ( my $count = 0 ; ; $count++ ) {
|
||||
my $name =
|
||||
sprintf( "$ROOT/_%d_%d%s", $$, $count, $extension );
|
||||
if ( !-f $name ) { return $name; }
|
||||
}
|
||||
}
|
||||
|
||||
my $c;
|
||||
|
||||
sub barf {
|
||||
print "<b>", @_, "</b>\n";
|
||||
print $c->end_html;
|
||||
system("rm -f $ROOT/locked");
|
||||
exit 1;
|
||||
}
|
||||
|
||||
sub writeIntoFile {
|
||||
my $extension = shift @_;
|
||||
my $contents = join "", @_;
|
||||
my $name = getname($extension);
|
||||
local (*FILE);
|
||||
open( FILE, ">$name" ) or barf("Can't write to $name: $!");
|
||||
print FILE $contents;
|
||||
close FILE;
|
||||
return $name;
|
||||
}
|
||||
|
||||
sub addlog {
|
||||
my ( $source, $pid, $result ) = @_;
|
||||
open( LOG, ">>$LOGFILE" );
|
||||
my $time = scalar localtime;
|
||||
my $remotehost = $ENV{'REMOTE_ADDR'};
|
||||
print LOG "[$time] [$remotehost]: $pid\n";
|
||||
print LOG "<<<\n$source\n>>>\nResult is: <<<\n$result\n>>>\n";
|
||||
close LOG;
|
||||
}
|
||||
|
||||
sub dumpFile {
|
||||
my ( $header, $file ) = @_;
|
||||
my $result;
|
||||
open( FILE, "$file" ) or barf("Can't read $file: $!");
|
||||
while (<FILE>) {
|
||||
$result .= $_;
|
||||
}
|
||||
close FILE;
|
||||
my $UnhilightedResult = $result;
|
||||
my $HtmlResult =
|
||||
"<h3>$header</h3>\n<pre>\n" . $c->escapeHTML($result) . "\n</pre>\n";
|
||||
if (wantarray) {
|
||||
return ( $UnhilightedResult, $HtmlResult );
|
||||
}
|
||||
else {
|
||||
return $HtmlResult;
|
||||
}
|
||||
}
|
||||
|
||||
sub syntaxHighlightLLVM {
|
||||
my ($input) = @_;
|
||||
$input =~ s@\b(void|i8|i1|i16|i32|i64|float|double|type|label|opaque)\b@<span class="llvm_type">$1</span>@g;
|
||||
$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;
|
||||
|
||||
# Add links to the FAQ.
|
||||
$input =~ s@(_ZNSt8ios_base4Init[DC]1Ev)@<a href="../docs/FAQ.html#iosinit">$1</a>@g;
|
||||
$input =~ s@\bundef\b@<a href="../docs/FAQ.html#undef">undef</a>@g;
|
||||
return $input;
|
||||
}
|
||||
|
||||
sub mailto {
|
||||
my ( $recipient, $body ) = @_;
|
||||
my $msg =
|
||||
new Mail::Send( Subject => "LLVM Demo Page Run", To => $recipient );
|
||||
my $fh = $msg->open();
|
||||
print $fh $body;
|
||||
$fh->close();
|
||||
}
|
||||
|
||||
$c = new CGI;
|
||||
print $c->header;
|
||||
|
||||
print <<EOF;
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Try out LLVM in your browser!</title>
|
||||
<style>
|
||||
\@import url("syntax.css");
|
||||
\@import url("http://llvm.org/llvm.css");
|
||||
</style>
|
||||
</head>
|
||||
<body leftmargin="10" marginwidth="10">
|
||||
|
||||
<div class="www_sectiontitle">
|
||||
Try out LLVM in your browser!
|
||||
</div>
|
||||
|
||||
<table border=0><tr><td>
|
||||
<img align=right width=100 height=111 src="$LOGO_IMAGE_URL">
|
||||
</td><td>
|
||||
EOF
|
||||
|
||||
if ( -f "$ROOT/locked" ) {
|
||||
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$locktime) =
|
||||
stat("$ROOT/locked");
|
||||
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";
|
||||
exit 0;
|
||||
}
|
||||
}
|
||||
|
||||
system("touch $ROOT/locked");
|
||||
|
||||
print <<END;
|
||||
Bitter Melon the cat says, paste a C/C++ program in the text box or upload
|
||||
one from your computer, and you can see LLVM compile it, meow!!
|
||||
</td></tr></table><p>
|
||||
END
|
||||
|
||||
print $c->start_multipart_form( 'POST', $FORM_URL );
|
||||
|
||||
my $source = $c->param('source');
|
||||
|
||||
|
||||
# Start the user out with something valid if no code.
|
||||
$source = $defaultsrc if (!defined($source));
|
||||
|
||||
print '<table border="0"><tr><td>';
|
||||
|
||||
print "Type your source code in below: (<a href='DemoInfo.html#hints'>hints and
|
||||
advice</a>)<br>\n";
|
||||
|
||||
print $c->textarea(
|
||||
-name => "source",
|
||||
-rows => 16,
|
||||
-columns => 60,
|
||||
-default => $source
|
||||
), "<br>";
|
||||
|
||||
print "Or upload a file: ";
|
||||
print $c->filefield( -name => 'uploaded_file', -default => '' );
|
||||
|
||||
print "<p />\n";
|
||||
|
||||
|
||||
print '<p></td><td valign=top>';
|
||||
|
||||
print "<center><h3>General Options</h3></center>";
|
||||
|
||||
print "Source language: ",
|
||||
$c->radio_group(
|
||||
-name => 'language',
|
||||
-values => [ 'C', 'C++' ],
|
||||
-default => 'C'
|
||||
), "<p>";
|
||||
|
||||
print $c->checkbox(
|
||||
-name => 'linkopt',
|
||||
-label => 'Run link-time optimizer',
|
||||
-checked => 'checked'
|
||||
),' <a href="DemoInfo.html#lto">?</a><br>';
|
||||
|
||||
print $c->checkbox(
|
||||
-name => 'showstats',
|
||||
-label => 'Show detailed pass statistics'
|
||||
), ' <a href="DemoInfo.html#stats">?</a><br>';
|
||||
|
||||
print $c->checkbox(
|
||||
-name => 'cxxdemangle',
|
||||
-label => 'Demangle C++ names'
|
||||
),' <a href="DemoInfo.html#demangle">?</a><p>';
|
||||
|
||||
|
||||
print "<center><h3>Output Options</h3></center>";
|
||||
|
||||
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'),
|
||||
"</center>\n", $c->endform;
|
||||
|
||||
print "\n<p>If you have questions about the LLVM code generated by the
|
||||
front-end, please check the <a href='/docs/FAQ.html#cfe_code'>FAQ</a> and
|
||||
the demo page <a href='DemoInfo.html#hints'>hints section</a>.
|
||||
</p>\n";
|
||||
|
||||
$ENV{'PATH'} = ( join ( ':', @PREPENDPATHDIRS ) ) . ":" . $ENV{'PATH'};
|
||||
|
||||
sub sanitychecktools {
|
||||
my $sanitycheckfail = '';
|
||||
|
||||
# insert tool-specific sanity checks here
|
||||
$sanitycheckfail .= ' llvm-dis'
|
||||
if `llvm-dis --help 2>&1` !~ /ll disassembler/;
|
||||
|
||||
$sanitycheckfail .= ' llvm-gcc'
|
||||
if ( `llvm-gcc --version 2>&1` !~ /Free Software Foundation/ );
|
||||
|
||||
$sanitycheckfail .= ' llvm-ld'
|
||||
if `llvm-ld --help 2>&1` !~ /llvm linker/;
|
||||
|
||||
$sanitycheckfail .= ' llvm-bcanalyzer'
|
||||
if `llvm-bcanalyzer --help 2>&1` !~ /bcanalyzer/;
|
||||
|
||||
barf(
|
||||
"<br/>The demo page is currently unavailable. [tools: ($sanitycheckfail ) failed sanity check]"
|
||||
)
|
||||
if $sanitycheckfail;
|
||||
}
|
||||
|
||||
sanitychecktools();
|
||||
|
||||
sub try_run {
|
||||
my ( $program, $commandline, $outputFile ) = @_;
|
||||
my $retcode = 0;
|
||||
|
||||
eval {
|
||||
local $SIG{ALRM} = sub { die "timeout"; };
|
||||
alarm $TIMEOUTAMOUNT;
|
||||
$retcode = system($commandline);
|
||||
alarm 0;
|
||||
};
|
||||
if ( $@ and $@ =~ /timeout/ ) {
|
||||
barf("Program $program took too long, compile time limited for the web script, sorry!.\n");
|
||||
}
|
||||
if ( -s $outputFile ) {
|
||||
print scalar dumpFile( "Output from $program", $outputFile );
|
||||
}
|
||||
#print "<p>Finished dumping command output.</p>\n";
|
||||
if ( WIFEXITED($retcode) && WEXITSTATUS($retcode) != 0 ) {
|
||||
barf(
|
||||
"$program exited with an error. Please correct source and resubmit.<p>\n" .
|
||||
"Please note that this form only allows fully formed and correct source" .
|
||||
" files. It will not compile fragments of code.<p>"
|
||||
);
|
||||
}
|
||||
if ( WIFSIGNALED($retcode) != 0 ) {
|
||||
my $sig = WTERMSIG($retcode);
|
||||
barf(
|
||||
"Ouch, $program caught signal $sig. Sorry, better luck next time!\n"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
my %suffixes = (
|
||||
'Java' => '.java',
|
||||
'JO99' => '.jo9',
|
||||
'C' => '.c',
|
||||
'C++' => '.cc',
|
||||
'Stacker' => '.st',
|
||||
'preprocessed C' => '.i',
|
||||
'preprocessed C++' => '.ii'
|
||||
);
|
||||
my %languages = (
|
||||
'.jo9' => 'JO99',
|
||||
'.java' => 'Java',
|
||||
'.c' => 'C',
|
||||
'.i' => 'preprocessed C',
|
||||
'.ii' => 'preprocessed C++',
|
||||
'.cc' => 'C++',
|
||||
'.cpp' => 'C++',
|
||||
'.st' => 'Stacker'
|
||||
);
|
||||
|
||||
my $uploaded_file_name = $c->param('uploaded_file');
|
||||
if ($uploaded_file_name) {
|
||||
if ($source) {
|
||||
barf(
|
||||
"You must choose between uploading a file and typing code in. You can't do both at the same time."
|
||||
);
|
||||
}
|
||||
$uploaded_file_name =~ s/^.*(\.[A-Za-z]+)$/$1/;
|
||||
my $language = $languages{$uploaded_file_name};
|
||||
$c->param( 'language', $language );
|
||||
|
||||
print "<p>Processing uploaded file. It looks like $language.</p>\n";
|
||||
my $fh = $c->upload('uploaded_file');
|
||||
if ( !$fh ) {
|
||||
barf( "Error uploading file: " . $c->cgi_error );
|
||||
}
|
||||
while (<$fh>) {
|
||||
$source .= $_;
|
||||
}
|
||||
close $fh;
|
||||
}
|
||||
|
||||
if ($c->param('source')) {
|
||||
print $c->hr;
|
||||
my $extension = $suffixes{ $c->param('language') };
|
||||
barf "Unknown language; can't compile\n" unless $extension;
|
||||
|
||||
# Add a newline to the source here to avoid a warning from gcc.
|
||||
$source .= "\n";
|
||||
|
||||
# Avoid security hole due to #including bad stuff.
|
||||
$source =~
|
||||
s@(\n)?#include.*[<"](.*\.\..*)[">].*\n@$1#error "invalid #include file $2 detected"\n@g;
|
||||
|
||||
my $inputFile = writeIntoFile( $extension, $source );
|
||||
my $pid = $$;
|
||||
|
||||
my $bytecodeFile = getname(".bc");
|
||||
my $outputFile = getname(".llvm-gcc.out");
|
||||
my $timerFile = getname(".llvm-gcc.time");
|
||||
|
||||
my $stats = '';
|
||||
if ( $extension eq ".st" ) {
|
||||
$stats = "-stats -time-passes "
|
||||
if ( $c->param('showstats') );
|
||||
try_run( "llvm Stacker front-end (stkrc)",
|
||||
"stkrc $stats -o $bytecodeFile $inputFile > $outputFile 2>&1",
|
||||
$outputFile );
|
||||
} else {
|
||||
#$stats = "-Wa,--stats,--time-passes,--info-output-file=$timerFile"
|
||||
$stats = "-ftime-report"
|
||||
if ( $c->param('showstats') );
|
||||
try_run( "llvm C/C++ front-end (llvm-gcc)",
|
||||
"llvm-gcc -emit-llvm -W -Wall -O2 $stats -o $bytecodeFile -c $inputFile > $outputFile 2>&1",
|
||||
$outputFile );
|
||||
}
|
||||
|
||||
if ( $c->param('showstats') && -s $timerFile ) {
|
||||
my ( $UnhilightedResult, $HtmlResult ) =
|
||||
dumpFile( "Statistics for front-end compilation", $timerFile );
|
||||
print "$HtmlResult\n";
|
||||
}
|
||||
|
||||
if ( $c->param('linkopt') ) {
|
||||
my $stats = '';
|
||||
my $outputFile = getname(".gccld.out");
|
||||
my $timerFile = getname(".gccld.time");
|
||||
$stats = "--stats --time-passes --info-output-file=$timerFile"
|
||||
if ( $c->param('showstats') );
|
||||
my $tmpFile = getname(".bc");
|
||||
try_run(
|
||||
"optimizing linker (llvm-ld)",
|
||||
"llvm-ld $stats -o=$tmpFile $bytecodeFile > $outputFile 2>&1",
|
||||
$outputFile
|
||||
);
|
||||
system("mv $tmpFile.bc $bytecodeFile");
|
||||
system("rm $tmpFile");
|
||||
|
||||
if ( $c->param('showstats') && -s $timerFile ) {
|
||||
my ( $UnhilightedResult, $HtmlResult ) =
|
||||
dumpFile( "Statistics for optimizing linker", $timerFile );
|
||||
print "$HtmlResult\n";
|
||||
}
|
||||
}
|
||||
|
||||
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 );
|
||||
|
||||
if ( $c->param('cxxdemangle') ) {
|
||||
print " Demangling disassembler output.\n";
|
||||
my $tmpFile = getname(".ll");
|
||||
system("c++filt < $disassemblyFile > $tmpFile 2>&1");
|
||||
system("mv $tmpFile $disassemblyFile");
|
||||
}
|
||||
|
||||
my ( $UnhilightedResult, $HtmlResult );
|
||||
if ( -s $disassemblyFile ) {
|
||||
( $UnhilightedResult, $HtmlResult ) =
|
||||
dumpFile( "Output from LLVM disassembler", $disassemblyFile );
|
||||
print syntaxHighlightLLVM($HtmlResult);
|
||||
}
|
||||
else {
|
||||
print "<p>Hmm, that's weird, llvm-dis didn't produce any output.</p>\n";
|
||||
}
|
||||
|
||||
if ( $c->param('showbcanalysis') ) {
|
||||
my $analFile = getname(".bca");
|
||||
try_run( "llvm-bcanalyzer", "llvm-bcanalyzer $bytecodeFile > $analFile 2>&1",
|
||||
$analFile);
|
||||
}
|
||||
if ($c->param('showllvm2cpp') ) {
|
||||
my $l2cppFile = getname(".l2cpp");
|
||||
try_run("llvm2cpp","llvm2cpp $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');
|
||||
$actualsrc =~ s/\015\012/\n/go;
|
||||
# Don't log this or mail it if it is the default code.
|
||||
if ($actualsrc ne $defaultsrc) {
|
||||
addlog( $source, $pid, $UnhilightedResult );
|
||||
|
||||
my ( $ip, $host, $lg, $lines );
|
||||
chomp( $lines = `wc -l < $inputFile` );
|
||||
$lg = $c->param('language');
|
||||
$ip = $c->remote_addr();
|
||||
chomp( $host = `host $ip` ) if $ip;
|
||||
mailto( $MAILADDR,
|
||||
"--- Query: ---\nFrom: ($ip) $host\nInput: $lines lines of $lg\n"
|
||||
. "C++ demangle = "
|
||||
. ( $c->param('cxxdemangle') ? 1 : 0 )
|
||||
. ", Link opt = "
|
||||
. ( $c->param('linkopt') ? 1 : 0 ) . "\n\n"
|
||||
. ", Show stats = "
|
||||
. ( $c->param('showstats') ? 1 : 0 ) . "\n\n"
|
||||
. "--- Source: ---\n$source\n"
|
||||
. "--- Result: ---\n$UnhilightedResult\n" );
|
||||
}
|
||||
unlink( $inputFile, $bytecodeFile, $outputFile, $disassemblyFile );
|
||||
}
|
||||
|
||||
print $c->hr, "<address>$CONTACT_ADDRESS</address>", $c->end_html;
|
||||
system("rm $ROOT/locked");
|
||||
exit 0;
|
|
@ -0,0 +1,4 @@
|
|||
/* LLVM syntax highlighting for the Web */
|
||||
|
||||
.llvm_type { font-style: oblique; color: green }
|
||||
.llvm_keyword { font-weight: bold; color: blue }
|
Загрузка…
Ссылка в новой задаче