summaryrefslogtreecommitdiffstats
path: root/contrib/llvm
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2010-06-09 18:11:12 +0000
committered <ed@FreeBSD.org>2010-06-09 18:11:12 +0000
commita1185afe0f653cca036f117b540fefc6f799e95d (patch)
tree8b9786210f005ec3c3b7b19ee52714d390c2b121 /contrib/llvm
parent92026fed219b8457b0b6d9ed33a538b105a670cc (diff)
downloadFreeBSD-src-a1185afe0f653cca036f117b540fefc6f799e95d.zip
FreeBSD-src-a1185afe0f653cca036f117b540fefc6f799e95d.tar.gz
Remove unneeded directories.
Even though Roman removed these directories in his working copy, they weren't removed from the actual repository, also causing his working copy to be corrupted.
Diffstat (limited to 'contrib/llvm')
-rw-r--r--contrib/llvm/examples/BrainF/BrainF.cpp467
-rw-r--r--contrib/llvm/examples/BrainF/BrainF.h94
-rw-r--r--contrib/llvm/examples/BrainF/BrainFDriver.cpp160
-rw-r--r--contrib/llvm/examples/BrainF/CMakeLists.txt6
-rw-r--r--contrib/llvm/examples/BrainF/Makefile15
-rw-r--r--contrib/llvm/examples/CMakeLists.txt16
-rw-r--r--contrib/llvm/examples/ExceptionDemo/CMakeLists.txt5
-rw-r--r--contrib/llvm/examples/ExceptionDemo/ExceptionDemo.cpp2027
-rw-r--r--contrib/llvm/examples/ExceptionDemo/Makefile16
-rw-r--r--contrib/llvm/examples/Fibonacci/CMakeLists.txt5
-rw-r--r--contrib/llvm/examples/Fibonacci/Makefile17
-rw-r--r--contrib/llvm/examples/Fibonacci/fibonacci.cpp131
-rw-r--r--contrib/llvm/examples/HowToUseJIT/CMakeLists.txt5
-rw-r--r--contrib/llvm/examples/HowToUseJIT/HowToUseJIT.cpp124
-rw-r--r--contrib/llvm/examples/HowToUseJIT/Makefile15
-rw-r--r--contrib/llvm/examples/Kaleidoscope/CMakeLists.txt6
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter2/CMakeLists.txt3
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter2/Makefile13
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter2/toy.cpp398
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter3/CMakeLists.txt5
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter3/Makefile15
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter3/toy.cpp563
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter4/CMakeLists.txt5
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter4/Makefile15
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter4/toy.cpp610
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter5/CMakeLists.txt5
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter5/Makefile15
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter5/toy.cpp855
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter6/CMakeLists.txt5
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter6/Makefile15
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter6/toy.cpp973
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter7/CMakeLists.txt5
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter7/Makefile16
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Chapter7/toy.cpp1139
-rw-r--r--contrib/llvm/examples/Kaleidoscope/Makefile15
-rw-r--r--contrib/llvm/examples/Makefile32
-rw-r--r--contrib/llvm/examples/ModuleMaker/CMakeLists.txt5
-rw-r--r--contrib/llvm/examples/ModuleMaker/Makefile14
-rw-r--r--contrib/llvm/examples/ModuleMaker/ModuleMaker.cpp64
-rw-r--r--contrib/llvm/examples/ModuleMaker/README.txt8
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/Makefile22
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/_tags1
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/ast.ml25
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/lexer.ml52
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/parser.ml122
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/token.ml15
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/toplevel.ml34
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/toy.ml21
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/Makefile24
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/_tags2
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/ast.ml25
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/codegen.ml100
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/lexer.ml52
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/myocamlbuild.ml6
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/parser.ml122
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/token.ml15
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/toplevel.ml39
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/toy.ml26
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/Makefile25
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/_tags4
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/ast.ml25
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/bindings.c7
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/codegen.ml103
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/lexer.ml52
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/myocamlbuild.ml10
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/parser.ml122
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/token.ml15
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/toplevel.ml49
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/toy.ml53
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/Makefile25
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/_tags4
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/ast.ml31
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/bindings.c7
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/codegen.ml225
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/lexer.ml57
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/myocamlbuild.ml10
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/parser.ml158
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/token.ml19
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/toplevel.ml49
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/toy.ml53
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/Makefile25
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/_tags4
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/ast.ml36
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/bindings.c13
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/codegen.ml251
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/lexer.ml59
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/myocamlbuild.ml10
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/parser.ml195
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/token.ml22
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/toplevel.ml49
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/toy.ml53
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/Makefile25
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/_tags4
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/ast.ml39
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/bindings.c13
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/codegen.ml370
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/lexer.ml60
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/myocamlbuild.ml10
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/parser.ml221
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/token.ml25
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/toplevel.ml49
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/toy.ml57
-rw-r--r--contrib/llvm/examples/OCaml-Kaleidoscope/Makefile15
-rw-r--r--contrib/llvm/examples/ParallelJIT/CMakeLists.txt9
-rw-r--r--contrib/llvm/examples/ParallelJIT/Makefile17
-rw-r--r--contrib/llvm/examples/ParallelJIT/ParallelJIT.cpp304
-rw-r--r--contrib/llvm/tools/clang/examples/CMakeLists.txt4
-rw-r--r--contrib/llvm/tools/clang/examples/Makefile14
-rw-r--r--contrib/llvm/tools/clang/examples/PrintFunctionNames/CMakeLists.txt26
-rw-r--r--contrib/llvm/tools/clang/examples/PrintFunctionNames/Makefile27
-rw-r--r--contrib/llvm/tools/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp44
-rw-r--r--contrib/llvm/tools/clang/examples/PrintFunctionNames/README.txt10
-rw-r--r--contrib/llvm/tools/clang/examples/clang-interpreter/CMakeLists.txt30
-rw-r--r--contrib/llvm/tools/clang/examples/clang-interpreter/Makefile30
-rw-r--r--contrib/llvm/tools/clang/examples/clang-interpreter/README.txt17
-rw-r--r--contrib/llvm/tools/clang/examples/clang-interpreter/main.cpp155
-rw-r--r--contrib/llvm/tools/clang/examples/wpa/CMakeLists.txt23
-rw-r--r--contrib/llvm/tools/clang/examples/wpa/Makefile28
-rw-r--r--contrib/llvm/tools/clang/examples/wpa/clang-wpa.cpp56
-rw-r--r--contrib/llvm/tools/clang/www/CheckerNotes.html9
-rw-r--r--contrib/llvm/tools/clang/www/OpenProjects.html114
-rw-r--r--contrib/llvm/tools/clang/www/StaticAnalysis.html21
-rw-r--r--contrib/llvm/tools/clang/www/StaticAnalysisUsage.html21
-rw-r--r--contrib/llvm/tools/clang/www/UniversalDriver.html87
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/annotations.html458
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/available_checks.html37
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/content.css79
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/dev_cxx.html52
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/filing_bugs.html62
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/analyzer_html.pngbin63091 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/analyzer_xcode.pngbin87697 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/example_attribute_nonnull.pngbin25028 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/example_cf_returns_retained.pngbin43528 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/example_cf_returns_retained_gc.pngbin46925 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/example_ns_returns_retained.pngbin40406 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/scan_build_cmd.pngbin29669 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/tree/bullet.gifbin64 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/tree/minus.gifbin79 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/images/tree/plus.gifbin83 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/index.html227
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/installation.html114
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/latest_checker.html.incl1
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/menu.css52
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/menu.html.incl40
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/menu.js17
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/scan-build.html346
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/scripts/dbtree.js1
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/scripts/menu.js17
-rw-r--r--contrib/llvm/tools/clang/www/analyzer/xcode.html136
-rw-r--r--contrib/llvm/tools/clang/www/carbon-compile.pngbin23702 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/clang-tutorial.html56
-rw-r--r--contrib/llvm/tools/clang/www/clang_video-05-25-2007.html27
-rw-r--r--contrib/llvm/tools/clang/www/clang_video-07-25-2007.html30
-rw-r--r--contrib/llvm/tools/clang/www/comparison.html191
-rw-r--r--contrib/llvm/tools/clang/www/content.css27
-rw-r--r--contrib/llvm/tools/clang/www/cxx_compatibility.html303
-rw-r--r--contrib/llvm/tools/clang/www/cxx_status.html234
-rw-r--r--contrib/llvm/tools/clang/www/demo/DemoInfo.html83
-rw-r--r--contrib/llvm/tools/clang/www/demo/cathead.pngbin21602 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/demo/index.cgi461
-rw-r--r--contrib/llvm/tools/clang/www/demo/syntax.css4
-rw-r--r--contrib/llvm/tools/clang/www/demo/what is this directory.txt15
-rw-r--r--contrib/llvm/tools/clang/www/diagnostics.html349
-rw-r--r--contrib/llvm/tools/clang/www/distclang_status.html30
-rw-r--r--contrib/llvm/tools/clang/www/feature-compile1.pngbin91247 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/feature-compile2.pngbin140963 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/feature-memory1.pngbin92680 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/features.html424
-rw-r--r--contrib/llvm/tools/clang/www/get_involved.html61
-rw-r--r--contrib/llvm/tools/clang/www/get_started.html275
-rw-r--r--contrib/llvm/tools/clang/www/hacking.html270
-rw-r--r--contrib/llvm/tools/clang/www/index.html119
-rw-r--r--contrib/llvm/tools/clang/www/menu.css39
-rw-r--r--contrib/llvm/tools/clang/www/menu.html.incl58
-rw-r--r--contrib/llvm/tools/clang/www/performance-2008-10-31.html134
-rw-r--r--contrib/llvm/tools/clang/www/performance-2009-03-02.html112
-rw-r--r--contrib/llvm/tools/clang/www/performance.html106
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc-01.txt135
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc-02.txt135
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc.pngbin20395 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch-01.txt187
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch-02.txt187
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch.pngbin23482 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.pdfbin34547 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.pngbin77003 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.txt1120
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.pdfbin36086 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.pngbin78278 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.txt2368
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.pdfbin33680 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.pngbin61190 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.txt699
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.pdfbin34528 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.pngbin62222 -> 0 bytes
-rw-r--r--contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.txt803
195 files changed, 0 insertions, 23040 deletions
diff --git a/contrib/llvm/examples/BrainF/BrainF.cpp b/contrib/llvm/examples/BrainF/BrainF.cpp
deleted file mode 100644
index a443ad4..0000000
--- a/contrib/llvm/examples/BrainF/BrainF.cpp
+++ /dev/null
@@ -1,467 +0,0 @@
-//===-- BrainF.cpp - BrainF compiler example ----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===--------------------------------------------------------------------===//
-//
-// This class compiles the BrainF language into LLVM assembly.
-//
-// The BrainF language has 8 commands:
-// Command Equivalent C Action
-// ------- ------------ ------
-// , *h=getchar(); Read a character from stdin, 255 on EOF
-// . putchar(*h); Write a character to stdout
-// - --*h; Decrement tape
-// + ++*h; Increment tape
-// < --h; Move head left
-// > ++h; Move head right
-// [ while(*h) { Start loop
-// ] } End loop
-//
-//===--------------------------------------------------------------------===//
-
-#include "BrainF.h"
-#include "llvm/Constants.h"
-#include "llvm/Instructions.h"
-#include "llvm/Intrinsics.h"
-#include "llvm/ADT/STLExtras.h"
-#include <iostream>
-using namespace llvm;
-
-//Set the constants for naming
-const char *BrainF::tapereg = "tape";
-const char *BrainF::headreg = "head";
-const char *BrainF::label = "brainf";
-const char *BrainF::testreg = "test";
-
-Module *BrainF::parse(std::istream *in1, int mem, CompileFlags cf,
- LLVMContext& Context) {
- in = in1;
- memtotal = mem;
- comflag = cf;
-
- header(Context);
- readloop(0, 0, 0, Context);
- delete builder;
- return module;
-}
-
-void BrainF::header(LLVMContext& C) {
- module = new Module("BrainF", C);
-
- //Function prototypes
-
- //declare void @llvm.memset.i32(i8 *, i8, i32, i32)
- const Type *Tys[] = { Type::getInt32Ty(C) };
- Function *memset_func = Intrinsic::getDeclaration(module, Intrinsic::memset,
- Tys, 1);
-
- //declare i32 @getchar()
- getchar_func = cast<Function>(module->
- getOrInsertFunction("getchar", IntegerType::getInt32Ty(C), NULL));
-
- //declare i32 @putchar(i32)
- putchar_func = cast<Function>(module->
- getOrInsertFunction("putchar", IntegerType::getInt32Ty(C),
- IntegerType::getInt32Ty(C), NULL));
-
-
- //Function header
-
- //define void @brainf()
- brainf_func = cast<Function>(module->
- getOrInsertFunction("brainf", Type::getVoidTy(C), NULL));
-
- builder = new IRBuilder<>(BasicBlock::Create(C, label, brainf_func));
-
- //%arr = malloc i8, i32 %d
- ConstantInt *val_mem = ConstantInt::get(C, APInt(32, memtotal));
- BasicBlock* BB = builder->GetInsertBlock();
- const Type* IntPtrTy = IntegerType::getInt32Ty(C);
- const Type* Int8Ty = IntegerType::getInt8Ty(C);
- Constant* allocsize = ConstantExpr::getSizeOf(Int8Ty);
- allocsize = ConstantExpr::getTruncOrBitCast(allocsize, IntPtrTy);
- ptr_arr = CallInst::CreateMalloc(BB, IntPtrTy, Int8Ty, allocsize, val_mem,
- NULL, "arr");
- BB->getInstList().push_back(cast<Instruction>(ptr_arr));
-
- //call void @llvm.memset.i32(i8 *%arr, i8 0, i32 %d, i32 1)
- {
- Value *memset_params[] = {
- ptr_arr,
- ConstantInt::get(C, APInt(8, 0)),
- val_mem,
- ConstantInt::get(C, APInt(32, 1))
- };
-
- CallInst *memset_call = builder->
- CreateCall(memset_func, memset_params, array_endof(memset_params));
- memset_call->setTailCall(false);
- }
-
- //%arrmax = getelementptr i8 *%arr, i32 %d
- if (comflag & flag_arraybounds) {
- ptr_arrmax = builder->
- CreateGEP(ptr_arr, ConstantInt::get(C, APInt(32, memtotal)), "arrmax");
- }
-
- //%head.%d = getelementptr i8 *%arr, i32 %d
- curhead = builder->CreateGEP(ptr_arr,
- ConstantInt::get(C, APInt(32, memtotal/2)),
- headreg);
-
-
-
- //Function footer
-
- //brainf.end:
- endbb = BasicBlock::Create(C, label, brainf_func);
-
- //call free(i8 *%arr)
- endbb->getInstList().push_back(CallInst::CreateFree(ptr_arr, endbb));
-
- //ret void
- ReturnInst::Create(C, endbb);
-
-
-
- //Error block for array out of bounds
- if (comflag & flag_arraybounds)
- {
- //@aberrormsg = internal constant [%d x i8] c"\00"
- Constant *msg_0 =
- ConstantArray::get(C, "Error: The head has left the tape.", true);
-
- GlobalVariable *aberrormsg = new GlobalVariable(
- *module,
- msg_0->getType(),
- true,
- GlobalValue::InternalLinkage,
- msg_0,
- "aberrormsg");
-
- //declare i32 @puts(i8 *)
- Function *puts_func = cast<Function>(module->
- getOrInsertFunction("puts", IntegerType::getInt32Ty(C),
- PointerType::getUnqual(IntegerType::getInt8Ty(C)), NULL));
-
- //brainf.aberror:
- aberrorbb = BasicBlock::Create(C, label, brainf_func);
-
- //call i32 @puts(i8 *getelementptr([%d x i8] *@aberrormsg, i32 0, i32 0))
- {
- Constant *zero_32 = Constant::getNullValue(IntegerType::getInt32Ty(C));
-
- Constant *gep_params[] = {
- zero_32,
- zero_32
- };
-
- Constant *msgptr = ConstantExpr::
- getGetElementPtr(aberrormsg, gep_params,
- array_lengthof(gep_params));
-
- Value *puts_params[] = {
- msgptr
- };
-
- CallInst *puts_call =
- CallInst::Create(puts_func,
- puts_params, array_endof(puts_params),
- "", aberrorbb);
- puts_call->setTailCall(false);
- }
-
- //br label %brainf.end
- BranchInst::Create(endbb, aberrorbb);
- }
-}
-
-void BrainF::readloop(PHINode *phi, BasicBlock *oldbb, BasicBlock *testbb,
- LLVMContext &C) {
- Symbol cursym = SYM_NONE;
- int curvalue = 0;
- Symbol nextsym = SYM_NONE;
- int nextvalue = 0;
- char c;
- int loop;
- int direction;
-
- while(cursym != SYM_EOF && cursym != SYM_ENDLOOP) {
- // Write out commands
- switch(cursym) {
- case SYM_NONE:
- // Do nothing
- break;
-
- case SYM_READ:
- {
- //%tape.%d = call i32 @getchar()
- CallInst *getchar_call = builder->CreateCall(getchar_func, tapereg);
- getchar_call->setTailCall(false);
- Value *tape_0 = getchar_call;
-
- //%tape.%d = trunc i32 %tape.%d to i8
- Value *tape_1 = builder->
- CreateTrunc(tape_0, IntegerType::getInt8Ty(C), tapereg);
-
- //store i8 %tape.%d, i8 *%head.%d
- builder->CreateStore(tape_1, curhead);
- }
- break;
-
- case SYM_WRITE:
- {
- //%tape.%d = load i8 *%head.%d
- LoadInst *tape_0 = builder->CreateLoad(curhead, tapereg);
-
- //%tape.%d = sext i8 %tape.%d to i32
- Value *tape_1 = builder->
- CreateSExt(tape_0, IntegerType::getInt32Ty(C), tapereg);
-
- //call i32 @putchar(i32 %tape.%d)
- Value *putchar_params[] = {
- tape_1
- };
- CallInst *putchar_call = builder->
- CreateCall(putchar_func,
- putchar_params, array_endof(putchar_params));
- putchar_call->setTailCall(false);
- }
- break;
-
- case SYM_MOVE:
- {
- //%head.%d = getelementptr i8 *%head.%d, i32 %d
- curhead = builder->
- CreateGEP(curhead, ConstantInt::get(C, APInt(32, curvalue)),
- headreg);
-
- //Error block for array out of bounds
- if (comflag & flag_arraybounds)
- {
- //%test.%d = icmp uge i8 *%head.%d, %arrmax
- Value *test_0 = builder->
- CreateICmpUGE(curhead, ptr_arrmax, testreg);
-
- //%test.%d = icmp ult i8 *%head.%d, %arr
- Value *test_1 = builder->
- CreateICmpULT(curhead, ptr_arr, testreg);
-
- //%test.%d = or i1 %test.%d, %test.%d
- Value *test_2 = builder->
- CreateOr(test_0, test_1, testreg);
-
- //br i1 %test.%d, label %main.%d, label %main.%d
- BasicBlock *nextbb = BasicBlock::Create(C, label, brainf_func);
- builder->CreateCondBr(test_2, aberrorbb, nextbb);
-
- //main.%d:
- builder->SetInsertPoint(nextbb);
- }
- }
- break;
-
- case SYM_CHANGE:
- {
- //%tape.%d = load i8 *%head.%d
- LoadInst *tape_0 = builder->CreateLoad(curhead, tapereg);
-
- //%tape.%d = add i8 %tape.%d, %d
- Value *tape_1 = builder->
- CreateAdd(tape_0, ConstantInt::get(C, APInt(8, curvalue)), tapereg);
-
- //store i8 %tape.%d, i8 *%head.%d\n"
- builder->CreateStore(tape_1, curhead);
- }
- break;
-
- case SYM_LOOP:
- {
- //br label %main.%d
- BasicBlock *testbb = BasicBlock::Create(C, label, brainf_func);
- builder->CreateBr(testbb);
-
- //main.%d:
- BasicBlock *bb_0 = builder->GetInsertBlock();
- BasicBlock *bb_1 = BasicBlock::Create(C, label, brainf_func);
- builder->SetInsertPoint(bb_1);
-
- // Make part of PHI instruction now, wait until end of loop to finish
- PHINode *phi_0 =
- PHINode::Create(PointerType::getUnqual(IntegerType::getInt8Ty(C)),
- headreg, testbb);
- phi_0->reserveOperandSpace(2);
- phi_0->addIncoming(curhead, bb_0);
- curhead = phi_0;
-
- readloop(phi_0, bb_1, testbb, C);
- }
- break;
-
- default:
- std::cerr << "Error: Unknown symbol.\n";
- abort();
- break;
- }
-
- cursym = nextsym;
- curvalue = nextvalue;
- nextsym = SYM_NONE;
-
- // Reading stdin loop
- loop = (cursym == SYM_NONE)
- || (cursym == SYM_MOVE)
- || (cursym == SYM_CHANGE);
- while(loop) {
- *in>>c;
- if (in->eof()) {
- if (cursym == SYM_NONE) {
- cursym = SYM_EOF;
- } else {
- nextsym = SYM_EOF;
- }
- loop = 0;
- } else {
- direction = 1;
- switch(c) {
- case '-':
- direction = -1;
- // Fall through
-
- case '+':
- if (cursym == SYM_CHANGE) {
- curvalue += direction;
- // loop = 1
- } else {
- if (cursym == SYM_NONE) {
- cursym = SYM_CHANGE;
- curvalue = direction;
- // loop = 1
- } else {
- nextsym = SYM_CHANGE;
- nextvalue = direction;
- loop = 0;
- }
- }
- break;
-
- case '<':
- direction = -1;
- // Fall through
-
- case '>':
- if (cursym == SYM_MOVE) {
- curvalue += direction;
- // loop = 1
- } else {
- if (cursym == SYM_NONE) {
- cursym = SYM_MOVE;
- curvalue = direction;
- // loop = 1
- } else {
- nextsym = SYM_MOVE;
- nextvalue = direction;
- loop = 0;
- }
- }
- break;
-
- case ',':
- if (cursym == SYM_NONE) {
- cursym = SYM_READ;
- } else {
- nextsym = SYM_READ;
- }
- loop = 0;
- break;
-
- case '.':
- if (cursym == SYM_NONE) {
- cursym = SYM_WRITE;
- } else {
- nextsym = SYM_WRITE;
- }
- loop = 0;
- break;
-
- case '[':
- if (cursym == SYM_NONE) {
- cursym = SYM_LOOP;
- } else {
- nextsym = SYM_LOOP;
- }
- loop = 0;
- break;
-
- case ']':
- if (cursym == SYM_NONE) {
- cursym = SYM_ENDLOOP;
- } else {
- nextsym = SYM_ENDLOOP;
- }
- loop = 0;
- break;
-
- // Ignore other characters
- default:
- break;
- }
- }
- }
- }
-
- if (cursym == SYM_ENDLOOP) {
- if (!phi) {
- std::cerr << "Error: Extra ']'\n";
- abort();
- }
-
- // Write loop test
- {
- //br label %main.%d
- builder->CreateBr(testbb);
-
- //main.%d:
-
- //%head.%d = phi i8 *[%head.%d, %main.%d], [%head.%d, %main.%d]
- //Finish phi made at beginning of loop
- phi->addIncoming(curhead, builder->GetInsertBlock());
- Value *head_0 = phi;
-
- //%tape.%d = load i8 *%head.%d
- LoadInst *tape_0 = new LoadInst(head_0, tapereg, testbb);
-
- //%test.%d = icmp eq i8 %tape.%d, 0
- ICmpInst *test_0 = new ICmpInst(*testbb, ICmpInst::ICMP_EQ, tape_0,
- ConstantInt::get(C, APInt(8, 0)), testreg);
-
- //br i1 %test.%d, label %main.%d, label %main.%d
- BasicBlock *bb_0 = BasicBlock::Create(C, label, brainf_func);
- BranchInst::Create(bb_0, oldbb, test_0, testbb);
-
- //main.%d:
- builder->SetInsertPoint(bb_0);
-
- //%head.%d = phi i8 *[%head.%d, %main.%d]
- PHINode *phi_1 = builder->
- CreatePHI(PointerType::getUnqual(IntegerType::getInt8Ty(C)), headreg);
- phi_1->reserveOperandSpace(1);
- phi_1->addIncoming(head_0, testbb);
- curhead = phi_1;
- }
-
- return;
- }
-
- //End of the program, so go to return block
- builder->CreateBr(endbb);
-
- if (phi) {
- std::cerr << "Error: Missing ']'\n";
- abort();
- }
-}
diff --git a/contrib/llvm/examples/BrainF/BrainF.h b/contrib/llvm/examples/BrainF/BrainF.h
deleted file mode 100644
index add0687..0000000
--- a/contrib/llvm/examples/BrainF/BrainF.h
+++ /dev/null
@@ -1,94 +0,0 @@
-//===-- BrainF.h - BrainF compiler class ----------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===--------------------------------------------------------------------===//
-//
-// This class stores the data for the BrainF compiler so it doesn't have
-// to pass all of it around. The main method is parse.
-//
-//===--------------------------------------------------------------------===//
-
-#ifndef BRAINF_H
-#define BRAINF_H
-
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/Support/IRBuilder.h"
-
-using namespace llvm;
-
-/// This class provides a parser for the BrainF language.
-/// The class itself is made to store values during
-/// parsing so they don't have to be passed around
-/// as much.
-class BrainF {
- public:
- /// Options for how BrainF should compile
- enum CompileFlags {
- flag_off = 0,
- flag_arraybounds = 1
- };
-
- /// This is the main method. It parses BrainF from in1
- /// and returns the module with a function
- /// void brainf()
- /// containing the resulting code.
- /// On error, it calls abort.
- /// The caller must delete the returned module.
- Module *parse(std::istream *in1, int mem, CompileFlags cf,
- LLVMContext& C);
-
- protected:
- /// The different symbols in the BrainF language
- enum Symbol {
- SYM_NONE,
- SYM_READ,
- SYM_WRITE,
- SYM_MOVE,
- SYM_CHANGE,
- SYM_LOOP,
- SYM_ENDLOOP,
- SYM_EOF
- };
-
- /// Names of the different parts of the language.
- /// Tape is used for reading and writing the tape.
- /// headreg is used for the position of the head.
- /// label is used for the labels for the BasicBlocks.
- /// testreg is used for testing the loop exit condition.
- static const char *tapereg;
- static const char *headreg;
- static const char *label;
- static const char *testreg;
-
- /// Put the brainf function preamble and other fixed pieces of code
- void header(LLVMContext& C);
-
- /// The main loop for parsing. It calls itself recursively
- /// to handle the depth of nesting of "[]".
- void readloop(PHINode *phi, BasicBlock *oldbb,
- BasicBlock *testbb, LLVMContext &Context);
-
- /// Constants during parsing
- int memtotal;
- CompileFlags comflag;
- std::istream *in;
- Module *module;
- Function *brainf_func;
- Function *getchar_func;
- Function *putchar_func;
- Value *ptr_arr;
- Value *ptr_arrmax;
- BasicBlock *endbb;
- BasicBlock *aberrorbb;
-
- /// Variables
- IRBuilder<> *builder;
- Value *curhead;
-};
-
-#endif
diff --git a/contrib/llvm/examples/BrainF/BrainFDriver.cpp b/contrib/llvm/examples/BrainF/BrainFDriver.cpp
deleted file mode 100644
index c11a580..0000000
--- a/contrib/llvm/examples/BrainF/BrainFDriver.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-//===-- BrainFDriver.cpp - BrainF compiler driver -----------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===--------------------------------------------------------------------===//
-//
-// This program converts the BrainF language into LLVM assembly,
-// which it can then run using the JIT or output as BitCode.
-//
-// This implementation has a tape of 65536 bytes,
-// with the head starting in the middle.
-// Range checking is off by default, so be careful.
-// It can be enabled with -abc.
-//
-// Use:
-// ./BrainF -jit prog.bf #Run program now
-// ./BrainF -jit -abc prog.bf #Run program now safely
-// ./BrainF prog.bf #Write as BitCode
-//
-// lli prog.bf.bc #Run generated BitCode
-// llvm-ld -native -o=prog prog.bf.bc #Compile BitCode into native executable
-//
-//===--------------------------------------------------------------------===//
-
-#include "BrainF.h"
-#include "llvm/Constants.h"
-#include "llvm/Analysis/Verifier.h"
-#include "llvm/Bitcode/ReaderWriter.h"
-#include "llvm/ExecutionEngine/GenericValue.h"
-#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/Target/TargetSelect.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/raw_ostream.h"
-#include <iostream>
-#include <fstream>
-using namespace llvm;
-
-//Command line options
-
-static cl::opt<std::string>
-InputFilename(cl::Positional, cl::desc("<input brainf>"));
-
-static cl::opt<std::string>
-OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"));
-
-static cl::opt<bool>
-ArrayBoundsChecking("abc", cl::desc("Enable array bounds checking"));
-
-static cl::opt<bool>
-JIT("jit", cl::desc("Run program Just-In-Time"));
-
-
-//Add main function so can be fully compiled
-void addMainFunction(Module *mod) {
- //define i32 @main(i32 %argc, i8 **%argv)
- Function *main_func = cast<Function>(mod->
- getOrInsertFunction("main", IntegerType::getInt32Ty(mod->getContext()),
- IntegerType::getInt32Ty(mod->getContext()),
- PointerType::getUnqual(PointerType::getUnqual(
- IntegerType::getInt8Ty(mod->getContext()))), NULL));
- {
- Function::arg_iterator args = main_func->arg_begin();
- Value *arg_0 = args++;
- arg_0->setName("argc");
- Value *arg_1 = args++;
- arg_1->setName("argv");
- }
-
- //main.0:
- BasicBlock *bb = BasicBlock::Create(mod->getContext(), "main.0", main_func);
-
- //call void @brainf()
- {
- CallInst *brainf_call = CallInst::Create(mod->getFunction("brainf"),
- "", bb);
- brainf_call->setTailCall(false);
- }
-
- //ret i32 0
- ReturnInst::Create(mod->getContext(),
- ConstantInt::get(mod->getContext(), APInt(32, 0)), bb);
-}
-
-int main(int argc, char **argv) {
- cl::ParseCommandLineOptions(argc, argv, " BrainF compiler\n");
-
- LLVMContext &Context = getGlobalContext();
-
- if (InputFilename == "") {
- errs() << "Error: You must specify the filename of the program to "
- "be compiled. Use --help to see the options.\n";
- abort();
- }
-
- //Get the output stream
- raw_ostream *out = &outs();
- if (!JIT) {
- if (OutputFilename == "") {
- std::string base = InputFilename;
- if (InputFilename == "-") { base = "a"; }
-
- // Use default filename.
- OutputFilename = base+".bc";
- }
- if (OutputFilename != "-") {
- std::string ErrInfo;
- out = new raw_fd_ostream(OutputFilename.c_str(), ErrInfo,
- raw_fd_ostream::F_Binary);
- }
- }
-
- //Get the input stream
- std::istream *in = &std::cin;
- if (InputFilename != "-")
- in = new std::ifstream(InputFilename.c_str());
-
- //Gather the compile flags
- BrainF::CompileFlags cf = BrainF::flag_off;
- if (ArrayBoundsChecking)
- cf = BrainF::CompileFlags(cf | BrainF::flag_arraybounds);
-
- //Read the BrainF program
- BrainF bf;
- Module *mod = bf.parse(in, 65536, cf, Context); //64 KiB
- if (in != &std::cin)
- delete in;
- addMainFunction(mod);
-
- //Verify generated code
- if (verifyModule(*mod)) {
- errs() << "Error: module failed verification. This shouldn't happen.\n";
- abort();
- }
-
- //Write it out
- if (JIT) {
- InitializeNativeTarget();
-
- outs() << "------- Running JIT -------\n";
- ExecutionEngine *ee = EngineBuilder(mod).create();
- std::vector<GenericValue> args;
- Function *brainf_func = mod->getFunction("brainf");
- GenericValue gv = ee->runFunction(brainf_func, args);
- } else {
- WriteBitcodeToFile(mod, *out);
- }
-
- //Clean up
- if (out != &outs())
- delete out;
- delete mod;
-
- llvm_shutdown();
-
- return 0;
-}
diff --git a/contrib/llvm/examples/BrainF/CMakeLists.txt b/contrib/llvm/examples/BrainF/CMakeLists.txt
deleted file mode 100644
index 7bec105..0000000
--- a/contrib/llvm/examples/BrainF/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-set(LLVM_LINK_COMPONENTS jit bitwriter nativecodegen interpreter)
-
-add_llvm_example(BrainF
- BrainF.cpp
- BrainFDriver.cpp
- )
diff --git a/contrib/llvm/examples/BrainF/Makefile b/contrib/llvm/examples/BrainF/Makefile
deleted file mode 100644
index 2c3e066..0000000
--- a/contrib/llvm/examples/BrainF/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-##===- examples/BrainF/Makefile ----------------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL = ../..
-TOOLNAME = BrainF
-EXAMPLE_TOOL = 1
-
-LINK_COMPONENTS := jit bitwriter nativecodegen interpreter
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/CMakeLists.txt b/contrib/llvm/examples/CMakeLists.txt
deleted file mode 100644
index f60c0ed..0000000
--- a/contrib/llvm/examples/CMakeLists.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-add_subdirectory(BrainF)
-add_subdirectory(Fibonacci)
-add_subdirectory(HowToUseJIT)
-add_subdirectory(Kaleidoscope)
-add_subdirectory(ModuleMaker)
-
-if( NOT WIN32 )
- add_subdirectory(ExceptionDemo)
-endif()
-
-include(CheckIncludeFile)
-check_include_file(pthread.h HAVE_PTHREAD_H)
-
-if( HAVE_PTHREAD_H )
- add_subdirectory(ParallelJIT)
-endif( HAVE_PTHREAD_H )
diff --git a/contrib/llvm/examples/ExceptionDemo/CMakeLists.txt b/contrib/llvm/examples/ExceptionDemo/CMakeLists.txt
deleted file mode 100644
index d6619155..0000000
--- a/contrib/llvm/examples/ExceptionDemo/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-set(LLVM_LINK_COMPONENTS jit nativecodegen)
-
-add_llvm_example(ExceptionDemo
- ExceptionDemo.cpp
- )
diff --git a/contrib/llvm/examples/ExceptionDemo/ExceptionDemo.cpp b/contrib/llvm/examples/ExceptionDemo/ExceptionDemo.cpp
deleted file mode 100644
index bbca963..0000000
--- a/contrib/llvm/examples/ExceptionDemo/ExceptionDemo.cpp
+++ /dev/null
@@ -1,2027 +0,0 @@
-//===-- examples/ExceptionDemo/ExceptionDemo.cpp -
-// An example use of the llvm Exception mechanism --===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===--------------------------------------------------------------------===//
-//
-// Demo program which implements an example LLVM exception implementation, and
-// shows several test cases including the handling of foreign exceptions.
-// It is run with type info types arguments to throw. A test will
-// be run for each given type info type. While type info types with the value
-// of -1 will trigger a foreign C++ exception to be thrown; type info types
-// <= 6 and >= 1 will cause the associated generated exceptions to be thrown
-// and caught by generated test functions; and type info types > 6
-// will result in exceptions which pass through to the test harness. All other
-// type info types are not supported and could cause a crash. In all cases,
-// the "finally" blocks of every generated test functions will executed
-// regardless of whether or not that test function ignores or catches the
-// thrown exception.
-//
-// examples:
-//
-// ExceptionDemo
-//
-// causes a usage to be printed to stderr
-//
-// ExceptionDemo 2 3 7 -1
-//
-// results in the following cases:
-// - Value 2 causes an exception with a type info type of 2 to be
-// thrown and caught by an inner generated test function.
-// - Value 3 causes an exception with a type info type of 3 to be
-// thrown and caught by an outer generated test function.
-// - Value 7 causes an exception with a type info type of 7 to be
-// thrown and NOT be caught by any generated function.
-// - Value -1 causes a foreign C++ exception to be thrown and not be
-// caught by any generated function
-//
-// Cases -1 and 7 are caught by a C++ test harness where the validity of
-// of a C++ catch(...) clause catching a generated exception with a
-// type info type of 7 is questionable.
-//
-// This code uses code from the llvm compiler-rt project and the llvm
-// Kaleidoscope project.
-//
-//===--------------------------------------------------------------------===//
-
-
-#include "llvm/LLVMContext.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/ExecutionEngine/ExecutionEngine.h"
-#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/Module.h"
-#include "llvm/PassManager.h"
-#include "llvm/Intrinsics.h"
-#include "llvm/Analysis/Verifier.h"
-#include "llvm/Target/TargetData.h"
-#include "llvm/Target/TargetSelect.h"
-#include "llvm/Target/TargetOptions.h"
-#include "llvm/Transforms/Scalar.h"
-#include "llvm/Support/IRBuilder.h"
-#include "llvm/Support/Dwarf.h"
-
-#include <cstdio>
-#include <string>
-#include <sstream>
-#include <map>
-#include <vector>
-#include <stdexcept>
-
-
-#ifndef USE_GLOBAL_STR_CONSTS
-#define USE_GLOBAL_STR_CONSTS true
-#endif
-
-// System C++ ABI unwind types from:
-// http://refspecs.freestandards.org/abi-eh-1.21.html
-
-extern "C" {
-
-typedef enum {
- _URC_NO_REASON = 0,
- _URC_FOREIGN_EXCEPTION_CAUGHT = 1,
- _URC_FATAL_PHASE2_ERROR = 2,
- _URC_FATAL_PHASE1_ERROR = 3,
- _URC_NORMAL_STOP = 4,
- _URC_END_OF_STACK = 5,
- _URC_HANDLER_FOUND = 6,
- _URC_INSTALL_CONTEXT = 7,
- _URC_CONTINUE_UNWIND = 8
-} _Unwind_Reason_Code;
-
-typedef enum {
- _UA_SEARCH_PHASE = 1,
- _UA_CLEANUP_PHASE = 2,
- _UA_HANDLER_FRAME = 4,
- _UA_FORCE_UNWIND = 8,
- _UA_END_OF_STACK = 16
-} _Unwind_Action;
-
-struct _Unwind_Exception;
-
-typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code,
- struct _Unwind_Exception *);
-
-struct _Unwind_Exception {
- uint64_t exception_class;
- _Unwind_Exception_Cleanup_Fn exception_cleanup;
-
- uintptr_t private_1;
- uintptr_t private_2;
-
- // @@@ The IA-64 ABI says that this structure must be double-word aligned.
- // Taking that literally does not make much sense generically. Instead
- // we provide the maximum alignment required by any type for the machine.
-} __attribute__((__aligned__));
-
-struct _Unwind_Context;
-typedef struct _Unwind_Context* _Unwind_Context_t;
-
-extern const uint8_t* _Unwind_GetLanguageSpecificData (_Unwind_Context_t c);
-extern uintptr_t _Unwind_GetGR (_Unwind_Context_t c, int i);
-extern void _Unwind_SetGR (_Unwind_Context_t c, int i, uintptr_t n);
-extern void _Unwind_SetIP (_Unwind_Context_t, uintptr_t new_value);
-extern uintptr_t _Unwind_GetIP (_Unwind_Context_t context);
-extern uintptr_t _Unwind_GetRegionStart (_Unwind_Context_t context);
-
-} // extern "C"
-
-//
-// Example types
-//
-
-/// This is our simplistic type info
-struct OurExceptionType_t {
- /// type info type
- int type;
-};
-
-
-/// This is our Exception class which relies on a negative offset to calculate
-/// pointers to its instances from pointers to its unwindException member.
-///
-/// Note: The above unwind.h defines struct _Unwind_Exception to be aligned
-/// on a double word boundary. This is necessary to match the standard:
-/// http://refspecs.freestandards.org/abi-eh-1.21.html
-struct OurBaseException_t {
- struct OurExceptionType_t type;
-
- // Note: This is properly aligned in unwind.h
- struct _Unwind_Exception unwindException;
-};
-
-
-// Note: Not needed since we are C++
-typedef struct OurBaseException_t OurException;
-typedef struct _Unwind_Exception OurUnwindException;
-
-//
-// Various globals used to support typeinfo and generatted exceptions in
-// general
-//
-
-static std::map<std::string, llvm::Value*> namedValues;
-
-int64_t ourBaseFromUnwindOffset;
-
-const unsigned char ourBaseExcpClassChars[] =
- {'o', 'b', 'j', '\0', 'b', 'a', 's', '\0'};
-
-
-static uint64_t ourBaseExceptionClass = 0;
-
-static std::vector<std::string> ourTypeInfoNames;
-static std::map<int, std::string> ourTypeInfoNamesIndex;
-
-static llvm::StructType* ourTypeInfoType;
-static llvm::StructType* ourExceptionType;
-static llvm::StructType* ourUnwindExceptionType;
-
-static llvm::ConstantInt* ourExceptionNotThrownState;
-static llvm::ConstantInt* ourExceptionThrownState;
-static llvm::ConstantInt* ourExceptionCaughtState;
-
-typedef std::vector<std::string> ArgNames;
-typedef std::vector<const llvm::Type*> ArgTypes;
-
-//
-// Code Generation Utilities
-//
-
-/// Utility used to create a function, both declarations and definitions
-/// @param module for module instance
-/// @param retType function return type
-/// @param theArgTypes function's ordered argument types
-/// @param theArgNames function's ordered arguments needed if use of this
-/// function corresponds to a function definition. Use empty
-/// aggregate for function declarations.
-/// @param functName function name
-/// @param linkage function linkage
-/// @param declarationOnly for function declarations
-/// @param isVarArg function uses vararg arguments
-/// @returns function instance
-llvm::Function *createFunction(llvm::Module& module,
- const llvm::Type* retType,
- const ArgTypes& theArgTypes,
- const ArgNames& theArgNames,
- const std::string& functName,
- llvm::GlobalValue::LinkageTypes linkage,
- bool declarationOnly,
- bool isVarArg) {
- llvm::FunctionType* functType = llvm::FunctionType::get(retType,
- theArgTypes,
- isVarArg);
- llvm::Function* ret = llvm::Function::Create(functType,
- linkage,
- functName,
- &module);
- if (!ret || declarationOnly)
- return(ret);
-
- namedValues.clear();
- unsigned i = 0;
- for (llvm::Function::arg_iterator argIndex = ret->arg_begin();
- i != theArgNames.size();
- ++argIndex, ++i) {
-
- argIndex->setName(theArgNames[i]);
- namedValues[theArgNames[i]] = argIndex;
- }
-
- return(ret);
-}
-
-
-/// Create an alloca instruction in the entry block of
-/// the parent function. This is used for mutable variables etc.
-/// @param function parent instance
-/// @param varName stack variable name
-/// @param type stack variable type
-/// @param initWith optional constant initialization value
-/// @returns AllocaInst instance
-static llvm::AllocaInst *createEntryBlockAlloca(llvm::Function& function,
- const std::string &varName,
- const llvm::Type* type,
- llvm::Constant* initWith = NULL) {
- llvm::BasicBlock& block = function.getEntryBlock();
- llvm::IRBuilder<> tmp(&block, block.begin());
- llvm::AllocaInst* ret = tmp.CreateAlloca(type, 0, varName.c_str());
-
- if (initWith)
- tmp.CreateStore(initWith, ret);
-
- return(ret);
-}
-
-
-//
-// Code Generation Utilities End
-//
-
-//
-// Runtime C Library functions
-//
-
-// Note: using an extern "C" block so that static functions can be used
-extern "C" {
-
-// Note: Better ways to decide on bit width
-//
-/// Prints a 32 bit number, according to the format, to stderr.
-/// @param intToPrint integer to print
-/// @param format printf like format to use when printing
-void print32Int(int intToPrint, const char* format) {
- if (format) {
- // Note: No NULL check
- fprintf(stderr, format, intToPrint);
- }
- else {
- // Note: No NULL check
- fprintf(stderr, "::print32Int(...):NULL arg.\n");
- }
-}
-
-
-// Note: Better ways to decide on bit width
-//
-/// Prints a 64 bit number, according to the format, to stderr.
-/// @param intToPrint integer to print
-/// @param format printf like format to use when printing
-void print64Int(long int intToPrint, const char* format) {
- if (format) {
- // Note: No NULL check
- fprintf(stderr, format, intToPrint);
- }
- else {
- // Note: No NULL check
- fprintf(stderr, "::print64Int(...):NULL arg.\n");
- }
-}
-
-
-/// Prints a C string to stderr
-/// @param toPrint string to print
-void printStr(char* toPrint) {
- if (toPrint) {
- fprintf(stderr, "%s", toPrint);
- }
- else {
- fprintf(stderr, "::printStr(...):NULL arg.\n");
- }
-}
-
-
-/// Deletes the true previosly allocated exception whose address
-/// is calculated from the supplied OurBaseException_t::unwindException
-/// member address. Handles (ignores), NULL pointers.
-/// @param expToDelete exception to delete
-void deleteOurException(OurUnwindException* expToDelete) {
-#ifdef DEBUG
- fprintf(stderr,
- "deleteOurException(...).\n");
-#endif
-
- if (expToDelete &&
- (expToDelete->exception_class == ourBaseExceptionClass)) {
-
- free(((char*) expToDelete) + ourBaseFromUnwindOffset);
- }
-}
-
-
-/// This function is the struct _Unwind_Exception API mandated delete function
-/// used by foreign exception handlers when deleting our exception
-/// (OurException), instances.
-/// @param reason @link http://refspecs.freestandards.org/abi-eh-1.21.html
-/// @unlink
-/// @param expToDelete exception instance to delete
-void deleteFromUnwindOurException(_Unwind_Reason_Code reason,
- OurUnwindException* expToDelete) {
-#ifdef DEBUG
- fprintf(stderr,
- "deleteFromUnwindOurException(...).\n");
-#endif
-
- deleteOurException(expToDelete);
-}
-
-
-/// Creates (allocates on the heap), an exception (OurException instance),
-/// of the supplied type info type.
-/// @param type type info type
-OurUnwindException* createOurException(int type) {
- size_t size = sizeof(OurException);
- OurException* ret = (OurException*) memset(malloc(size), 0, size);
- (ret->type).type = type;
- (ret->unwindException).exception_class = ourBaseExceptionClass;
- (ret->unwindException).exception_cleanup = deleteFromUnwindOurException;
-
- return(&(ret->unwindException));
-}
-
-
-/// Read a uleb128 encoded value and advance pointer
-/// See Variable Length Data in:
-/// @link http://dwarfstd.org/Dwarf3.pdf @unlink
-/// @param data reference variable holding memory pointer to decode from
-/// @returns decoded value
-static uintptr_t readULEB128(const uint8_t** data) {
- uintptr_t result = 0;
- uintptr_t shift = 0;
- unsigned char byte;
- const uint8_t* p = *data;
-
- do {
- byte = *p++;
- result |= (byte & 0x7f) << shift;
- shift += 7;
- }
- while (byte & 0x80);
-
- *data = p;
-
- return result;
-}
-
-
-/// Read a sleb128 encoded value and advance pointer
-/// See Variable Length Data in:
-/// @link http://dwarfstd.org/Dwarf3.pdf @unlink
-/// @param data reference variable holding memory pointer to decode from
-/// @returns decoded value
-static uintptr_t readSLEB128(const uint8_t** data) {
- uintptr_t result = 0;
- uintptr_t shift = 0;
- unsigned char byte;
- const uint8_t* p = *data;
-
- do {
- byte = *p++;
- result |= (byte & 0x7f) << shift;
- shift += 7;
- }
- while (byte & 0x80);
-
- *data = p;
-
- if ((byte & 0x40) && (shift < (sizeof(result) << 3))) {
- result |= (~0 << shift);
- }
-
- return result;
-}
-
-
-/// Read a pointer encoded value and advance pointer
-/// See Variable Length Data in:
-/// @link http://dwarfstd.org/Dwarf3.pdf @unlink
-/// @param data reference variable holding memory pointer to decode from
-/// @param encoding dwarf encoding type
-/// @returns decoded value
-static uintptr_t readEncodedPointer(const uint8_t** data, uint8_t encoding) {
- uintptr_t result = 0;
- const uint8_t* p = *data;
-
- if (encoding == llvm::dwarf::DW_EH_PE_omit)
- return(result);
-
- // first get value
- switch (encoding & 0x0F) {
- case llvm::dwarf::DW_EH_PE_absptr:
- result = *((uintptr_t*)p);
- p += sizeof(uintptr_t);
- break;
- case llvm::dwarf::DW_EH_PE_uleb128:
- result = readULEB128(&p);
- break;
- // Note: This case has not been tested
- case llvm::dwarf::DW_EH_PE_sleb128:
- result = readSLEB128(&p);
- break;
- case llvm::dwarf::DW_EH_PE_udata2:
- result = *((uint16_t*)p);
- p += sizeof(uint16_t);
- break;
- case llvm::dwarf::DW_EH_PE_udata4:
- result = *((uint32_t*)p);
- p += sizeof(uint32_t);
- break;
- case llvm::dwarf::DW_EH_PE_udata8:
- result = *((uint64_t*)p);
- p += sizeof(uint64_t);
- break;
- case llvm::dwarf::DW_EH_PE_sdata2:
- result = *((int16_t*)p);
- p += sizeof(int16_t);
- break;
- case llvm::dwarf::DW_EH_PE_sdata4:
- result = *((int32_t*)p);
- p += sizeof(int32_t);
- break;
- case llvm::dwarf::DW_EH_PE_sdata8:
- result = *((int64_t*)p);
- p += sizeof(int64_t);
- break;
- default:
- // not supported
- abort();
- break;
- }
-
- // then add relative offset
- switch (encoding & 0x70) {
- case llvm::dwarf::DW_EH_PE_absptr:
- // do nothing
- break;
- case llvm::dwarf::DW_EH_PE_pcrel:
- result += (uintptr_t)(*data);
- break;
- case llvm::dwarf::DW_EH_PE_textrel:
- case llvm::dwarf::DW_EH_PE_datarel:
- case llvm::dwarf::DW_EH_PE_funcrel:
- case llvm::dwarf::DW_EH_PE_aligned:
- default:
- // not supported
- abort();
- break;
- }
-
- // then apply indirection
- if (encoding & llvm::dwarf::DW_EH_PE_indirect) {
- result = *((uintptr_t*)result);
- }
-
- *data = p;
-
- return result;
-}
-
-
-/// Deals with Dwarf actions matching our type infos
-/// (OurExceptionType_t instances). Returns whether or not a dwarf emitted
-/// action matches the supplied exception type. If such a match succeeds,
-/// the resultAction argument will be set with > 0 index value. Only
-/// corresponding llvm.eh.selector type info arguments, cleanup arguments
-/// are supported. Filters are not supported.
-/// See Variable Length Data in:
-/// @link http://dwarfstd.org/Dwarf3.pdf @unlink
-/// Also see @link http://refspecs.freestandards.org/abi-eh-1.21.html @unlink
-/// @param resultAction reference variable which will be set with result
-/// @param classInfo our array of type info pointers (to globals)
-/// @param actionEntry index into above type info array or 0 (clean up).
-/// We do not support filters.
-/// @param exceptionClass exception class (_Unwind_Exception::exception_class)
-/// of thrown exception.
-/// @param exceptionObject thrown _Unwind_Exception instance.
-/// @returns whether or not a type info was found. False is returned if only
-/// a cleanup was found
-static bool handleActionValue(int64_t *resultAction,
- struct OurExceptionType_t **classInfo,
- uintptr_t actionEntry,
- uint64_t exceptionClass,
- struct _Unwind_Exception *exceptionObject) {
- bool ret = false;
-
- if (!resultAction ||
- !exceptionObject ||
- (exceptionClass != ourBaseExceptionClass))
- return(ret);
-
- struct OurBaseException_t* excp = (struct OurBaseException_t*)
- (((char*) exceptionObject) + ourBaseFromUnwindOffset);
- struct OurExceptionType_t *excpType = &(excp->type);
- int type = excpType->type;
-
-#ifdef DEBUG
- fprintf(stderr,
- "handleActionValue(...): exceptionObject = <%p>, "
- "excp = <%p>.\n",
- exceptionObject,
- excp);
-#endif
-
- const uint8_t *actionPos = (uint8_t*) actionEntry,
- *tempActionPos;
- int64_t typeOffset = 0,
- actionOffset;
-
- for (int i = 0; true; ++i) {
- // Each emitted dwarf action corresponds to a 2 tuple of
- // type info address offset, and action offset to the next
- // emitted action.
- typeOffset = readSLEB128(&actionPos);
- tempActionPos = actionPos;
- actionOffset = readSLEB128(&tempActionPos);
-
-#ifdef DEBUG
- fprintf(stderr,
- "handleActionValue(...):typeOffset: <%lld>, "
- "actionOffset: <%lld>.\n",
- typeOffset,
- actionOffset);
-#endif
- assert((typeOffset >= 0) &&
- "handleActionValue(...):filters are not supported.");
-
- // Note: A typeOffset == 0 implies that a cleanup llvm.eh.selector
- // argument has been matched.
- if ((typeOffset > 0) &&
- (type == (classInfo[-typeOffset])->type)) {
-#ifdef DEBUG
- fprintf(stderr,
- "handleActionValue(...):actionValue <%d> found.\n",
- i);
-#endif
- *resultAction = i + 1;
- ret = true;
- break;
- }
-
-#ifdef DEBUG
- fprintf(stderr,
- "handleActionValue(...):actionValue not found.\n");
-#endif
- if (!actionOffset)
- break;
-
- actionPos += actionOffset;
- }
-
- return(ret);
-}
-
-
-/// Deals with the Language specific data portion of the emitted dwarf code.
-/// See @link http://refspecs.freestandards.org/abi-eh-1.21.html @unlink
-/// @param version unsupported (ignored), unwind version
-/// @param lsda language specific data area
-/// @param _Unwind_Action actions minimally supported unwind stage
-/// (forced specifically not supported)
-/// @param exceptionClass exception class (_Unwind_Exception::exception_class)
-/// of thrown exception.
-/// @param exceptionObject thrown _Unwind_Exception instance.
-/// @param context unwind system context
-/// @returns minimally supported unwinding control indicator
-static _Unwind_Reason_Code handleLsda(int version,
- const uint8_t* lsda,
- _Unwind_Action actions,
- uint64_t exceptionClass,
- struct _Unwind_Exception* exceptionObject,
- _Unwind_Context_t context) {
- _Unwind_Reason_Code ret = _URC_CONTINUE_UNWIND;
-
- if (!lsda)
- return(ret);
-
-#ifdef DEBUG
- fprintf(stderr,
- "handleLsda(...):lsda is non-zero.\n");
-#endif
-
- // Get the current instruction pointer and offset it before next
- // instruction in the current frame which threw the exception.
- uintptr_t pc = _Unwind_GetIP(context)-1;
-
- // Get beginning current frame's code (as defined by the
- // emitted dwarf code)
- uintptr_t funcStart = _Unwind_GetRegionStart(context);
- uintptr_t pcOffset = pc - funcStart;
- struct OurExceptionType_t** classInfo = NULL;
-
- // Note: See JITDwarfEmitter::EmitExceptionTable(...) for corresponding
- // dwarf emission
-
- // Parse LSDA header.
- uint8_t lpStartEncoding = *lsda++;
-
- if (lpStartEncoding != llvm::dwarf::DW_EH_PE_omit) {
- readEncodedPointer(&lsda, lpStartEncoding);
- }
-
- uint8_t ttypeEncoding = *lsda++;
- uintptr_t classInfoOffset;
-
- if (ttypeEncoding != llvm::dwarf::DW_EH_PE_omit) {
- // Calculate type info locations in emitted dwarf code which
- // were flagged by type info arguments to llvm.eh.selector
- // intrinsic
- classInfoOffset = readULEB128(&lsda);
- classInfo = (struct OurExceptionType_t**) (lsda + classInfoOffset);
- }
-
- // Walk call-site table looking for range that
- // includes current PC.
-
- uint8_t callSiteEncoding = *lsda++;
- uint32_t callSiteTableLength = readULEB128(&lsda);
- const uint8_t* callSiteTableStart = lsda;
- const uint8_t* callSiteTableEnd = callSiteTableStart +
- callSiteTableLength;
- const uint8_t* actionTableStart = callSiteTableEnd;
- const uint8_t* callSitePtr = callSiteTableStart;
-
- bool foreignException = false;
-
- while (callSitePtr < callSiteTableEnd) {
- uintptr_t start = readEncodedPointer(&callSitePtr,
- callSiteEncoding);
- uintptr_t length = readEncodedPointer(&callSitePtr,
- callSiteEncoding);
- uintptr_t landingPad = readEncodedPointer(&callSitePtr,
- callSiteEncoding);
-
- // Note: Action value
- uintptr_t actionEntry = readULEB128(&callSitePtr);
-
- if (exceptionClass != ourBaseExceptionClass) {
- // We have been notified of a foreign exception being thrown,
- // and we therefore need to execute cleanup landing pads
- actionEntry = 0;
- foreignException = true;
- }
-
- if (landingPad == 0) {
-#ifdef DEBUG
- fprintf(stderr,
- "handleLsda(...): No landing pad found.\n");
-#endif
-
- continue; // no landing pad for this entry
- }
-
- if (actionEntry) {
- actionEntry += ((uintptr_t) actionTableStart) - 1;
- }
- else {
-#ifdef DEBUG
- fprintf(stderr,
- "handleLsda(...):No action table found.\n");
-#endif
- }
-
- bool exceptionMatched = false;
-
- if ((start <= pcOffset) && (pcOffset < (start + length))) {
-#ifdef DEBUG
- fprintf(stderr,
- "handleLsda(...): Landing pad found.\n");
-#endif
- int64_t actionValue = 0;
-
- if (actionEntry) {
- exceptionMatched = handleActionValue
- (
- &actionValue,
- classInfo,
- actionEntry,
- exceptionClass,
- exceptionObject
- );
- }
-
- if (!(actions & _UA_SEARCH_PHASE)) {
-#ifdef DEBUG
- fprintf(stderr,
- "handleLsda(...): installed landing pad "
- "context.\n");
-#endif
-
- // Found landing pad for the PC.
- // Set Instruction Pointer to so we re-enter function
- // at landing pad. The landing pad is created by the
- // compiler to take two parameters in registers.
- _Unwind_SetGR(context,
- __builtin_eh_return_data_regno(0),
- (uintptr_t)exceptionObject);
-
- // Note: this virtual register directly corresponds
- // to the return of the llvm.eh.selector intrinsic
- if (!actionEntry || !exceptionMatched) {
- // We indicate cleanup only
- _Unwind_SetGR(context,
- __builtin_eh_return_data_regno(1),
- 0);
- }
- else {
- // Matched type info index of llvm.eh.selector intrinsic
- // passed here.
- _Unwind_SetGR(context,
- __builtin_eh_return_data_regno(1),
- actionValue);
- }
-
- // To execute landing pad set here
- _Unwind_SetIP(context, funcStart + landingPad);
- ret = _URC_INSTALL_CONTEXT;
- }
- else if (exceptionMatched) {
-#ifdef DEBUG
- fprintf(stderr,
- "handleLsda(...): setting handler found.\n");
-#endif
- ret = _URC_HANDLER_FOUND;
- }
- else {
- // Note: Only non-clean up handlers are marked as
- // found. Otherwise the clean up handlers will be
- // re-found and executed during the clean up
- // phase.
-#ifdef DEBUG
- fprintf(stderr,
- "handleLsda(...): cleanup handler found.\n");
-#endif
- }
-
- break;
- }
- }
-
- return(ret);
-}
-
-
-/// This is the personality function which is embedded (dwarf emitted), in the
-/// dwarf unwind info block. Again see: JITDwarfEmitter.cpp.
-/// See @link http://refspecs.freestandards.org/abi-eh-1.21.html @unlink
-/// @param version unsupported (ignored), unwind version
-/// @param _Unwind_Action actions minimally supported unwind stage
-/// (forced specifically not supported)
-/// @param exceptionClass exception class (_Unwind_Exception::exception_class)
-/// of thrown exception.
-/// @param exceptionObject thrown _Unwind_Exception instance.
-/// @param context unwind system context
-/// @returns minimally supported unwinding control indicator
-_Unwind_Reason_Code ourPersonality(int version,
- _Unwind_Action actions,
- uint64_t exceptionClass,
- struct _Unwind_Exception* exceptionObject,
- _Unwind_Context_t context) {
-#ifdef DEBUG
- fprintf(stderr,
- "We are in ourPersonality(...):actions is <%d>.\n",
- actions);
-
- if (actions & _UA_SEARCH_PHASE) {
- fprintf(stderr, "ourPersonality(...):In search phase.\n");
- }
- else {
- fprintf(stderr, "ourPersonality(...):In non-search phase.\n");
- }
-#endif
-
- const uint8_t* lsda = _Unwind_GetLanguageSpecificData(context);
-
-#ifdef DEBUG
- fprintf(stderr,
- "ourPersonality(...):lsda = <%p>.\n",
- lsda);
-#endif
-
- // The real work of the personality function is captured here
- return(handleLsda(version,
- lsda,
- actions,
- exceptionClass,
- exceptionObject,
- context));
-}
-
-
-/// Generates our _Unwind_Exception class from a given character array.
-/// thereby handling arbitrary lengths (not in standard), and handling
-/// embedded \0s.
-/// See @link http://refspecs.freestandards.org/abi-eh-1.21.html @unlink
-/// @param classChars char array to encode. NULL values not checkedf
-/// @param classCharsSize number of chars in classChars. Value is not checked.
-/// @returns class value
-uint64_t genClass(const unsigned char classChars[], size_t classCharsSize)
-{
- uint64_t ret = classChars[0];
-
- for (unsigned i = 1; i < classCharsSize; ++i) {
- ret <<= 8;
- ret += classChars[i];
- }
-
- return(ret);
-}
-
-} // extern "C"
-
-//
-// Runtime C Library functions End
-//
-
-//
-// Code generation functions
-//
-
-/// Generates code to print given constant string
-/// @param context llvm context
-/// @param module code for module instance
-/// @param builder builder instance
-/// @param toPrint string to print
-/// @param useGlobal A value of true (default) indicates a GlobalValue is
-/// generated, and is used to hold the constant string. A value of
-/// false indicates that the constant string will be stored on the
-/// stack.
-void generateStringPrint(llvm::LLVMContext& context,
- llvm::Module& module,
- llvm::IRBuilder<>& builder,
- std::string toPrint,
- bool useGlobal = true) {
- llvm::Function *printFunct = module.getFunction("printStr");
-
- llvm::Value *stringVar;
- llvm::Constant* stringConstant =
- llvm::ConstantArray::get(context, toPrint);
-
- if (useGlobal) {
- // Note: Does not work without allocation
- stringVar =
- new llvm::GlobalVariable(module,
- stringConstant->getType(),
- true,
- llvm::GlobalValue::LinkerPrivateLinkage,
- stringConstant,
- "");
- }
- else {
- stringVar = builder.CreateAlloca(stringConstant->getType());
- builder.CreateStore(stringConstant, stringVar);
- }
-
- llvm::Value* cast =
- builder.CreatePointerCast(stringVar,
- builder.getInt8Ty()->getPointerTo());
- builder.CreateCall(printFunct, cast);
-}
-
-
-/// Generates code to print given runtime integer according to constant
-/// string format, and a given print function.
-/// @param context llvm context
-/// @param module code for module instance
-/// @param builder builder instance
-/// @param printFunct function used to "print" integer
-/// @param toPrint string to print
-/// @param format printf like formating string for print
-/// @param useGlobal A value of true (default) indicates a GlobalValue is
-/// generated, and is used to hold the constant string. A value of
-/// false indicates that the constant string will be stored on the
-/// stack.
-void generateIntegerPrint(llvm::LLVMContext& context,
- llvm::Module& module,
- llvm::IRBuilder<>& builder,
- llvm::Function& printFunct,
- llvm::Value& toPrint,
- std::string format,
- bool useGlobal = true) {
- llvm::Constant *stringConstant = llvm::ConstantArray::get(context, format);
- llvm::Value *stringVar;
-
- if (useGlobal) {
- // Note: Does not seem to work without allocation
- stringVar =
- new llvm::GlobalVariable(module,
- stringConstant->getType(),
- true,
- llvm::GlobalValue::LinkerPrivateLinkage,
- stringConstant,
- "");
- }
- else {
- stringVar = builder.CreateAlloca(stringConstant->getType());
- builder.CreateStore(stringConstant, stringVar);
- }
-
- llvm::Value* cast =
- builder.CreateBitCast(stringVar,
- builder.getInt8Ty()->getPointerTo());
- builder.CreateCall2(&printFunct, &toPrint, cast);
-}
-
-
-/// Generates code to handle finally block type semantics: always runs
-/// regardless of whether a thrown exception is passing through or the
-/// parent function is simply exiting. In addition to printing some state
-/// to stderr, this code will resume the exception handling--runs the
-/// unwind resume block, if the exception has not been previously caught
-/// by a catch clause, and will otherwise execute the end block (terminator
-/// block). In addition this function creates the corresponding function's
-/// stack storage for the exception pointer and catch flag status.
-/// @param context llvm context
-/// @param module code for module instance
-/// @param builder builder instance
-/// @param toAddTo parent function to add block to
-/// @param blockName block name of new "finally" block.
-/// @param functionId output id used for printing
-/// @param terminatorBlock terminator "end" block
-/// @param unwindResumeBlock unwind resume block
-/// @param exceptionCaughtFlag reference exception caught/thrown status storage
-/// @param exceptionStorage reference to exception pointer storage
-/// @returns newly created block
-static llvm::BasicBlock* createFinallyBlock(llvm::LLVMContext& context,
- llvm::Module& module,
- llvm::IRBuilder<>& builder,
- llvm::Function& toAddTo,
- std::string& blockName,
- std::string& functionId,
- llvm::BasicBlock& terminatorBlock,
- llvm::BasicBlock& unwindResumeBlock,
- llvm::Value** exceptionCaughtFlag,
- llvm::Value** exceptionStorage) {
- assert(exceptionCaughtFlag &&
- "ExceptionDemo::createFinallyBlock(...):exceptionCaughtFlag "
- "is NULL");
- assert(exceptionStorage &&
- "ExceptionDemo::createFinallyBlock(...):exceptionStorage "
- "is NULL");
-
- *exceptionCaughtFlag =
- createEntryBlockAlloca(toAddTo,
- "exceptionCaught",
- ourExceptionNotThrownState->getType(),
- ourExceptionNotThrownState);
-
- const llvm::PointerType* exceptionStorageType =
- builder.getInt8Ty()->getPointerTo();
- *exceptionStorage =
- createEntryBlockAlloca(toAddTo,
- "exceptionStorage",
- exceptionStorageType,
- llvm::ConstantPointerNull::get(
- exceptionStorageType));
-
- llvm::BasicBlock *ret = llvm::BasicBlock::Create(context,
- blockName,
- &toAddTo);
-
- builder.SetInsertPoint(ret);
-
- std::ostringstream bufferToPrint;
- bufferToPrint << "Gen: Executing finally block "
- << blockName
- << " in "
- << functionId
- << std::endl;
- generateStringPrint(context,
- module,
- builder,
- bufferToPrint.str(),
- USE_GLOBAL_STR_CONSTS);
-
- llvm::SwitchInst* theSwitch =
- builder.CreateSwitch(builder.CreateLoad(*exceptionCaughtFlag),
- &terminatorBlock,
- 2);
- theSwitch->addCase(ourExceptionCaughtState, &terminatorBlock);
- theSwitch->addCase(ourExceptionThrownState, &unwindResumeBlock);
-
- return(ret);
-}
-
-
-/// Generates catch block semantics which print a string to indicate type of
-/// catch executed, sets an exception caught flag, and executes passed in
-/// end block (terminator block).
-/// @param context llvm context
-/// @param module code for module instance
-/// @param builder builder instance
-/// @param toAddTo parent function to add block to
-/// @param blockName block name of new "catch" block.
-/// @param functionId output id used for printing
-/// @param terminatorBlock terminator "end" block
-/// @param exceptionCaughtFlag exception caught/thrown status
-/// @returns newly created block
-static llvm::BasicBlock* createCatchBlock(llvm::LLVMContext& context,
- llvm::Module& module,
- llvm::IRBuilder<>& builder,
- llvm::Function& toAddTo,
- std::string& blockName,
- std::string& functionId,
- llvm::BasicBlock& terminatorBlock,
- llvm::Value& exceptionCaughtFlag) {
-
- llvm::BasicBlock *ret = llvm::BasicBlock::Create(context,
- blockName,
- &toAddTo);
-
- builder.SetInsertPoint(ret);
-
- std::ostringstream bufferToPrint;
- bufferToPrint << "Gen: Executing catch block "
- << blockName
- << " in "
- << functionId
- << std::endl;
- generateStringPrint(context,
- module,
- builder,
- bufferToPrint.str(),
- USE_GLOBAL_STR_CONSTS);
- builder.CreateStore(ourExceptionCaughtState, &exceptionCaughtFlag);
- builder.CreateBr(&terminatorBlock);
-
- return(ret);
-}
-
-
-/// Generates a function which invokes a function (toInvoke) and, whose
-/// unwind block will "catch" the type info types correspondingly held in the
-/// exceptionTypesToCatch argument. If the toInvoke function throws an
-/// exception which does not match any type info types contained in
-/// exceptionTypesToCatch, the generated code will call _Unwind_Resume
-/// with the raised exception. On the other hand the generated code will
-/// normally exit if the toInvoke function does not throw an exception.
-/// The generated "finally" block is always run regardless of the cause of
-/// the generated function exit.
-/// The generated function is returned after being verified.
-/// @param module code for module instance
-/// @param builder builder instance
-/// @param fpm a function pass manager holding optional IR to IR
-/// transformations
-/// @param toInvoke inner function to invoke
-/// @param ourId id used to printing purposes
-/// @param numExceptionsToCatch length of exceptionTypesToCatch array
-/// @param exceptionTypesToCatch array of type info types to "catch"
-/// @returns generated function
-static
-llvm::Function* createCatchWrappedInvokeFunction(llvm::Module& module,
- llvm::IRBuilder<>& builder,
- llvm::FunctionPassManager& fpm,
- llvm::Function& toInvoke,
- std::string ourId,
- unsigned numExceptionsToCatch,
- unsigned exceptionTypesToCatch[]) {
-
- llvm::LLVMContext& context = module.getContext();
- llvm::Function *toPrint32Int = module.getFunction("print32Int");
-
- ArgTypes argTypes;
- argTypes.push_back(builder.getInt32Ty());
-
- ArgNames argNames;
- argNames.push_back("exceptTypeToThrow");
-
- llvm::Function* ret = createFunction(module,
- builder.getVoidTy(),
- argTypes,
- argNames,
- ourId,
- llvm::Function::ExternalLinkage,
- false,
- false);
-
- // Block which calls invoke
- llvm::BasicBlock *entryBlock = llvm::BasicBlock::Create(context,
- "entry",
- ret);
- // Normal block for invoke
- llvm::BasicBlock *normalBlock = llvm::BasicBlock::Create(context,
- "normal",
- ret);
- // Unwind block for invoke
- llvm::BasicBlock *exceptionBlock =
- llvm::BasicBlock::Create(context, "exception", ret);
-
- // Block which routes exception to correct catch handler block
- llvm::BasicBlock *exceptionRouteBlock =
- llvm::BasicBlock::Create(context, "exceptionRoute", ret);
-
- // Foreign exception handler
- llvm::BasicBlock *externalExceptionBlock =
- llvm::BasicBlock::Create(context, "externalException", ret);
-
- // Block which calls _Unwind_Resume
- llvm::BasicBlock *unwindResumeBlock =
- llvm::BasicBlock::Create(context, "unwindResume", ret);
-
- // Clean up block which delete exception if needed
- llvm::BasicBlock *endBlock =
- llvm::BasicBlock::Create(context, "end", ret);
-
- std::string nextName;
- std::vector<llvm::BasicBlock*> catchBlocks(numExceptionsToCatch);
- llvm::Value* exceptionCaughtFlag = NULL;
- llvm::Value* exceptionStorage = NULL;
-
- // Finally block which will branch to unwindResumeBlock if
- // exception is not caught. Initializes/allocates stack locations.
- llvm::BasicBlock* finallyBlock = createFinallyBlock(context,
- module,
- builder,
- *ret,
- nextName = "finally",
- ourId,
- *endBlock,
- *unwindResumeBlock,
- &exceptionCaughtFlag,
- &exceptionStorage);
-
- for (unsigned i = 0; i < numExceptionsToCatch; ++i) {
- nextName = ourTypeInfoNames[exceptionTypesToCatch[i]];
-
- // One catch block per type info to be caught
- catchBlocks[i] = createCatchBlock(context,
- module,
- builder,
- *ret,
- nextName,
- ourId,
- *finallyBlock,
- *exceptionCaughtFlag);
- }
-
- // Entry Block
-
- builder.SetInsertPoint(entryBlock);
-
- std::vector<llvm::Value*> args;
- args.push_back(namedValues["exceptTypeToThrow"]);
- builder.CreateInvoke(&toInvoke,
- normalBlock,
- exceptionBlock,
- args.begin(),
- args.end());
-
- // End Block
-
- builder.SetInsertPoint(endBlock);
-
- generateStringPrint(context,
- module,
- builder,
- "Gen: In end block: exiting in " + ourId + ".\n",
- USE_GLOBAL_STR_CONSTS);
- llvm::Function *deleteOurException =
- module.getFunction("deleteOurException");
-
- // Note: function handles NULL exceptions
- builder.CreateCall(deleteOurException,
- builder.CreateLoad(exceptionStorage));
- builder.CreateRetVoid();
-
- // Normal Block
-
- builder.SetInsertPoint(normalBlock);
-
- generateStringPrint(context,
- module,
- builder,
- "Gen: No exception in " + ourId + "!\n",
- USE_GLOBAL_STR_CONSTS);
-
- // Finally block is always called
- builder.CreateBr(finallyBlock);
-
- // Unwind Resume Block
-
- builder.SetInsertPoint(unwindResumeBlock);
-
- llvm::Function *resumeOurException =
- module.getFunction("_Unwind_Resume");
- builder.CreateCall(resumeOurException,
- builder.CreateLoad(exceptionStorage));
- builder.CreateUnreachable();
-
- // Exception Block
-
- builder.SetInsertPoint(exceptionBlock);
-
- llvm::Function *ehException = module.getFunction("llvm.eh.exception");
-
- // Retrieve thrown exception
- llvm::Value* unwindException = builder.CreateCall(ehException);
-
- // Store exception and flag
- builder.CreateStore(unwindException, exceptionStorage);
- builder.CreateStore(ourExceptionThrownState, exceptionCaughtFlag);
- llvm::Function *personality = module.getFunction("ourPersonality");
- llvm::Value* functPtr =
- builder.CreatePointerCast(personality,
- builder.getInt8Ty()->getPointerTo());
-
- args.clear();
- args.push_back(unwindException);
- args.push_back(functPtr);
-
- // Note: Skipping index 0
- for (unsigned i = 0; i < numExceptionsToCatch; ++i) {
- // Set up type infos to be caught
- args.push_back(
- module.getGlobalVariable(
- ourTypeInfoNames[exceptionTypesToCatch[i]]));
- }
-
- args.push_back(llvm::ConstantInt::get(builder.getInt32Ty(), 0));
-
- llvm::Function *ehSelector = module.getFunction("llvm.eh.selector");
-
- // Set up this exeption block as the landing pad which will handle
- // given type infos. See case Intrinsic::eh_selector in
- // SelectionDAGBuilder::visitIntrinsicCall(...) and AddCatchInfo(...)
- // implemented in FunctionLoweringInfo.cpp to see how the implementation
- // handles this call. This landing pad (this exception block), will be
- // called either because it nees to cleanup (call finally) or a type
- // info was found which matched the thrown exception.
- llvm::Value* retTypeInfoIndex = builder.CreateCall(ehSelector,
- args.begin(),
- args.end());
-
- // Retrieve exception_class member from thrown exception
- // (_Unwind_Exception instance). This member tells us whether or not
- // the exception is foreign.
- llvm::Value* unwindExceptionClass =
- builder.CreateLoad(
- builder.CreateStructGEP(
- builder.CreatePointerCast(
- unwindException,
- ourUnwindExceptionType->getPointerTo()),
- 0));
-
- // Branch to the externalExceptionBlock if the exception is foreign or
- // to a catch router if not. Either way the finally block will be run.
- builder.CreateCondBr(
- builder.CreateICmpEQ(unwindExceptionClass,
- llvm::ConstantInt::get(builder.getInt64Ty(),
- ourBaseExceptionClass)),
- exceptionRouteBlock,
- externalExceptionBlock);
-
- // External Exception Block
-
- builder.SetInsertPoint(externalExceptionBlock);
-
- generateStringPrint(context,
- module,
- builder,
- "Gen: Foreign exception received.\n",
- USE_GLOBAL_STR_CONSTS);
-
- // Branch to the finally block
- builder.CreateBr(finallyBlock);
-
- // Exception Route Block
-
- builder.SetInsertPoint(exceptionRouteBlock);
-
- // Casts exception pointer (_Unwind_Exception instance) to parent
- // (OurException instance).
- //
- // Note: ourBaseFromUnwindOffset is usually negative
- llvm::Value* typeInfoThrown =
- builder.CreatePointerCast(
- builder.CreateConstGEP1_64(unwindException,
- ourBaseFromUnwindOffset),
- ourExceptionType->getPointerTo());
-
- // Retrieve thrown exception type info type
- //
- // Note: Index is not relative to pointer but instead to structure
- // unlike a true getelementptr (GEP) instruction
- typeInfoThrown = builder.CreateStructGEP(typeInfoThrown, 0);
-
- llvm::Value* typeInfoThrownType =
- builder.CreateStructGEP(typeInfoThrown, 0);
-
- generateIntegerPrint(context,
- module,
- builder,
- *toPrint32Int,
- *(builder.CreateLoad(typeInfoThrownType)),
- "Gen: Exception type <%d> received (stack unwound) "
- " in " +
- ourId +
- ".\n",
- USE_GLOBAL_STR_CONSTS);
-
- // Route to matched type info catch block or run cleanup finally block
- llvm::SwitchInst* switchToCatchBlock =
- builder.CreateSwitch(retTypeInfoIndex,
- finallyBlock,
- numExceptionsToCatch);
-
- unsigned nextTypeToCatch;
-
- for (unsigned i = 1; i <= numExceptionsToCatch; ++i) {
- nextTypeToCatch = i - 1;
- switchToCatchBlock->addCase(llvm::ConstantInt::get(
- llvm::Type::getInt32Ty(context),
- i),
- catchBlocks[nextTypeToCatch]);
- }
-
- llvm::verifyFunction(*ret);
- fpm.run(*ret);
-
- return(ret);
-}
-
-
-/// Generates function which throws either an exception matched to a runtime
-/// determined type info type (argument to generated function), or if this
-/// runtime value matches nativeThrowType, throws a foreign exception by
-/// calling nativeThrowFunct.
-/// @param module code for module instance
-/// @param builder builder instance
-/// @param fpm a function pass manager holding optional IR to IR
-/// transformations
-/// @param ourId id used to printing purposes
-/// @param nativeThrowType a runtime argument of this value results in
-/// nativeThrowFunct being called to generate/throw exception.
-/// @param nativeThrowFunct function which will throw a foreign exception
-/// if the above nativeThrowType matches generated function's arg.
-/// @returns generated function
-static
-llvm::Function* createThrowExceptionFunction(llvm::Module& module,
- llvm::IRBuilder<>& builder,
- llvm::FunctionPassManager& fpm,
- std::string ourId,
- int32_t nativeThrowType,
- llvm::Function& nativeThrowFunct) {
- llvm::LLVMContext& context = module.getContext();
- namedValues.clear();
- ArgTypes unwindArgTypes;
- unwindArgTypes.push_back(builder.getInt32Ty());
- ArgNames unwindArgNames;
- unwindArgNames.push_back("exceptTypeToThrow");
-
- llvm::Function *ret = createFunction(module,
- builder.getVoidTy(),
- unwindArgTypes,
- unwindArgNames,
- ourId,
- llvm::Function::ExternalLinkage,
- false,
- false);
-
- // Throws either one of our exception or a native C++ exception depending
- // on a runtime argument value containing a type info type.
- llvm::BasicBlock *entryBlock = llvm::BasicBlock::Create(context,
- "entry",
- ret);
- // Throws a foreign exception
- llvm::BasicBlock *nativeThrowBlock =
- llvm::BasicBlock::Create(context,
- "nativeThrow",
- ret);
- // Throws one of our Exceptions
- llvm::BasicBlock *generatedThrowBlock =
- llvm::BasicBlock::Create(context,
- "generatedThrow",
- ret);
- // Retrieved runtime type info type to throw
- llvm::Value* exceptionType = namedValues["exceptTypeToThrow"];
-
- // nativeThrowBlock block
-
- builder.SetInsertPoint(nativeThrowBlock);
-
- // Throws foreign exception
- builder.CreateCall(&nativeThrowFunct, exceptionType);
- builder.CreateUnreachable();
-
- // entry block
-
- builder.SetInsertPoint(entryBlock);
-
- llvm::Function *toPrint32Int = module.getFunction("print32Int");
- generateIntegerPrint(context,
- module,
- builder,
- *toPrint32Int,
- *exceptionType,
- "\nGen: About to throw exception type <%d> in " +
- ourId +
- ".\n",
- USE_GLOBAL_STR_CONSTS);
-
- // Switches on runtime type info type value to determine whether or not
- // a foreign exception is thrown. Defaults to throwing one of our
- // generated exceptions.
- llvm::SwitchInst* theSwitch = builder.CreateSwitch(exceptionType,
- generatedThrowBlock,
- 1);
-
- theSwitch->addCase(llvm::ConstantInt::get(llvm::Type::getInt32Ty(context),
- nativeThrowType),
- nativeThrowBlock);
-
- // generatedThrow block
-
- builder.SetInsertPoint(generatedThrowBlock);
-
- llvm::Function *createOurException =
- module.getFunction("createOurException");
- llvm::Function *raiseOurException =
- module.getFunction("_Unwind_RaiseException");
-
- // Creates exception to throw with runtime type info type.
- llvm::Value* exception =
- builder.CreateCall(createOurException,
- namedValues["exceptTypeToThrow"]);
-
- // Throw generated Exception
- builder.CreateCall(raiseOurException, exception);
- builder.CreateUnreachable();
-
- llvm::verifyFunction(*ret);
- fpm.run(*ret);
-
- return(ret);
-}
-
-static void createStandardUtilityFunctions(unsigned numTypeInfos,
- llvm::Module& module,
- llvm::IRBuilder<>& builder);
-
-/// Creates test code by generating and organizing these functions into the
-/// test case. The test case consists of an outer function setup to invoke
-/// an inner function within an environment having multiple catch and single
-/// finally blocks. This inner function is also setup to invoke a throw
-/// function within an evironment similar in nature to the outer function's
-/// catch and finally blocks. Each of these two functions catch mutually
-/// exclusive subsets (even or odd) of the type info types configured
-/// for this this. All generated functions have a runtime argument which
-/// holds a type info type to throw that each function takes and passes it
-/// to the inner one if such a inner function exists. This type info type is
-/// looked at by the generated throw function to see whether or not it should
-/// throw a generated exception with the same type info type, or instead call
-/// a supplied a function which in turn will throw a foreign exception.
-/// @param module code for module instance
-/// @param builder builder instance
-/// @param fpm a function pass manager holding optional IR to IR
-/// transformations
-/// @param nativeThrowFunctName name of external function which will throw
-/// a foreign exception
-/// @returns outermost generated test function.
-llvm::Function* createUnwindExceptionTest(llvm::Module& module,
- llvm::IRBuilder<>& builder,
- llvm::FunctionPassManager& fpm,
- std::string nativeThrowFunctName) {
- // Number of type infos to generate
- unsigned numTypeInfos = 6;
-
- // Initialze intrisics and external functions to use along with exception
- // and type info globals.
- createStandardUtilityFunctions(numTypeInfos,
- module,
- builder);
- llvm::Function *nativeThrowFunct =
- module.getFunction(nativeThrowFunctName);
-
- // Create exception throw function using the value ~0 to cause
- // foreign exceptions to be thrown.
- llvm::Function* throwFunct =
- createThrowExceptionFunction(module,
- builder,
- fpm,
- "throwFunct",
- ~0,
- *nativeThrowFunct);
- // Inner function will catch even type infos
- unsigned innerExceptionTypesToCatch[] = {6, 2, 4};
- size_t numExceptionTypesToCatch = sizeof(innerExceptionTypesToCatch) /
- sizeof(unsigned);
-
- // Generate inner function.
- llvm::Function* innerCatchFunct =
- createCatchWrappedInvokeFunction(module,
- builder,
- fpm,
- *throwFunct,
- "innerCatchFunct",
- numExceptionTypesToCatch,
- innerExceptionTypesToCatch);
-
- // Outer function will catch odd type infos
- unsigned outerExceptionTypesToCatch[] = {3, 1, 5};
- numExceptionTypesToCatch = sizeof(outerExceptionTypesToCatch) /
- sizeof(unsigned);
-
- // Generate outer function
- llvm::Function* outerCatchFunct =
- createCatchWrappedInvokeFunction(module,
- builder,
- fpm,
- *innerCatchFunct,
- "outerCatchFunct",
- numExceptionTypesToCatch,
- outerExceptionTypesToCatch);
-
- // Return outer function to run
- return(outerCatchFunct);
-}
-
-
-/// Represents our foreign exceptions
-class OurCppRunException : public std::runtime_error {
-public:
- OurCppRunException(const std::string reason) :
- std::runtime_error(reason) {}
-
- OurCppRunException (const OurCppRunException& toCopy) :
- std::runtime_error(toCopy) {}
-
- OurCppRunException& operator = (const OurCppRunException& toCopy) {
- return(reinterpret_cast<OurCppRunException&>(
- std::runtime_error::operator = (toCopy)
- ));
- }
-
- ~OurCppRunException (void) throw () {};
-};
-
-
-/// Throws foreign C++ exception.
-/// @param ignoreIt unused parameter that allows function to match implied
-/// generated function contract.
-extern "C"
-void throwCppException (int32_t ignoreIt) {
- throw(OurCppRunException("thrown by throwCppException(...)"));
-}
-
-typedef void (*OurExceptionThrowFunctType) (int32_t typeToThrow);
-
-/// This is a test harness which runs test by executing generated
-/// function with a type info type to throw. Harness wraps the excecution
-/// of generated function in a C++ try catch clause.
-/// @param engine execution engine to use for executing generated function.
-/// This demo program expects this to be a JIT instance for demo
-/// purposes.
-/// @param function generated test function to run
-/// @param typeToThrow type info type of generated exception to throw, or
-/// indicator to cause foreign exception to be thrown.
-static
-void runExceptionThrow(llvm::ExecutionEngine* engine,
- llvm::Function* function,
- int32_t typeToThrow) {
-
- // Find test's function pointer
- OurExceptionThrowFunctType functPtr =
- reinterpret_cast<OurExceptionThrowFunctType>(
- reinterpret_cast<intptr_t>(
- engine->getPointerToFunction(function)
- )
- );
-
- try {
- // Run test
- (*functPtr)(typeToThrow);
- }
- catch (OurCppRunException exc) {
- // Catch foreign C++ exception
- fprintf(stderr,
- "\nrunExceptionThrow(...):In C++ catch OurCppRunException "
- "with reason: %s.\n",
- exc.what());
- }
- catch (...) {
- // Catch all exceptions including our generated ones. I'm not sure
- // why this latter functionality should work, as it seems that
- // our exceptions should be foreign to C++ (the _Unwind_Exception::
- // exception_class should be different from the one used by C++), and
- // therefore C++ should ignore the generated exceptions.
-
- fprintf(stderr,
- "\nrunExceptionThrow(...):In C++ catch all.\n");
- }
-}
-
-//
-// End test functions
-//
-
-/// This initialization routine creates type info globals and
-/// adds external function declarations to module.
-/// @param numTypeInfos number of linear type info associated type info types
-/// to create as GlobalVariable instances, starting with the value 1.
-/// @param module code for module instance
-/// @param builder builder instance
-static void createStandardUtilityFunctions(unsigned numTypeInfos,
- llvm::Module& module,
- llvm::IRBuilder<>& builder) {
-
- llvm::LLVMContext& context = module.getContext();
-
- // Exception initializations
-
- // Setup exception catch state
- ourExceptionNotThrownState =
- llvm::ConstantInt::get(llvm::Type::getInt8Ty(context), 0),
- ourExceptionThrownState =
- llvm::ConstantInt::get(llvm::Type::getInt8Ty(context), 1),
- ourExceptionCaughtState =
- llvm::ConstantInt::get(llvm::Type::getInt8Ty(context), 2),
-
-
- // Create our type info type
- ourTypeInfoType = llvm::StructType::get(context,
- builder.getInt32Ty(),
- NULL);
-
- // Create OurException type
- ourExceptionType = llvm::StructType::get(context,
- ourTypeInfoType,
- NULL);
-
- // Create portion of _Unwind_Exception type
- //
- // Note: Declaring only a portion of the _Unwind_Exception struct.
- // Does this cause problems?
- ourUnwindExceptionType = llvm::StructType::get(context,
- builder.getInt64Ty(),
- NULL);
- struct OurBaseException_t dummyException;
-
- // Calculate offset of OurException::unwindException member.
- ourBaseFromUnwindOffset = ((uintptr_t) &dummyException) -
- ((uintptr_t) &(dummyException.unwindException));
-
-#ifdef DEBUG
- fprintf(stderr,
- "createStandardUtilityFunctions(...):ourBaseFromUnwindOffset "
- "= %lld, sizeof(struct OurBaseException_t) - "
- "sizeof(struct _Unwind_Exception) = %lu.\n",
- ourBaseFromUnwindOffset,
- sizeof(struct OurBaseException_t) -
- sizeof(struct _Unwind_Exception));
-#endif
-
- size_t numChars = sizeof(ourBaseExcpClassChars) / sizeof(char);
-
- // Create our _Unwind_Exception::exception_class value
- ourBaseExceptionClass = genClass(ourBaseExcpClassChars, numChars);
-
- // Type infos
-
- std::string baseStr = "typeInfo", typeInfoName;
- std::ostringstream typeInfoNameBuilder;
- std::vector<llvm::Constant*> structVals;
-
- llvm::Constant *nextStruct;
- llvm::GlobalVariable* nextGlobal = NULL;
-
- // Generate each type info
- //
- // Note: First type info is not used.
- for (unsigned i = 0; i <= numTypeInfos; ++i) {
- structVals.clear();
- structVals.push_back(llvm::ConstantInt::get(builder.getInt32Ty(), i));
- nextStruct = llvm::ConstantStruct::get(ourTypeInfoType, structVals);
-
- typeInfoNameBuilder.str("");
- typeInfoNameBuilder << baseStr << i;
- typeInfoName = typeInfoNameBuilder.str();
-
- // Note: Does not seem to work without allocation
- nextGlobal =
- new llvm::GlobalVariable(module,
- ourTypeInfoType,
- true,
- llvm::GlobalValue::ExternalLinkage,
- nextStruct,
- typeInfoName);
-
- ourTypeInfoNames.push_back(typeInfoName);
- ourTypeInfoNamesIndex[i] = typeInfoName;
- }
-
- ArgNames argNames;
- ArgTypes argTypes;
- llvm::Function* funct = NULL;
-
- // print32Int
-
- const llvm::Type* retType = builder.getVoidTy();
-
- argTypes.clear();
- argTypes.push_back(builder.getInt32Ty());
- argTypes.push_back(builder.getInt8Ty()->getPointerTo());
-
- argNames.clear();
-
- createFunction(module,
- retType,
- argTypes,
- argNames,
- "print32Int",
- llvm::Function::ExternalLinkage,
- true,
- false);
-
- // print64Int
-
- retType = builder.getVoidTy();
-
- argTypes.clear();
- argTypes.push_back(builder.getInt64Ty());
- argTypes.push_back(builder.getInt8Ty()->getPointerTo());
-
- argNames.clear();
-
- createFunction(module,
- retType,
- argTypes,
- argNames,
- "print64Int",
- llvm::Function::ExternalLinkage,
- true,
- false);
-
- // printStr
-
- retType = builder.getVoidTy();
-
- argTypes.clear();
- argTypes.push_back(builder.getInt8Ty()->getPointerTo());
-
- argNames.clear();
-
- createFunction(module,
- retType,
- argTypes,
- argNames,
- "printStr",
- llvm::Function::ExternalLinkage,
- true,
- false);
-
- // throwCppException
-
- retType = builder.getVoidTy();
-
- argTypes.clear();
- argTypes.push_back(builder.getInt32Ty());
-
- argNames.clear();
-
- createFunction(module,
- retType,
- argTypes,
- argNames,
- "throwCppException",
- llvm::Function::ExternalLinkage,
- true,
- false);
-
- // deleteOurException
-
- retType = builder.getVoidTy();
-
- argTypes.clear();
- argTypes.push_back(builder.getInt8Ty()->getPointerTo());
-
- argNames.clear();
-
- createFunction(module,
- retType,
- argTypes,
- argNames,
- "deleteOurException",
- llvm::Function::ExternalLinkage,
- true,
- false);
-
- // createOurException
-
- retType = builder.getInt8Ty()->getPointerTo();
-
- argTypes.clear();
- argTypes.push_back(builder.getInt32Ty());
-
- argNames.clear();
-
- createFunction(module,
- retType,
- argTypes,
- argNames,
- "createOurException",
- llvm::Function::ExternalLinkage,
- true,
- false);
-
- // _Unwind_RaiseException
-
- retType = builder.getInt32Ty();
-
- argTypes.clear();
- argTypes.push_back(builder.getInt8Ty()->getPointerTo());
-
- argNames.clear();
-
- funct = createFunction(module,
- retType,
- argTypes,
- argNames,
- "_Unwind_RaiseException",
- llvm::Function::ExternalLinkage,
- true,
- false);
-
- funct->addFnAttr(llvm::Attribute::NoReturn);
-
- // _Unwind_Resume
-
- retType = builder.getInt32Ty();
-
- argTypes.clear();
- argTypes.push_back(builder.getInt8Ty()->getPointerTo());
-
- argNames.clear();
-
- funct = createFunction(module,
- retType,
- argTypes,
- argNames,
- "_Unwind_Resume",
- llvm::Function::ExternalLinkage,
- true,
- false);
-
- funct->addFnAttr(llvm::Attribute::NoReturn);
-
- // ourPersonality
-
- retType = builder.getInt32Ty();
-
- argTypes.clear();
- argTypes.push_back(builder.getInt32Ty());
- argTypes.push_back(builder.getInt32Ty());
- argTypes.push_back(builder.getInt64Ty());
- argTypes.push_back(builder.getInt8Ty()->getPointerTo());
- argTypes.push_back(builder.getInt8Ty()->getPointerTo());
-
- argNames.clear();
-
- createFunction(module,
- retType,
- argTypes,
- argNames,
- "ourPersonality",
- llvm::Function::ExternalLinkage,
- true,
- false);
-
- // llvm.eh.selector intrinsic
-
- getDeclaration(&module, llvm::Intrinsic::eh_selector);
-
- // llvm.eh.exception intrinsic
-
- getDeclaration(&module, llvm::Intrinsic::eh_exception);
-
- // llvm.eh.typeid.for intrinsic
-
- getDeclaration(&module, llvm::Intrinsic::eh_typeid_for);
-}
-
-
-//===---------------------------------------------------------------------===//
-// Main test driver code.
-//===---------------------------------------------------------------------===//
-
-/// Demo main routine which takes the type info types to throw. A test will
-/// be run for each given type info type. While type info types with the value
-/// of -1 will trigger a foreign C++ exception to be thrown; type info types
-/// <= 6 and >= 1 will be caught by test functions; and type info types > 6
-/// will result in exceptions which pass through to the test harness. All other
-/// type info types are not supported and could cause a crash.
-int main(int argc, char* argv[]) {
- if (argc == 1) {
- fprintf(stderr,
- "\nUsage: ExceptionDemo <exception type to throw> "
- "[<type 2>...<type n>].\n"
- " Each type must have the value of 1 - 6 for "
- "generated exceptions to be caught;\n"
- " the value -1 for foreign C++ exceptions to be "
- "generated and thrown;\n"
- " or the values > 6 for exceptions to be ignored.\n"
- "\nTry: ExceptionDemo 2 3 7 -1\n"
- " for a full test.\n\n");
- return(0);
- }
-
- // If not set, exception handling will not be turned on
- llvm::JITExceptionHandling = true;
-
- llvm::InitializeNativeTarget();
- llvm::LLVMContext& context = llvm::getGlobalContext();
- llvm::IRBuilder<> theBuilder(context);
-
- // Make the module, which holds all the code.
- llvm::Module* module = new llvm::Module("my cool jit", context);
-
- // Build engine with JIT
- llvm::EngineBuilder factory(module);
- factory.setEngineKind(llvm::EngineKind::JIT);
- factory.setAllocateGVsWithCode(false);
- llvm::ExecutionEngine* executionEngine = factory.create();
-
- {
- llvm::FunctionPassManager fpm(module);
-
- // Set up the optimizer pipeline.
- // Start with registering info about how the
- // target lays out data structures.
- fpm.add(new llvm::TargetData(*executionEngine->getTargetData()));
-
- // Optimizations turned on
-#ifdef ADD_OPT_PASSES
-
- // Promote allocas to registers.
- fpm.add(llvm::createPromoteMemoryToRegisterPass());
-
- // Do simple "peephole" optimizations and bit-twiddling optzns.
- fpm.add(llvm::createInstructionCombiningPass());
-
- // Reassociate expressions.
- fpm.add(llvm::createReassociatePass());
-
- // Eliminate Common SubExpressions.
- fpm.add(llvm::createGVNPass());
-
- // Simplify the control flow graph (deleting unreachable
- // blocks, etc).
- fpm.add(llvm::createCFGSimplificationPass());
-#endif // ADD_OPT_PASSES
-
- fpm.doInitialization();
-
- // Generate test code using function throwCppException(...) as
- // the function which throws foreign exceptions.
- llvm::Function* toRun =
- createUnwindExceptionTest(*module,
- theBuilder,
- fpm,
- "throwCppException");
-
- fprintf(stderr, "\nBegin module dump:\n\n");
-
- module->dump();
-
- fprintf(stderr, "\nEnd module dump:\n");
-
- fprintf(stderr, "\n\nBegin Test:\n");
-
- for (int i = 1; i < argc; ++i) {
- // Run test for each argument whose value is the exception
- // type to throw.
- runExceptionThrow(executionEngine,
- toRun,
- (unsigned) strtoul(argv[i], NULL, 10));
- }
-
- fprintf(stderr, "\nEnd Test:\n\n");
- }
-
- delete executionEngine;
-
- return 0;
-}
-
diff --git a/contrib/llvm/examples/ExceptionDemo/Makefile b/contrib/llvm/examples/ExceptionDemo/Makefile
deleted file mode 100644
index 4807447..0000000
--- a/contrib/llvm/examples/ExceptionDemo/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-##===- examples/ExceptionDemo/Makefile --------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===---------------------------------------------------------------------===##
-LEVEL = ../..
-TOOLNAME = ExceptionDemo
-EXAMPLE_TOOL = 1
-REQUIRES_EH = 1
-
-LINK_COMPONENTS := jit interpreter nativecodegen
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Fibonacci/CMakeLists.txt b/contrib/llvm/examples/Fibonacci/CMakeLists.txt
deleted file mode 100644
index 6937612..0000000
--- a/contrib/llvm/examples/Fibonacci/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-set(LLVM_LINK_COMPONENTS jit interpreter nativecodegen)
-
-add_llvm_example(Fibonacci
- fibonacci.cpp
- )
diff --git a/contrib/llvm/examples/Fibonacci/Makefile b/contrib/llvm/examples/Fibonacci/Makefile
deleted file mode 100644
index 71f6ba0..0000000
--- a/contrib/llvm/examples/Fibonacci/Makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-##===- examples/Fibonacci/Makefile -------------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL = ../..
-TOOLNAME = Fibonacci
-EXAMPLE_TOOL = 1
-
-# Link in JIT support
-LINK_COMPONENTS := jit interpreter nativecodegen
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Fibonacci/fibonacci.cpp b/contrib/llvm/examples/Fibonacci/fibonacci.cpp
deleted file mode 100644
index 353e173..0000000
--- a/contrib/llvm/examples/Fibonacci/fibonacci.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-//===--- examples/Fibonacci/fibonacci.cpp - An example use of the JIT -----===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This small program provides an example of how to build quickly a small module
-// with function Fibonacci and execute it with the JIT.
-//
-// The goal of this snippet is to create in the memory the LLVM module
-// consisting of one function as follow:
-//
-// int fib(int x) {
-// if(x<=2) return 1;
-// return fib(x-1)+fib(x-2);
-// }
-//
-// Once we have this, we compile the module via JIT, then execute the `fib'
-// function and return result to a driver, i.e. to a "host program".
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/Constants.h"
-#include "llvm/Instructions.h"
-#include "llvm/Analysis/Verifier.h"
-#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/ExecutionEngine/Interpreter.h"
-#include "llvm/ExecutionEngine/GenericValue.h"
-#include "llvm/Support/raw_ostream.h"
-#include "llvm/Target/TargetSelect.h"
-using namespace llvm;
-
-static Function *CreateFibFunction(Module *M, LLVMContext &Context) {
- // Create the fib function and insert it into module M. This function is said
- // to return an int and take an int parameter.
- Function *FibF =
- cast<Function>(M->getOrInsertFunction("fib", Type::getInt32Ty(Context),
- Type::getInt32Ty(Context),
- (Type *)0));
-
- // Add a basic block to the function.
- BasicBlock *BB = BasicBlock::Create(Context, "EntryBlock", FibF);
-
- // Get pointers to the constants.
- Value *One = ConstantInt::get(Type::getInt32Ty(Context), 1);
- Value *Two = ConstantInt::get(Type::getInt32Ty(Context), 2);
-
- // Get pointer to the integer argument of the add1 function...
- Argument *ArgX = FibF->arg_begin(); // Get the arg.
- ArgX->setName("AnArg"); // Give it a nice symbolic name for fun.
-
- // Create the true_block.
- BasicBlock *RetBB = BasicBlock::Create(Context, "return", FibF);
- // Create an exit block.
- BasicBlock* RecurseBB = BasicBlock::Create(Context, "recurse", FibF);
-
- // Create the "if (arg <= 2) goto exitbb"
- Value *CondInst = new ICmpInst(*BB, ICmpInst::ICMP_SLE, ArgX, Two, "cond");
- BranchInst::Create(RetBB, RecurseBB, CondInst, BB);
-
- // Create: ret int 1
- ReturnInst::Create(Context, One, RetBB);
-
- // create fib(x-1)
- Value *Sub = BinaryOperator::CreateSub(ArgX, One, "arg", RecurseBB);
- CallInst *CallFibX1 = CallInst::Create(FibF, Sub, "fibx1", RecurseBB);
- CallFibX1->setTailCall();
-
- // create fib(x-2)
- Sub = BinaryOperator::CreateSub(ArgX, Two, "arg", RecurseBB);
- CallInst *CallFibX2 = CallInst::Create(FibF, Sub, "fibx2", RecurseBB);
- CallFibX2->setTailCall();
-
-
- // fib(x-1)+fib(x-2)
- Value *Sum = BinaryOperator::CreateAdd(CallFibX1, CallFibX2,
- "addresult", RecurseBB);
-
- // Create the return instruction and add it to the basic block
- ReturnInst::Create(Context, Sum, RecurseBB);
-
- return FibF;
-}
-
-
-int main(int argc, char **argv) {
- int n = argc > 1 ? atol(argv[1]) : 24;
-
- InitializeNativeTarget();
- LLVMContext Context;
-
- // Create some module to put our function into it.
- Module *M = new Module("test", Context);
-
- // We are about to create the "fib" function:
- Function *FibF = CreateFibFunction(M, Context);
-
- // Now we going to create JIT
- std::string errStr;
- ExecutionEngine *EE = EngineBuilder(M).setErrorStr(&errStr).setEngineKind(EngineKind::JIT).create();
-
- if (!EE) {
- errs() << argv[0] << ": Failed to construct ExecutionEngine: " << errStr << "\n";
- return 1;
- }
-
- errs() << "verifying... ";
- if (verifyModule(*M)) {
- errs() << argv[0] << ": Error constructing function!\n";
- return 1;
- }
-
- errs() << "OK\n";
- errs() << "We just constructed this LLVM module:\n\n---------\n" << *M;
- errs() << "---------\nstarting fibonacci(" << n << ") with JIT...\n";
-
- // Call the Fibonacci function with argument n:
- std::vector<GenericValue> Args(1);
- Args[0].IntVal = APInt(32, n);
- GenericValue GV = EE->runFunction(FibF, Args);
-
- // import result of execution
- outs() << "Result: " << GV.IntVal << "\n";
- return 0;
-}
diff --git a/contrib/llvm/examples/HowToUseJIT/CMakeLists.txt b/contrib/llvm/examples/HowToUseJIT/CMakeLists.txt
deleted file mode 100644
index 428b53f..0000000
--- a/contrib/llvm/examples/HowToUseJIT/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-set(LLVM_LINK_COMPONENTS jit interpreter nativecodegen)
-
-add_llvm_example(HowToUseJIT
- HowToUseJIT.cpp
- )
diff --git a/contrib/llvm/examples/HowToUseJIT/HowToUseJIT.cpp b/contrib/llvm/examples/HowToUseJIT/HowToUseJIT.cpp
deleted file mode 100644
index 8e3b6dc..0000000
--- a/contrib/llvm/examples/HowToUseJIT/HowToUseJIT.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-//===-- examples/HowToUseJIT/HowToUseJIT.cpp - An example use of the JIT --===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This small program provides an example of how to quickly build a small
-// module with two functions and execute it with the JIT.
-//
-// Goal:
-// The goal of this snippet is to create in the memory
-// the LLVM module consisting of two functions as follow:
-//
-// int add1(int x) {
-// return x+1;
-// }
-//
-// int foo() {
-// return add1(10);
-// }
-//
-// then compile the module via JIT, then execute the `foo'
-// function and return result to a driver, i.e. to a "host program".
-//
-// Some remarks and questions:
-//
-// - could we invoke some code using noname functions too?
-// e.g. evaluate "foo()+foo()" without fears to introduce
-// conflict of temporary function name with some real
-// existing function name?
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/Constants.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/Instructions.h"
-#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/ExecutionEngine/Interpreter.h"
-#include "llvm/ExecutionEngine/GenericValue.h"
-#include "llvm/Target/TargetSelect.h"
-#include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/raw_ostream.h"
-using namespace llvm;
-
-int main() {
-
- InitializeNativeTarget();
-
- LLVMContext Context;
-
- // Create some module to put our function into it.
- Module *M = new Module("test", Context);
-
- // Create the add1 function entry and insert this entry into module M. The
- // function will have a return type of "int" and take an argument of "int".
- // The '0' terminates the list of argument types.
- Function *Add1F =
- cast<Function>(M->getOrInsertFunction("add1", Type::getInt32Ty(Context),
- Type::getInt32Ty(Context),
- (Type *)0));
-
- // Add a basic block to the function. As before, it automatically inserts
- // because of the last argument.
- BasicBlock *BB = BasicBlock::Create(Context, "EntryBlock", Add1F);
-
- // Get pointers to the constant `1'.
- Value *One = ConstantInt::get(Type::getInt32Ty(Context), 1);
-
- // Get pointers to the integer argument of the add1 function...
- assert(Add1F->arg_begin() != Add1F->arg_end()); // Make sure there's an arg
- Argument *ArgX = Add1F->arg_begin(); // Get the arg
- ArgX->setName("AnArg"); // Give it a nice symbolic name for fun.
-
- // Create the add instruction, inserting it into the end of BB.
- Instruction *Add = BinaryOperator::CreateAdd(One, ArgX, "addresult", BB);
-
- // Create the return instruction and add it to the basic block
- ReturnInst::Create(Context, Add, BB);
-
- // Now, function add1 is ready.
-
-
- // Now we going to create function `foo', which returns an int and takes no
- // arguments.
- Function *FooF =
- cast<Function>(M->getOrInsertFunction("foo", Type::getInt32Ty(Context),
- (Type *)0));
-
- // Add a basic block to the FooF function.
- BB = BasicBlock::Create(Context, "EntryBlock", FooF);
-
- // Get pointers to the constant `10'.
- Value *Ten = ConstantInt::get(Type::getInt32Ty(Context), 10);
-
- // Pass Ten to the call call:
- CallInst *Add1CallRes = CallInst::Create(Add1F, Ten, "add1", BB);
- Add1CallRes->setTailCall(true);
-
- // Create the return instruction and add it to the basic block.
- ReturnInst::Create(Context, Add1CallRes, BB);
-
- // Now we create the JIT.
- ExecutionEngine* EE = EngineBuilder(M).create();
-
- outs() << "We just constructed this LLVM module:\n\n" << *M;
- outs() << "\n\nRunning foo: ";
- outs().flush();
-
- // Call the `foo' function with no arguments:
- std::vector<GenericValue> noargs;
- GenericValue gv = EE->runFunction(FooF, noargs);
-
- // Import result of execution:
- outs() << "Result: " << gv.IntVal << "\n";
- EE->freeMachineCodeForFunction(FooF);
- delete EE;
- llvm_shutdown();
- return 0;
-}
diff --git a/contrib/llvm/examples/HowToUseJIT/Makefile b/contrib/llvm/examples/HowToUseJIT/Makefile
deleted file mode 100644
index c8919db..0000000
--- a/contrib/llvm/examples/HowToUseJIT/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-##===- examples/HowToUseJIT/Makefile -----------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL = ../..
-TOOLNAME = HowToUseJIT
-EXAMPLE_TOOL = 1
-
-LINK_COMPONENTS := jit interpreter nativecodegen
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Kaleidoscope/CMakeLists.txt b/contrib/llvm/examples/Kaleidoscope/CMakeLists.txt
deleted file mode 100644
index 8c87ac5..0000000
--- a/contrib/llvm/examples/Kaleidoscope/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-add_subdirectory(Chapter2)
-add_subdirectory(Chapter3)
-add_subdirectory(Chapter4)
-add_subdirectory(Chapter5)
-add_subdirectory(Chapter6)
-add_subdirectory(Chapter7)
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter2/CMakeLists.txt b/contrib/llvm/examples/Kaleidoscope/Chapter2/CMakeLists.txt
deleted file mode 100644
index 79f2b17..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter2/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-add_llvm_example(Kaleidoscope-Ch2
- toy.cpp
- )
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter2/Makefile b/contrib/llvm/examples/Kaleidoscope/Chapter2/Makefile
deleted file mode 100644
index 1a9b94c..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter2/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-##===- examples/Kaleidoscope/Chapter2/Makefile -------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL = ../../..
-TOOLNAME = Kaleidoscope-Ch2
-EXAMPLE_TOOL = 1
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter2/toy.cpp b/contrib/llvm/examples/Kaleidoscope/Chapter2/toy.cpp
deleted file mode 100644
index f4f09d0..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter2/toy.cpp
+++ /dev/null
@@ -1,398 +0,0 @@
-#include <cstdio>
-#include <cstdlib>
-#include <string>
-#include <map>
-#include <vector>
-
-//===----------------------------------------------------------------------===//
-// Lexer
-//===----------------------------------------------------------------------===//
-
-// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
-// of these for known things.
-enum Token {
- tok_eof = -1,
-
- // commands
- tok_def = -2, tok_extern = -3,
-
- // primary
- tok_identifier = -4, tok_number = -5
-};
-
-static std::string IdentifierStr; // Filled in if tok_identifier
-static double NumVal; // Filled in if tok_number
-
-/// gettok - Return the next token from standard input.
-static int gettok() {
- static int LastChar = ' ';
-
- // Skip any whitespace.
- while (isspace(LastChar))
- LastChar = getchar();
-
- if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
- IdentifierStr = LastChar;
- while (isalnum((LastChar = getchar())))
- IdentifierStr += LastChar;
-
- if (IdentifierStr == "def") return tok_def;
- if (IdentifierStr == "extern") return tok_extern;
- return tok_identifier;
- }
-
- if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
- std::string NumStr;
- do {
- NumStr += LastChar;
- LastChar = getchar();
- } while (isdigit(LastChar) || LastChar == '.');
-
- NumVal = strtod(NumStr.c_str(), 0);
- return tok_number;
- }
-
- if (LastChar == '#') {
- // Comment until end of line.
- do LastChar = getchar();
- while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
-
- if (LastChar != EOF)
- return gettok();
- }
-
- // Check for end of file. Don't eat the EOF.
- if (LastChar == EOF)
- return tok_eof;
-
- // Otherwise, just return the character as its ascii value.
- int ThisChar = LastChar;
- LastChar = getchar();
- return ThisChar;
-}
-
-//===----------------------------------------------------------------------===//
-// Abstract Syntax Tree (aka Parse Tree)
-//===----------------------------------------------------------------------===//
-
-/// ExprAST - Base class for all expression nodes.
-class ExprAST {
-public:
- virtual ~ExprAST() {}
-};
-
-/// NumberExprAST - Expression class for numeric literals like "1.0".
-class NumberExprAST : public ExprAST {
- double Val;
-public:
- NumberExprAST(double val) : Val(val) {}
-};
-
-/// VariableExprAST - Expression class for referencing a variable, like "a".
-class VariableExprAST : public ExprAST {
- std::string Name;
-public:
- VariableExprAST(const std::string &name) : Name(name) {}
-};
-
-/// BinaryExprAST - Expression class for a binary operator.
-class BinaryExprAST : public ExprAST {
- char Op;
- ExprAST *LHS, *RHS;
-public:
- BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
- : Op(op), LHS(lhs), RHS(rhs) {}
-};
-
-/// CallExprAST - Expression class for function calls.
-class CallExprAST : public ExprAST {
- std::string Callee;
- std::vector<ExprAST*> Args;
-public:
- CallExprAST(const std::string &callee, std::vector<ExprAST*> &args)
- : Callee(callee), Args(args) {}
-};
-
-/// PrototypeAST - This class represents the "prototype" for a function,
-/// which captures its name, and its argument names (thus implicitly the number
-/// of arguments the function takes).
-class PrototypeAST {
- std::string Name;
- std::vector<std::string> Args;
-public:
- PrototypeAST(const std::string &name, const std::vector<std::string> &args)
- : Name(name), Args(args) {}
-
-};
-
-/// FunctionAST - This class represents a function definition itself.
-class FunctionAST {
- PrototypeAST *Proto;
- ExprAST *Body;
-public:
- FunctionAST(PrototypeAST *proto, ExprAST *body)
- : Proto(proto), Body(body) {}
-
-};
-
-//===----------------------------------------------------------------------===//
-// Parser
-//===----------------------------------------------------------------------===//
-
-/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
-/// token the parser is looking at. getNextToken reads another token from the
-/// lexer and updates CurTok with its results.
-static int CurTok;
-static int getNextToken() {
- return CurTok = gettok();
-}
-
-/// BinopPrecedence - This holds the precedence for each binary operator that is
-/// defined.
-static std::map<char, int> BinopPrecedence;
-
-/// GetTokPrecedence - Get the precedence of the pending binary operator token.
-static int GetTokPrecedence() {
- if (!isascii(CurTok))
- return -1;
-
- // Make sure it's a declared binop.
- int TokPrec = BinopPrecedence[CurTok];
- if (TokPrec <= 0) return -1;
- return TokPrec;
-}
-
-/// Error* - These are little helper functions for error handling.
-ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
-PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
-FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
-
-static ExprAST *ParseExpression();
-
-/// identifierexpr
-/// ::= identifier
-/// ::= identifier '(' expression* ')'
-static ExprAST *ParseIdentifierExpr() {
- std::string IdName = IdentifierStr;
-
- getNextToken(); // eat identifier.
-
- if (CurTok != '(') // Simple variable ref.
- return new VariableExprAST(IdName);
-
- // Call.
- getNextToken(); // eat (
- std::vector<ExprAST*> Args;
- if (CurTok != ')') {
- while (1) {
- ExprAST *Arg = ParseExpression();
- if (!Arg) return 0;
- Args.push_back(Arg);
-
- if (CurTok == ')') break;
-
- if (CurTok != ',')
- return Error("Expected ')' or ',' in argument list");
- getNextToken();
- }
- }
-
- // Eat the ')'.
- getNextToken();
-
- return new CallExprAST(IdName, Args);
-}
-
-/// numberexpr ::= number
-static ExprAST *ParseNumberExpr() {
- ExprAST *Result = new NumberExprAST(NumVal);
- getNextToken(); // consume the number
- return Result;
-}
-
-/// parenexpr ::= '(' expression ')'
-static ExprAST *ParseParenExpr() {
- getNextToken(); // eat (.
- ExprAST *V = ParseExpression();
- if (!V) return 0;
-
- if (CurTok != ')')
- return Error("expected ')'");
- getNextToken(); // eat ).
- return V;
-}
-
-/// primary
-/// ::= identifierexpr
-/// ::= numberexpr
-/// ::= parenexpr
-static ExprAST *ParsePrimary() {
- switch (CurTok) {
- default: return Error("unknown token when expecting an expression");
- case tok_identifier: return ParseIdentifierExpr();
- case tok_number: return ParseNumberExpr();
- case '(': return ParseParenExpr();
- }
-}
-
-/// binoprhs
-/// ::= ('+' primary)*
-static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
- // If this is a binop, find its precedence.
- while (1) {
- int TokPrec = GetTokPrecedence();
-
- // If this is a binop that binds at least as tightly as the current binop,
- // consume it, otherwise we are done.
- if (TokPrec < ExprPrec)
- return LHS;
-
- // Okay, we know this is a binop.
- int BinOp = CurTok;
- getNextToken(); // eat binop
-
- // Parse the primary expression after the binary operator.
- ExprAST *RHS = ParsePrimary();
- if (!RHS) return 0;
-
- // If BinOp binds less tightly with RHS than the operator after RHS, let
- // the pending operator take RHS as its LHS.
- int NextPrec = GetTokPrecedence();
- if (TokPrec < NextPrec) {
- RHS = ParseBinOpRHS(TokPrec+1, RHS);
- if (RHS == 0) return 0;
- }
-
- // Merge LHS/RHS.
- LHS = new BinaryExprAST(BinOp, LHS, RHS);
- }
-}
-
-/// expression
-/// ::= primary binoprhs
-///
-static ExprAST *ParseExpression() {
- ExprAST *LHS = ParsePrimary();
- if (!LHS) return 0;
-
- return ParseBinOpRHS(0, LHS);
-}
-
-/// prototype
-/// ::= id '(' id* ')'
-static PrototypeAST *ParsePrototype() {
- if (CurTok != tok_identifier)
- return ErrorP("Expected function name in prototype");
-
- std::string FnName = IdentifierStr;
- getNextToken();
-
- if (CurTok != '(')
- return ErrorP("Expected '(' in prototype");
-
- std::vector<std::string> ArgNames;
- while (getNextToken() == tok_identifier)
- ArgNames.push_back(IdentifierStr);
- if (CurTok != ')')
- return ErrorP("Expected ')' in prototype");
-
- // success.
- getNextToken(); // eat ')'.
-
- return new PrototypeAST(FnName, ArgNames);
-}
-
-/// definition ::= 'def' prototype expression
-static FunctionAST *ParseDefinition() {
- getNextToken(); // eat def.
- PrototypeAST *Proto = ParsePrototype();
- if (Proto == 0) return 0;
-
- if (ExprAST *E = ParseExpression())
- return new FunctionAST(Proto, E);
- return 0;
-}
-
-/// toplevelexpr ::= expression
-static FunctionAST *ParseTopLevelExpr() {
- if (ExprAST *E = ParseExpression()) {
- // Make an anonymous proto.
- PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>());
- return new FunctionAST(Proto, E);
- }
- return 0;
-}
-
-/// external ::= 'extern' prototype
-static PrototypeAST *ParseExtern() {
- getNextToken(); // eat extern.
- return ParsePrototype();
-}
-
-//===----------------------------------------------------------------------===//
-// Top-Level parsing
-//===----------------------------------------------------------------------===//
-
-static void HandleDefinition() {
- if (ParseDefinition()) {
- fprintf(stderr, "Parsed a function definition.\n");
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleExtern() {
- if (ParseExtern()) {
- fprintf(stderr, "Parsed an extern\n");
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleTopLevelExpression() {
- // Evaluate a top-level expression into an anonymous function.
- if (ParseTopLevelExpr()) {
- fprintf(stderr, "Parsed a top-level expr\n");
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-/// top ::= definition | external | expression | ';'
-static void MainLoop() {
- while (1) {
- fprintf(stderr, "ready> ");
- switch (CurTok) {
- case tok_eof: return;
- case ';': getNextToken(); break; // ignore top-level semicolons.
- case tok_def: HandleDefinition(); break;
- case tok_extern: HandleExtern(); break;
- default: HandleTopLevelExpression(); break;
- }
- }
-}
-
-//===----------------------------------------------------------------------===//
-// Main driver code.
-//===----------------------------------------------------------------------===//
-
-int main() {
- // Install standard binary operators.
- // 1 is lowest precedence.
- BinopPrecedence['<'] = 10;
- BinopPrecedence['+'] = 20;
- BinopPrecedence['-'] = 20;
- BinopPrecedence['*'] = 40; // highest.
-
- // Prime the first token.
- fprintf(stderr, "ready> ");
- getNextToken();
-
- // Run the main "interpreter loop" now.
- MainLoop();
-
- return 0;
-}
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter3/CMakeLists.txt b/contrib/llvm/examples/Kaleidoscope/Chapter3/CMakeLists.txt
deleted file mode 100644
index 1af8db0..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter3/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-set(LLVM_LINK_COMPONENTS core)
-
-add_llvm_example(Kaleidoscope-Ch3
- toy.cpp
- )
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter3/Makefile b/contrib/llvm/examples/Kaleidoscope/Chapter3/Makefile
deleted file mode 100644
index 4cc6948..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter3/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-##===- examples/Kaleidoscope/Chapter3/Makefile -------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL = ../../..
-TOOLNAME = Kaleidoscope-Ch3
-EXAMPLE_TOOL = 1
-
-LINK_COMPONENTS := core
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter3/toy.cpp b/contrib/llvm/examples/Kaleidoscope/Chapter3/toy.cpp
deleted file mode 100644
index 73520d8..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter3/toy.cpp
+++ /dev/null
@@ -1,563 +0,0 @@
-#include "llvm/DerivedTypes.h"
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/Analysis/Verifier.h"
-#include "llvm/Support/IRBuilder.h"
-#include <cstdio>
-#include <string>
-#include <map>
-#include <vector>
-using namespace llvm;
-
-//===----------------------------------------------------------------------===//
-// Lexer
-//===----------------------------------------------------------------------===//
-
-// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
-// of these for known things.
-enum Token {
- tok_eof = -1,
-
- // commands
- tok_def = -2, tok_extern = -3,
-
- // primary
- tok_identifier = -4, tok_number = -5
-};
-
-static std::string IdentifierStr; // Filled in if tok_identifier
-static double NumVal; // Filled in if tok_number
-
-/// gettok - Return the next token from standard input.
-static int gettok() {
- static int LastChar = ' ';
-
- // Skip any whitespace.
- while (isspace(LastChar))
- LastChar = getchar();
-
- if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
- IdentifierStr = LastChar;
- while (isalnum((LastChar = getchar())))
- IdentifierStr += LastChar;
-
- if (IdentifierStr == "def") return tok_def;
- if (IdentifierStr == "extern") return tok_extern;
- return tok_identifier;
- }
-
- if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
- std::string NumStr;
- do {
- NumStr += LastChar;
- LastChar = getchar();
- } while (isdigit(LastChar) || LastChar == '.');
-
- NumVal = strtod(NumStr.c_str(), 0);
- return tok_number;
- }
-
- if (LastChar == '#') {
- // Comment until end of line.
- do LastChar = getchar();
- while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
-
- if (LastChar != EOF)
- return gettok();
- }
-
- // Check for end of file. Don't eat the EOF.
- if (LastChar == EOF)
- return tok_eof;
-
- // Otherwise, just return the character as its ascii value.
- int ThisChar = LastChar;
- LastChar = getchar();
- return ThisChar;
-}
-
-//===----------------------------------------------------------------------===//
-// Abstract Syntax Tree (aka Parse Tree)
-//===----------------------------------------------------------------------===//
-
-/// ExprAST - Base class for all expression nodes.
-class ExprAST {
-public:
- virtual ~ExprAST() {}
- virtual Value *Codegen() = 0;
-};
-
-/// NumberExprAST - Expression class for numeric literals like "1.0".
-class NumberExprAST : public ExprAST {
- double Val;
-public:
- NumberExprAST(double val) : Val(val) {}
- virtual Value *Codegen();
-};
-
-/// VariableExprAST - Expression class for referencing a variable, like "a".
-class VariableExprAST : public ExprAST {
- std::string Name;
-public:
- VariableExprAST(const std::string &name) : Name(name) {}
- virtual Value *Codegen();
-};
-
-/// BinaryExprAST - Expression class for a binary operator.
-class BinaryExprAST : public ExprAST {
- char Op;
- ExprAST *LHS, *RHS;
-public:
- BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
- : Op(op), LHS(lhs), RHS(rhs) {}
- virtual Value *Codegen();
-};
-
-/// CallExprAST - Expression class for function calls.
-class CallExprAST : public ExprAST {
- std::string Callee;
- std::vector<ExprAST*> Args;
-public:
- CallExprAST(const std::string &callee, std::vector<ExprAST*> &args)
- : Callee(callee), Args(args) {}
- virtual Value *Codegen();
-};
-
-/// PrototypeAST - This class represents the "prototype" for a function,
-/// which captures its name, and its argument names (thus implicitly the number
-/// of arguments the function takes).
-class PrototypeAST {
- std::string Name;
- std::vector<std::string> Args;
-public:
- PrototypeAST(const std::string &name, const std::vector<std::string> &args)
- : Name(name), Args(args) {}
-
- Function *Codegen();
-};
-
-/// FunctionAST - This class represents a function definition itself.
-class FunctionAST {
- PrototypeAST *Proto;
- ExprAST *Body;
-public:
- FunctionAST(PrototypeAST *proto, ExprAST *body)
- : Proto(proto), Body(body) {}
-
- Function *Codegen();
-};
-
-//===----------------------------------------------------------------------===//
-// Parser
-//===----------------------------------------------------------------------===//
-
-/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
-/// token the parser is looking at. getNextToken reads another token from the
-/// lexer and updates CurTok with its results.
-static int CurTok;
-static int getNextToken() {
- return CurTok = gettok();
-}
-
-/// BinopPrecedence - This holds the precedence for each binary operator that is
-/// defined.
-static std::map<char, int> BinopPrecedence;
-
-/// GetTokPrecedence - Get the precedence of the pending binary operator token.
-static int GetTokPrecedence() {
- if (!isascii(CurTok))
- return -1;
-
- // Make sure it's a declared binop.
- int TokPrec = BinopPrecedence[CurTok];
- if (TokPrec <= 0) return -1;
- return TokPrec;
-}
-
-/// Error* - These are little helper functions for error handling.
-ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
-PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
-FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
-
-static ExprAST *ParseExpression();
-
-/// identifierexpr
-/// ::= identifier
-/// ::= identifier '(' expression* ')'
-static ExprAST *ParseIdentifierExpr() {
- std::string IdName = IdentifierStr;
-
- getNextToken(); // eat identifier.
-
- if (CurTok != '(') // Simple variable ref.
- return new VariableExprAST(IdName);
-
- // Call.
- getNextToken(); // eat (
- std::vector<ExprAST*> Args;
- if (CurTok != ')') {
- while (1) {
- ExprAST *Arg = ParseExpression();
- if (!Arg) return 0;
- Args.push_back(Arg);
-
- if (CurTok == ')') break;
-
- if (CurTok != ',')
- return Error("Expected ')' or ',' in argument list");
- getNextToken();
- }
- }
-
- // Eat the ')'.
- getNextToken();
-
- return new CallExprAST(IdName, Args);
-}
-
-/// numberexpr ::= number
-static ExprAST *ParseNumberExpr() {
- ExprAST *Result = new NumberExprAST(NumVal);
- getNextToken(); // consume the number
- return Result;
-}
-
-/// parenexpr ::= '(' expression ')'
-static ExprAST *ParseParenExpr() {
- getNextToken(); // eat (.
- ExprAST *V = ParseExpression();
- if (!V) return 0;
-
- if (CurTok != ')')
- return Error("expected ')'");
- getNextToken(); // eat ).
- return V;
-}
-
-/// primary
-/// ::= identifierexpr
-/// ::= numberexpr
-/// ::= parenexpr
-static ExprAST *ParsePrimary() {
- switch (CurTok) {
- default: return Error("unknown token when expecting an expression");
- case tok_identifier: return ParseIdentifierExpr();
- case tok_number: return ParseNumberExpr();
- case '(': return ParseParenExpr();
- }
-}
-
-/// binoprhs
-/// ::= ('+' primary)*
-static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
- // If this is a binop, find its precedence.
- while (1) {
- int TokPrec = GetTokPrecedence();
-
- // If this is a binop that binds at least as tightly as the current binop,
- // consume it, otherwise we are done.
- if (TokPrec < ExprPrec)
- return LHS;
-
- // Okay, we know this is a binop.
- int BinOp = CurTok;
- getNextToken(); // eat binop
-
- // Parse the primary expression after the binary operator.
- ExprAST *RHS = ParsePrimary();
- if (!RHS) return 0;
-
- // If BinOp binds less tightly with RHS than the operator after RHS, let
- // the pending operator take RHS as its LHS.
- int NextPrec = GetTokPrecedence();
- if (TokPrec < NextPrec) {
- RHS = ParseBinOpRHS(TokPrec+1, RHS);
- if (RHS == 0) return 0;
- }
-
- // Merge LHS/RHS.
- LHS = new BinaryExprAST(BinOp, LHS, RHS);
- }
-}
-
-/// expression
-/// ::= primary binoprhs
-///
-static ExprAST *ParseExpression() {
- ExprAST *LHS = ParsePrimary();
- if (!LHS) return 0;
-
- return ParseBinOpRHS(0, LHS);
-}
-
-/// prototype
-/// ::= id '(' id* ')'
-static PrototypeAST *ParsePrototype() {
- if (CurTok != tok_identifier)
- return ErrorP("Expected function name in prototype");
-
- std::string FnName = IdentifierStr;
- getNextToken();
-
- if (CurTok != '(')
- return ErrorP("Expected '(' in prototype");
-
- std::vector<std::string> ArgNames;
- while (getNextToken() == tok_identifier)
- ArgNames.push_back(IdentifierStr);
- if (CurTok != ')')
- return ErrorP("Expected ')' in prototype");
-
- // success.
- getNextToken(); // eat ')'.
-
- return new PrototypeAST(FnName, ArgNames);
-}
-
-/// definition ::= 'def' prototype expression
-static FunctionAST *ParseDefinition() {
- getNextToken(); // eat def.
- PrototypeAST *Proto = ParsePrototype();
- if (Proto == 0) return 0;
-
- if (ExprAST *E = ParseExpression())
- return new FunctionAST(Proto, E);
- return 0;
-}
-
-/// toplevelexpr ::= expression
-static FunctionAST *ParseTopLevelExpr() {
- if (ExprAST *E = ParseExpression()) {
- // Make an anonymous proto.
- PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>());
- return new FunctionAST(Proto, E);
- }
- return 0;
-}
-
-/// external ::= 'extern' prototype
-static PrototypeAST *ParseExtern() {
- getNextToken(); // eat extern.
- return ParsePrototype();
-}
-
-//===----------------------------------------------------------------------===//
-// Code Generation
-//===----------------------------------------------------------------------===//
-
-static Module *TheModule;
-static IRBuilder<> Builder(getGlobalContext());
-static std::map<std::string, Value*> NamedValues;
-
-Value *ErrorV(const char *Str) { Error(Str); return 0; }
-
-Value *NumberExprAST::Codegen() {
- return ConstantFP::get(getGlobalContext(), APFloat(Val));
-}
-
-Value *VariableExprAST::Codegen() {
- // Look this variable up in the function.
- Value *V = NamedValues[Name];
- return V ? V : ErrorV("Unknown variable name");
-}
-
-Value *BinaryExprAST::Codegen() {
- Value *L = LHS->Codegen();
- Value *R = RHS->Codegen();
- if (L == 0 || R == 0) return 0;
-
- switch (Op) {
- case '+': return Builder.CreateAdd(L, R, "addtmp");
- case '-': return Builder.CreateSub(L, R, "subtmp");
- case '*': return Builder.CreateMul(L, R, "multmp");
- case '<':
- L = Builder.CreateFCmpULT(L, R, "cmptmp");
- // Convert bool 0/1 to double 0.0 or 1.0
- return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
- "booltmp");
- default: return ErrorV("invalid binary operator");
- }
-}
-
-Value *CallExprAST::Codegen() {
- // Look up the name in the global module table.
- Function *CalleeF = TheModule->getFunction(Callee);
- if (CalleeF == 0)
- return ErrorV("Unknown function referenced");
-
- // If argument mismatch error.
- if (CalleeF->arg_size() != Args.size())
- return ErrorV("Incorrect # arguments passed");
-
- std::vector<Value*> ArgsV;
- for (unsigned i = 0, e = Args.size(); i != e; ++i) {
- ArgsV.push_back(Args[i]->Codegen());
- if (ArgsV.back() == 0) return 0;
- }
-
- return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
-}
-
-Function *PrototypeAST::Codegen() {
- // Make the function type: double(double,double) etc.
- std::vector<const Type*> Doubles(Args.size(),
- Type::getDoubleTy(getGlobalContext()));
- FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
- Doubles, false);
-
- Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
-
- // If F conflicted, there was already something named 'Name'. If it has a
- // body, don't allow redefinition or reextern.
- if (F->getName() != Name) {
- // Delete the one we just made and get the existing one.
- F->eraseFromParent();
- F = TheModule->getFunction(Name);
-
- // If F already has a body, reject this.
- if (!F->empty()) {
- ErrorF("redefinition of function");
- return 0;
- }
-
- // If F took a different number of args, reject.
- if (F->arg_size() != Args.size()) {
- ErrorF("redefinition of function with different # args");
- return 0;
- }
- }
-
- // Set names for all arguments.
- unsigned Idx = 0;
- for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size();
- ++AI, ++Idx) {
- AI->setName(Args[Idx]);
-
- // Add arguments to variable symbol table.
- NamedValues[Args[Idx]] = AI;
- }
-
- return F;
-}
-
-Function *FunctionAST::Codegen() {
- NamedValues.clear();
-
- Function *TheFunction = Proto->Codegen();
- if (TheFunction == 0)
- return 0;
-
- // Create a new basic block to start insertion into.
- BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
- Builder.SetInsertPoint(BB);
-
- if (Value *RetVal = Body->Codegen()) {
- // Finish off the function.
- Builder.CreateRet(RetVal);
-
- // Validate the generated code, checking for consistency.
- verifyFunction(*TheFunction);
-
- return TheFunction;
- }
-
- // Error reading body, remove function.
- TheFunction->eraseFromParent();
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Top-Level parsing and JIT Driver
-//===----------------------------------------------------------------------===//
-
-static void HandleDefinition() {
- if (FunctionAST *F = ParseDefinition()) {
- if (Function *LF = F->Codegen()) {
- fprintf(stderr, "Read function definition:");
- LF->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleExtern() {
- if (PrototypeAST *P = ParseExtern()) {
- if (Function *F = P->Codegen()) {
- fprintf(stderr, "Read extern: ");
- F->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleTopLevelExpression() {
- // Evaluate a top-level expression into an anonymous function.
- if (FunctionAST *F = ParseTopLevelExpr()) {
- if (Function *LF = F->Codegen()) {
- fprintf(stderr, "Read top-level expression:");
- LF->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-/// top ::= definition | external | expression | ';'
-static void MainLoop() {
- while (1) {
- fprintf(stderr, "ready> ");
- switch (CurTok) {
- case tok_eof: return;
- case ';': getNextToken(); break; // ignore top-level semicolons.
- case tok_def: HandleDefinition(); break;
- case tok_extern: HandleExtern(); break;
- default: HandleTopLevelExpression(); break;
- }
- }
-}
-
-//===----------------------------------------------------------------------===//
-// "Library" functions that can be "extern'd" from user code.
-//===----------------------------------------------------------------------===//
-
-/// putchard - putchar that takes a double and returns 0.
-extern "C"
-double putchard(double X) {
- putchar((char)X);
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Main driver code.
-//===----------------------------------------------------------------------===//
-
-int main() {
- LLVMContext &Context = getGlobalContext();
-
- // Install standard binary operators.
- // 1 is lowest precedence.
- BinopPrecedence['<'] = 10;
- BinopPrecedence['+'] = 20;
- BinopPrecedence['-'] = 20;
- BinopPrecedence['*'] = 40; // highest.
-
- // Prime the first token.
- fprintf(stderr, "ready> ");
- getNextToken();
-
- // Make the module, which holds all the code.
- TheModule = new Module("my cool jit", Context);
-
- // Run the main "interpreter loop" now.
- MainLoop();
-
- // Print out all of the generated code.
- TheModule->dump();
-
- return 0;
-}
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter4/CMakeLists.txt b/contrib/llvm/examples/Kaleidoscope/Chapter4/CMakeLists.txt
deleted file mode 100644
index 0d1ac53..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter4/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-set(LLVM_LINK_COMPONENTS core jit interpreter native)
-
-add_llvm_example(Kaleidoscope-Ch4
- toy.cpp
- )
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter4/Makefile b/contrib/llvm/examples/Kaleidoscope/Chapter4/Makefile
deleted file mode 100644
index 30162d9..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter4/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-##===- examples/Kaleidoscope/Chapter4/Makefile -------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL = ../../..
-TOOLNAME = Kaleidoscope-Ch4
-EXAMPLE_TOOL = 1
-
-LINK_COMPONENTS := core jit native
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter4/toy.cpp b/contrib/llvm/examples/Kaleidoscope/Chapter4/toy.cpp
deleted file mode 100644
index a2ddda2..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter4/toy.cpp
+++ /dev/null
@@ -1,610 +0,0 @@
-#include "llvm/DerivedTypes.h"
-#include "llvm/ExecutionEngine/ExecutionEngine.h"
-#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/PassManager.h"
-#include "llvm/Analysis/Verifier.h"
-#include "llvm/Target/TargetData.h"
-#include "llvm/Target/TargetSelect.h"
-#include "llvm/Transforms/Scalar.h"
-#include "llvm/Support/IRBuilder.h"
-#include <cstdio>
-#include <string>
-#include <map>
-#include <vector>
-using namespace llvm;
-
-//===----------------------------------------------------------------------===//
-// Lexer
-//===----------------------------------------------------------------------===//
-
-// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
-// of these for known things.
-enum Token {
- tok_eof = -1,
-
- // commands
- tok_def = -2, tok_extern = -3,
-
- // primary
- tok_identifier = -4, tok_number = -5
-};
-
-static std::string IdentifierStr; // Filled in if tok_identifier
-static double NumVal; // Filled in if tok_number
-
-/// gettok - Return the next token from standard input.
-static int gettok() {
- static int LastChar = ' ';
-
- // Skip any whitespace.
- while (isspace(LastChar))
- LastChar = getchar();
-
- if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
- IdentifierStr = LastChar;
- while (isalnum((LastChar = getchar())))
- IdentifierStr += LastChar;
-
- if (IdentifierStr == "def") return tok_def;
- if (IdentifierStr == "extern") return tok_extern;
- return tok_identifier;
- }
-
- if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
- std::string NumStr;
- do {
- NumStr += LastChar;
- LastChar = getchar();
- } while (isdigit(LastChar) || LastChar == '.');
-
- NumVal = strtod(NumStr.c_str(), 0);
- return tok_number;
- }
-
- if (LastChar == '#') {
- // Comment until end of line.
- do LastChar = getchar();
- while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
-
- if (LastChar != EOF)
- return gettok();
- }
-
- // Check for end of file. Don't eat the EOF.
- if (LastChar == EOF)
- return tok_eof;
-
- // Otherwise, just return the character as its ascii value.
- int ThisChar = LastChar;
- LastChar = getchar();
- return ThisChar;
-}
-
-//===----------------------------------------------------------------------===//
-// Abstract Syntax Tree (aka Parse Tree)
-//===----------------------------------------------------------------------===//
-
-/// ExprAST - Base class for all expression nodes.
-class ExprAST {
-public:
- virtual ~ExprAST() {}
- virtual Value *Codegen() = 0;
-};
-
-/// NumberExprAST - Expression class for numeric literals like "1.0".
-class NumberExprAST : public ExprAST {
- double Val;
-public:
- NumberExprAST(double val) : Val(val) {}
- virtual Value *Codegen();
-};
-
-/// VariableExprAST - Expression class for referencing a variable, like "a".
-class VariableExprAST : public ExprAST {
- std::string Name;
-public:
- VariableExprAST(const std::string &name) : Name(name) {}
- virtual Value *Codegen();
-};
-
-/// BinaryExprAST - Expression class for a binary operator.
-class BinaryExprAST : public ExprAST {
- char Op;
- ExprAST *LHS, *RHS;
-public:
- BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
- : Op(op), LHS(lhs), RHS(rhs) {}
- virtual Value *Codegen();
-};
-
-/// CallExprAST - Expression class for function calls.
-class CallExprAST : public ExprAST {
- std::string Callee;
- std::vector<ExprAST*> Args;
-public:
- CallExprAST(const std::string &callee, std::vector<ExprAST*> &args)
- : Callee(callee), Args(args) {}
- virtual Value *Codegen();
-};
-
-/// PrototypeAST - This class represents the "prototype" for a function,
-/// which captures its name, and its argument names (thus implicitly the number
-/// of arguments the function takes).
-class PrototypeAST {
- std::string Name;
- std::vector<std::string> Args;
-public:
- PrototypeAST(const std::string &name, const std::vector<std::string> &args)
- : Name(name), Args(args) {}
-
- Function *Codegen();
-};
-
-/// FunctionAST - This class represents a function definition itself.
-class FunctionAST {
- PrototypeAST *Proto;
- ExprAST *Body;
-public:
- FunctionAST(PrototypeAST *proto, ExprAST *body)
- : Proto(proto), Body(body) {}
-
- Function *Codegen();
-};
-
-//===----------------------------------------------------------------------===//
-// Parser
-//===----------------------------------------------------------------------===//
-
-/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
-/// token the parser is looking at. getNextToken reads another token from the
-/// lexer and updates CurTok with its results.
-static int CurTok;
-static int getNextToken() {
- return CurTok = gettok();
-}
-
-/// BinopPrecedence - This holds the precedence for each binary operator that is
-/// defined.
-static std::map<char, int> BinopPrecedence;
-
-/// GetTokPrecedence - Get the precedence of the pending binary operator token.
-static int GetTokPrecedence() {
- if (!isascii(CurTok))
- return -1;
-
- // Make sure it's a declared binop.
- int TokPrec = BinopPrecedence[CurTok];
- if (TokPrec <= 0) return -1;
- return TokPrec;
-}
-
-/// Error* - These are little helper functions for error handling.
-ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
-PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
-FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
-
-static ExprAST *ParseExpression();
-
-/// identifierexpr
-/// ::= identifier
-/// ::= identifier '(' expression* ')'
-static ExprAST *ParseIdentifierExpr() {
- std::string IdName = IdentifierStr;
-
- getNextToken(); // eat identifier.
-
- if (CurTok != '(') // Simple variable ref.
- return new VariableExprAST(IdName);
-
- // Call.
- getNextToken(); // eat (
- std::vector<ExprAST*> Args;
- if (CurTok != ')') {
- while (1) {
- ExprAST *Arg = ParseExpression();
- if (!Arg) return 0;
- Args.push_back(Arg);
-
- if (CurTok == ')') break;
-
- if (CurTok != ',')
- return Error("Expected ')' or ',' in argument list");
- getNextToken();
- }
- }
-
- // Eat the ')'.
- getNextToken();
-
- return new CallExprAST(IdName, Args);
-}
-
-/// numberexpr ::= number
-static ExprAST *ParseNumberExpr() {
- ExprAST *Result = new NumberExprAST(NumVal);
- getNextToken(); // consume the number
- return Result;
-}
-
-/// parenexpr ::= '(' expression ')'
-static ExprAST *ParseParenExpr() {
- getNextToken(); // eat (.
- ExprAST *V = ParseExpression();
- if (!V) return 0;
-
- if (CurTok != ')')
- return Error("expected ')'");
- getNextToken(); // eat ).
- return V;
-}
-
-/// primary
-/// ::= identifierexpr
-/// ::= numberexpr
-/// ::= parenexpr
-static ExprAST *ParsePrimary() {
- switch (CurTok) {
- default: return Error("unknown token when expecting an expression");
- case tok_identifier: return ParseIdentifierExpr();
- case tok_number: return ParseNumberExpr();
- case '(': return ParseParenExpr();
- }
-}
-
-/// binoprhs
-/// ::= ('+' primary)*
-static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
- // If this is a binop, find its precedence.
- while (1) {
- int TokPrec = GetTokPrecedence();
-
- // If this is a binop that binds at least as tightly as the current binop,
- // consume it, otherwise we are done.
- if (TokPrec < ExprPrec)
- return LHS;
-
- // Okay, we know this is a binop.
- int BinOp = CurTok;
- getNextToken(); // eat binop
-
- // Parse the primary expression after the binary operator.
- ExprAST *RHS = ParsePrimary();
- if (!RHS) return 0;
-
- // If BinOp binds less tightly with RHS than the operator after RHS, let
- // the pending operator take RHS as its LHS.
- int NextPrec = GetTokPrecedence();
- if (TokPrec < NextPrec) {
- RHS = ParseBinOpRHS(TokPrec+1, RHS);
- if (RHS == 0) return 0;
- }
-
- // Merge LHS/RHS.
- LHS = new BinaryExprAST(BinOp, LHS, RHS);
- }
-}
-
-/// expression
-/// ::= primary binoprhs
-///
-static ExprAST *ParseExpression() {
- ExprAST *LHS = ParsePrimary();
- if (!LHS) return 0;
-
- return ParseBinOpRHS(0, LHS);
-}
-
-/// prototype
-/// ::= id '(' id* ')'
-static PrototypeAST *ParsePrototype() {
- if (CurTok != tok_identifier)
- return ErrorP("Expected function name in prototype");
-
- std::string FnName = IdentifierStr;
- getNextToken();
-
- if (CurTok != '(')
- return ErrorP("Expected '(' in prototype");
-
- std::vector<std::string> ArgNames;
- while (getNextToken() == tok_identifier)
- ArgNames.push_back(IdentifierStr);
- if (CurTok != ')')
- return ErrorP("Expected ')' in prototype");
-
- // success.
- getNextToken(); // eat ')'.
-
- return new PrototypeAST(FnName, ArgNames);
-}
-
-/// definition ::= 'def' prototype expression
-static FunctionAST *ParseDefinition() {
- getNextToken(); // eat def.
- PrototypeAST *Proto = ParsePrototype();
- if (Proto == 0) return 0;
-
- if (ExprAST *E = ParseExpression())
- return new FunctionAST(Proto, E);
- return 0;
-}
-
-/// toplevelexpr ::= expression
-static FunctionAST *ParseTopLevelExpr() {
- if (ExprAST *E = ParseExpression()) {
- // Make an anonymous proto.
- PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>());
- return new FunctionAST(Proto, E);
- }
- return 0;
-}
-
-/// external ::= 'extern' prototype
-static PrototypeAST *ParseExtern() {
- getNextToken(); // eat extern.
- return ParsePrototype();
-}
-
-//===----------------------------------------------------------------------===//
-// Code Generation
-//===----------------------------------------------------------------------===//
-
-static Module *TheModule;
-static IRBuilder<> Builder(getGlobalContext());
-static std::map<std::string, Value*> NamedValues;
-static FunctionPassManager *TheFPM;
-
-Value *ErrorV(const char *Str) { Error(Str); return 0; }
-
-Value *NumberExprAST::Codegen() {
- return ConstantFP::get(getGlobalContext(), APFloat(Val));
-}
-
-Value *VariableExprAST::Codegen() {
- // Look this variable up in the function.
- Value *V = NamedValues[Name];
- return V ? V : ErrorV("Unknown variable name");
-}
-
-Value *BinaryExprAST::Codegen() {
- Value *L = LHS->Codegen();
- Value *R = RHS->Codegen();
- if (L == 0 || R == 0) return 0;
-
- switch (Op) {
- case '+': return Builder.CreateAdd(L, R, "addtmp");
- case '-': return Builder.CreateSub(L, R, "subtmp");
- case '*': return Builder.CreateMul(L, R, "multmp");
- case '<':
- L = Builder.CreateFCmpULT(L, R, "cmptmp");
- // Convert bool 0/1 to double 0.0 or 1.0
- return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
- "booltmp");
- default: return ErrorV("invalid binary operator");
- }
-}
-
-Value *CallExprAST::Codegen() {
- // Look up the name in the global module table.
- Function *CalleeF = TheModule->getFunction(Callee);
- if (CalleeF == 0)
- return ErrorV("Unknown function referenced");
-
- // If argument mismatch error.
- if (CalleeF->arg_size() != Args.size())
- return ErrorV("Incorrect # arguments passed");
-
- std::vector<Value*> ArgsV;
- for (unsigned i = 0, e = Args.size(); i != e; ++i) {
- ArgsV.push_back(Args[i]->Codegen());
- if (ArgsV.back() == 0) return 0;
- }
-
- return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
-}
-
-Function *PrototypeAST::Codegen() {
- // Make the function type: double(double,double) etc.
- std::vector<const Type*> Doubles(Args.size(),
- Type::getDoubleTy(getGlobalContext()));
- FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
- Doubles, false);
-
- Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
-
- // If F conflicted, there was already something named 'Name'. If it has a
- // body, don't allow redefinition or reextern.
- if (F->getName() != Name) {
- // Delete the one we just made and get the existing one.
- F->eraseFromParent();
- F = TheModule->getFunction(Name);
-
- // If F already has a body, reject this.
- if (!F->empty()) {
- ErrorF("redefinition of function");
- return 0;
- }
-
- // If F took a different number of args, reject.
- if (F->arg_size() != Args.size()) {
- ErrorF("redefinition of function with different # args");
- return 0;
- }
- }
-
- // Set names for all arguments.
- unsigned Idx = 0;
- for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size();
- ++AI, ++Idx) {
- AI->setName(Args[Idx]);
-
- // Add arguments to variable symbol table.
- NamedValues[Args[Idx]] = AI;
- }
-
- return F;
-}
-
-Function *FunctionAST::Codegen() {
- NamedValues.clear();
-
- Function *TheFunction = Proto->Codegen();
- if (TheFunction == 0)
- return 0;
-
- // Create a new basic block to start insertion into.
- BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
- Builder.SetInsertPoint(BB);
-
- if (Value *RetVal = Body->Codegen()) {
- // Finish off the function.
- Builder.CreateRet(RetVal);
-
- // Validate the generated code, checking for consistency.
- verifyFunction(*TheFunction);
-
- // Optimize the function.
- TheFPM->run(*TheFunction);
-
- return TheFunction;
- }
-
- // Error reading body, remove function.
- TheFunction->eraseFromParent();
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Top-Level parsing and JIT Driver
-//===----------------------------------------------------------------------===//
-
-static ExecutionEngine *TheExecutionEngine;
-
-static void HandleDefinition() {
- if (FunctionAST *F = ParseDefinition()) {
- if (Function *LF = F->Codegen()) {
- fprintf(stderr, "Read function definition:");
- LF->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleExtern() {
- if (PrototypeAST *P = ParseExtern()) {
- if (Function *F = P->Codegen()) {
- fprintf(stderr, "Read extern: ");
- F->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleTopLevelExpression() {
- // Evaluate a top-level expression into an anonymous function.
- if (FunctionAST *F = ParseTopLevelExpr()) {
- if (Function *LF = F->Codegen()) {
- // JIT the function, returning a function pointer.
- void *FPtr = TheExecutionEngine->getPointerToFunction(LF);
-
- // Cast it to the right type (takes no arguments, returns a double) so we
- // can call it as a native function.
- double (*FP)() = (double (*)())(intptr_t)FPtr;
- fprintf(stderr, "Evaluated to %f\n", FP());
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-/// top ::= definition | external | expression | ';'
-static void MainLoop() {
- while (1) {
- fprintf(stderr, "ready> ");
- switch (CurTok) {
- case tok_eof: return;
- case ';': getNextToken(); break; // ignore top-level semicolons.
- case tok_def: HandleDefinition(); break;
- case tok_extern: HandleExtern(); break;
- default: HandleTopLevelExpression(); break;
- }
- }
-}
-
-//===----------------------------------------------------------------------===//
-// "Library" functions that can be "extern'd" from user code.
-//===----------------------------------------------------------------------===//
-
-/// putchard - putchar that takes a double and returns 0.
-extern "C"
-double putchard(double X) {
- putchar((char)X);
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Main driver code.
-//===----------------------------------------------------------------------===//
-
-int main() {
- InitializeNativeTarget();
- LLVMContext &Context = getGlobalContext();
-
- // Install standard binary operators.
- // 1 is lowest precedence.
- BinopPrecedence['<'] = 10;
- BinopPrecedence['+'] = 20;
- BinopPrecedence['-'] = 20;
- BinopPrecedence['*'] = 40; // highest.
-
- // Prime the first token.
- fprintf(stderr, "ready> ");
- getNextToken();
-
- // Make the module, which holds all the code.
- TheModule = new Module("my cool jit", Context);
-
- // Create the JIT. This takes ownership of the module.
- std::string ErrStr;
- TheExecutionEngine = EngineBuilder(TheModule).setErrorStr(&ErrStr).create();
- if (!TheExecutionEngine) {
- fprintf(stderr, "Could not create ExecutionEngine: %s\n", ErrStr.c_str());
- exit(1);
- }
-
- FunctionPassManager OurFPM(TheModule);
-
- // Set up the optimizer pipeline. Start with registering info about how the
- // target lays out data structures.
- OurFPM.add(new TargetData(*TheExecutionEngine->getTargetData()));
- // Do simple "peephole" optimizations and bit-twiddling optzns.
- OurFPM.add(createInstructionCombiningPass());
- // Reassociate expressions.
- OurFPM.add(createReassociatePass());
- // Eliminate Common SubExpressions.
- OurFPM.add(createGVNPass());
- // Simplify the control flow graph (deleting unreachable blocks, etc).
- OurFPM.add(createCFGSimplificationPass());
-
- OurFPM.doInitialization();
-
- // Set the global so the code gen can use this.
- TheFPM = &OurFPM;
-
- // Run the main "interpreter loop" now.
- MainLoop();
-
- TheFPM = 0;
-
- // Print out all of the generated code.
- TheModule->dump();
-
- return 0;
-}
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter5/CMakeLists.txt b/contrib/llvm/examples/Kaleidoscope/Chapter5/CMakeLists.txt
deleted file mode 100644
index 2d75ad3..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter5/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-set(LLVM_LINK_COMPONENTS core jit interpreter native)
-
-add_llvm_example(Kaleidoscope-Ch5
- toy.cpp
- )
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter5/Makefile b/contrib/llvm/examples/Kaleidoscope/Chapter5/Makefile
deleted file mode 100644
index d1f5e20..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter5/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-##===- examples/Kaleidoscope/Chapter5/Makefile -------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL = ../../..
-TOOLNAME = Kaleidoscope-Ch5
-EXAMPLE_TOOL = 1
-
-LINK_COMPONENTS := core jit native
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter5/toy.cpp b/contrib/llvm/examples/Kaleidoscope/Chapter5/toy.cpp
deleted file mode 100644
index da64b7e..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter5/toy.cpp
+++ /dev/null
@@ -1,855 +0,0 @@
-#include "llvm/DerivedTypes.h"
-#include "llvm/ExecutionEngine/ExecutionEngine.h"
-#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/PassManager.h"
-#include "llvm/Analysis/Verifier.h"
-#include "llvm/Target/TargetData.h"
-#include "llvm/Target/TargetSelect.h"
-#include "llvm/Transforms/Scalar.h"
-#include "llvm/Support/IRBuilder.h"
-#include <cstdio>
-#include <string>
-#include <map>
-#include <vector>
-using namespace llvm;
-
-//===----------------------------------------------------------------------===//
-// Lexer
-//===----------------------------------------------------------------------===//
-
-// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
-// of these for known things.
-enum Token {
- tok_eof = -1,
-
- // commands
- tok_def = -2, tok_extern = -3,
-
- // primary
- tok_identifier = -4, tok_number = -5,
-
- // control
- tok_if = -6, tok_then = -7, tok_else = -8,
- tok_for = -9, tok_in = -10
-};
-
-static std::string IdentifierStr; // Filled in if tok_identifier
-static double NumVal; // Filled in if tok_number
-
-/// gettok - Return the next token from standard input.
-static int gettok() {
- static int LastChar = ' ';
-
- // Skip any whitespace.
- while (isspace(LastChar))
- LastChar = getchar();
-
- if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
- IdentifierStr = LastChar;
- while (isalnum((LastChar = getchar())))
- IdentifierStr += LastChar;
-
- if (IdentifierStr == "def") return tok_def;
- if (IdentifierStr == "extern") return tok_extern;
- if (IdentifierStr == "if") return tok_if;
- if (IdentifierStr == "then") return tok_then;
- if (IdentifierStr == "else") return tok_else;
- if (IdentifierStr == "for") return tok_for;
- if (IdentifierStr == "in") return tok_in;
- return tok_identifier;
- }
-
- if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
- std::string NumStr;
- do {
- NumStr += LastChar;
- LastChar = getchar();
- } while (isdigit(LastChar) || LastChar == '.');
-
- NumVal = strtod(NumStr.c_str(), 0);
- return tok_number;
- }
-
- if (LastChar == '#') {
- // Comment until end of line.
- do LastChar = getchar();
- while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
-
- if (LastChar != EOF)
- return gettok();
- }
-
- // Check for end of file. Don't eat the EOF.
- if (LastChar == EOF)
- return tok_eof;
-
- // Otherwise, just return the character as its ascii value.
- int ThisChar = LastChar;
- LastChar = getchar();
- return ThisChar;
-}
-
-//===----------------------------------------------------------------------===//
-// Abstract Syntax Tree (aka Parse Tree)
-//===----------------------------------------------------------------------===//
-
-/// ExprAST - Base class for all expression nodes.
-class ExprAST {
-public:
- virtual ~ExprAST() {}
- virtual Value *Codegen() = 0;
-};
-
-/// NumberExprAST - Expression class for numeric literals like "1.0".
-class NumberExprAST : public ExprAST {
- double Val;
-public:
- NumberExprAST(double val) : Val(val) {}
- virtual Value *Codegen();
-};
-
-/// VariableExprAST - Expression class for referencing a variable, like "a".
-class VariableExprAST : public ExprAST {
- std::string Name;
-public:
- VariableExprAST(const std::string &name) : Name(name) {}
- virtual Value *Codegen();
-};
-
-/// BinaryExprAST - Expression class for a binary operator.
-class BinaryExprAST : public ExprAST {
- char Op;
- ExprAST *LHS, *RHS;
-public:
- BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
- : Op(op), LHS(lhs), RHS(rhs) {}
- virtual Value *Codegen();
-};
-
-/// CallExprAST - Expression class for function calls.
-class CallExprAST : public ExprAST {
- std::string Callee;
- std::vector<ExprAST*> Args;
-public:
- CallExprAST(const std::string &callee, std::vector<ExprAST*> &args)
- : Callee(callee), Args(args) {}
- virtual Value *Codegen();
-};
-
-/// IfExprAST - Expression class for if/then/else.
-class IfExprAST : public ExprAST {
- ExprAST *Cond, *Then, *Else;
-public:
- IfExprAST(ExprAST *cond, ExprAST *then, ExprAST *_else)
- : Cond(cond), Then(then), Else(_else) {}
- virtual Value *Codegen();
-};
-
-/// ForExprAST - Expression class for for/in.
-class ForExprAST : public ExprAST {
- std::string VarName;
- ExprAST *Start, *End, *Step, *Body;
-public:
- ForExprAST(const std::string &varname, ExprAST *start, ExprAST *end,
- ExprAST *step, ExprAST *body)
- : VarName(varname), Start(start), End(end), Step(step), Body(body) {}
- virtual Value *Codegen();
-};
-
-/// PrototypeAST - This class represents the "prototype" for a function,
-/// which captures its name, and its argument names (thus implicitly the number
-/// of arguments the function takes).
-class PrototypeAST {
- std::string Name;
- std::vector<std::string> Args;
-public:
- PrototypeAST(const std::string &name, const std::vector<std::string> &args)
- : Name(name), Args(args) {}
-
- Function *Codegen();
-};
-
-/// FunctionAST - This class represents a function definition itself.
-class FunctionAST {
- PrototypeAST *Proto;
- ExprAST *Body;
-public:
- FunctionAST(PrototypeAST *proto, ExprAST *body)
- : Proto(proto), Body(body) {}
-
- Function *Codegen();
-};
-
-//===----------------------------------------------------------------------===//
-// Parser
-//===----------------------------------------------------------------------===//
-
-/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
-/// token the parser is looking at. getNextToken reads another token from the
-/// lexer and updates CurTok with its results.
-static int CurTok;
-static int getNextToken() {
- return CurTok = gettok();
-}
-
-/// BinopPrecedence - This holds the precedence for each binary operator that is
-/// defined.
-static std::map<char, int> BinopPrecedence;
-
-/// GetTokPrecedence - Get the precedence of the pending binary operator token.
-static int GetTokPrecedence() {
- if (!isascii(CurTok))
- return -1;
-
- // Make sure it's a declared binop.
- int TokPrec = BinopPrecedence[CurTok];
- if (TokPrec <= 0) return -1;
- return TokPrec;
-}
-
-/// Error* - These are little helper functions for error handling.
-ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
-PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
-FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
-
-static ExprAST *ParseExpression();
-
-/// identifierexpr
-/// ::= identifier
-/// ::= identifier '(' expression* ')'
-static ExprAST *ParseIdentifierExpr() {
- std::string IdName = IdentifierStr;
-
- getNextToken(); // eat identifier.
-
- if (CurTok != '(') // Simple variable ref.
- return new VariableExprAST(IdName);
-
- // Call.
- getNextToken(); // eat (
- std::vector<ExprAST*> Args;
- if (CurTok != ')') {
- while (1) {
- ExprAST *Arg = ParseExpression();
- if (!Arg) return 0;
- Args.push_back(Arg);
-
- if (CurTok == ')') break;
-
- if (CurTok != ',')
- return Error("Expected ')' or ',' in argument list");
- getNextToken();
- }
- }
-
- // Eat the ')'.
- getNextToken();
-
- return new CallExprAST(IdName, Args);
-}
-
-/// numberexpr ::= number
-static ExprAST *ParseNumberExpr() {
- ExprAST *Result = new NumberExprAST(NumVal);
- getNextToken(); // consume the number
- return Result;
-}
-
-/// parenexpr ::= '(' expression ')'
-static ExprAST *ParseParenExpr() {
- getNextToken(); // eat (.
- ExprAST *V = ParseExpression();
- if (!V) return 0;
-
- if (CurTok != ')')
- return Error("expected ')'");
- getNextToken(); // eat ).
- return V;
-}
-
-/// ifexpr ::= 'if' expression 'then' expression 'else' expression
-static ExprAST *ParseIfExpr() {
- getNextToken(); // eat the if.
-
- // condition.
- ExprAST *Cond = ParseExpression();
- if (!Cond) return 0;
-
- if (CurTok != tok_then)
- return Error("expected then");
- getNextToken(); // eat the then
-
- ExprAST *Then = ParseExpression();
- if (Then == 0) return 0;
-
- if (CurTok != tok_else)
- return Error("expected else");
-
- getNextToken();
-
- ExprAST *Else = ParseExpression();
- if (!Else) return 0;
-
- return new IfExprAST(Cond, Then, Else);
-}
-
-/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
-static ExprAST *ParseForExpr() {
- getNextToken(); // eat the for.
-
- if (CurTok != tok_identifier)
- return Error("expected identifier after for");
-
- std::string IdName = IdentifierStr;
- getNextToken(); // eat identifier.
-
- if (CurTok != '=')
- return Error("expected '=' after for");
- getNextToken(); // eat '='.
-
-
- ExprAST *Start = ParseExpression();
- if (Start == 0) return 0;
- if (CurTok != ',')
- return Error("expected ',' after for start value");
- getNextToken();
-
- ExprAST *End = ParseExpression();
- if (End == 0) return 0;
-
- // The step value is optional.
- ExprAST *Step = 0;
- if (CurTok == ',') {
- getNextToken();
- Step = ParseExpression();
- if (Step == 0) return 0;
- }
-
- if (CurTok != tok_in)
- return Error("expected 'in' after for");
- getNextToken(); // eat 'in'.
-
- ExprAST *Body = ParseExpression();
- if (Body == 0) return 0;
-
- return new ForExprAST(IdName, Start, End, Step, Body);
-}
-
-/// primary
-/// ::= identifierexpr
-/// ::= numberexpr
-/// ::= parenexpr
-/// ::= ifexpr
-/// ::= forexpr
-static ExprAST *ParsePrimary() {
- switch (CurTok) {
- default: return Error("unknown token when expecting an expression");
- case tok_identifier: return ParseIdentifierExpr();
- case tok_number: return ParseNumberExpr();
- case '(': return ParseParenExpr();
- case tok_if: return ParseIfExpr();
- case tok_for: return ParseForExpr();
- }
-}
-
-/// binoprhs
-/// ::= ('+' primary)*
-static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
- // If this is a binop, find its precedence.
- while (1) {
- int TokPrec = GetTokPrecedence();
-
- // If this is a binop that binds at least as tightly as the current binop,
- // consume it, otherwise we are done.
- if (TokPrec < ExprPrec)
- return LHS;
-
- // Okay, we know this is a binop.
- int BinOp = CurTok;
- getNextToken(); // eat binop
-
- // Parse the primary expression after the binary operator.
- ExprAST *RHS = ParsePrimary();
- if (!RHS) return 0;
-
- // If BinOp binds less tightly with RHS than the operator after RHS, let
- // the pending operator take RHS as its LHS.
- int NextPrec = GetTokPrecedence();
- if (TokPrec < NextPrec) {
- RHS = ParseBinOpRHS(TokPrec+1, RHS);
- if (RHS == 0) return 0;
- }
-
- // Merge LHS/RHS.
- LHS = new BinaryExprAST(BinOp, LHS, RHS);
- }
-}
-
-/// expression
-/// ::= primary binoprhs
-///
-static ExprAST *ParseExpression() {
- ExprAST *LHS = ParsePrimary();
- if (!LHS) return 0;
-
- return ParseBinOpRHS(0, LHS);
-}
-
-/// prototype
-/// ::= id '(' id* ')'
-static PrototypeAST *ParsePrototype() {
- if (CurTok != tok_identifier)
- return ErrorP("Expected function name in prototype");
-
- std::string FnName = IdentifierStr;
- getNextToken();
-
- if (CurTok != '(')
- return ErrorP("Expected '(' in prototype");
-
- std::vector<std::string> ArgNames;
- while (getNextToken() == tok_identifier)
- ArgNames.push_back(IdentifierStr);
- if (CurTok != ')')
- return ErrorP("Expected ')' in prototype");
-
- // success.
- getNextToken(); // eat ')'.
-
- return new PrototypeAST(FnName, ArgNames);
-}
-
-/// definition ::= 'def' prototype expression
-static FunctionAST *ParseDefinition() {
- getNextToken(); // eat def.
- PrototypeAST *Proto = ParsePrototype();
- if (Proto == 0) return 0;
-
- if (ExprAST *E = ParseExpression())
- return new FunctionAST(Proto, E);
- return 0;
-}
-
-/// toplevelexpr ::= expression
-static FunctionAST *ParseTopLevelExpr() {
- if (ExprAST *E = ParseExpression()) {
- // Make an anonymous proto.
- PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>());
- return new FunctionAST(Proto, E);
- }
- return 0;
-}
-
-/// external ::= 'extern' prototype
-static PrototypeAST *ParseExtern() {
- getNextToken(); // eat extern.
- return ParsePrototype();
-}
-
-//===----------------------------------------------------------------------===//
-// Code Generation
-//===----------------------------------------------------------------------===//
-
-static Module *TheModule;
-static IRBuilder<> Builder(getGlobalContext());
-static std::map<std::string, Value*> NamedValues;
-static FunctionPassManager *TheFPM;
-
-Value *ErrorV(const char *Str) { Error(Str); return 0; }
-
-Value *NumberExprAST::Codegen() {
- return ConstantFP::get(getGlobalContext(), APFloat(Val));
-}
-
-Value *VariableExprAST::Codegen() {
- // Look this variable up in the function.
- Value *V = NamedValues[Name];
- return V ? V : ErrorV("Unknown variable name");
-}
-
-Value *BinaryExprAST::Codegen() {
- Value *L = LHS->Codegen();
- Value *R = RHS->Codegen();
- if (L == 0 || R == 0) return 0;
-
- switch (Op) {
- case '+': return Builder.CreateAdd(L, R, "addtmp");
- case '-': return Builder.CreateSub(L, R, "subtmp");
- case '*': return Builder.CreateMul(L, R, "multmp");
- case '<':
- L = Builder.CreateFCmpULT(L, R, "cmptmp");
- // Convert bool 0/1 to double 0.0 or 1.0
- return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
- "booltmp");
- default: return ErrorV("invalid binary operator");
- }
-}
-
-Value *CallExprAST::Codegen() {
- // Look up the name in the global module table.
- Function *CalleeF = TheModule->getFunction(Callee);
- if (CalleeF == 0)
- return ErrorV("Unknown function referenced");
-
- // If argument mismatch error.
- if (CalleeF->arg_size() != Args.size())
- return ErrorV("Incorrect # arguments passed");
-
- std::vector<Value*> ArgsV;
- for (unsigned i = 0, e = Args.size(); i != e; ++i) {
- ArgsV.push_back(Args[i]->Codegen());
- if (ArgsV.back() == 0) return 0;
- }
-
- return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
-}
-
-Value *IfExprAST::Codegen() {
- Value *CondV = Cond->Codegen();
- if (CondV == 0) return 0;
-
- // Convert condition to a bool by comparing equal to 0.0.
- CondV = Builder.CreateFCmpONE(CondV,
- ConstantFP::get(getGlobalContext(), APFloat(0.0)),
- "ifcond");
-
- Function *TheFunction = Builder.GetInsertBlock()->getParent();
-
- // Create blocks for the then and else cases. Insert the 'then' block at the
- // end of the function.
- BasicBlock *ThenBB = BasicBlock::Create(getGlobalContext(), "then", TheFunction);
- BasicBlock *ElseBB = BasicBlock::Create(getGlobalContext(), "else");
- BasicBlock *MergeBB = BasicBlock::Create(getGlobalContext(), "ifcont");
-
- Builder.CreateCondBr(CondV, ThenBB, ElseBB);
-
- // Emit then value.
- Builder.SetInsertPoint(ThenBB);
-
- Value *ThenV = Then->Codegen();
- if (ThenV == 0) return 0;
-
- Builder.CreateBr(MergeBB);
- // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
- ThenBB = Builder.GetInsertBlock();
-
- // Emit else block.
- TheFunction->getBasicBlockList().push_back(ElseBB);
- Builder.SetInsertPoint(ElseBB);
-
- Value *ElseV = Else->Codegen();
- if (ElseV == 0) return 0;
-
- Builder.CreateBr(MergeBB);
- // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
- ElseBB = Builder.GetInsertBlock();
-
- // Emit merge block.
- TheFunction->getBasicBlockList().push_back(MergeBB);
- Builder.SetInsertPoint(MergeBB);
- PHINode *PN = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()),
- "iftmp");
-
- PN->addIncoming(ThenV, ThenBB);
- PN->addIncoming(ElseV, ElseBB);
- return PN;
-}
-
-Value *ForExprAST::Codegen() {
- // Output this as:
- // ...
- // start = startexpr
- // goto loop
- // loop:
- // variable = phi [start, loopheader], [nextvariable, loopend]
- // ...
- // bodyexpr
- // ...
- // loopend:
- // step = stepexpr
- // nextvariable = variable + step
- // endcond = endexpr
- // br endcond, loop, endloop
- // outloop:
-
- // Emit the start code first, without 'variable' in scope.
- Value *StartVal = Start->Codegen();
- if (StartVal == 0) return 0;
-
- // Make the new basic block for the loop header, inserting after current
- // block.
- Function *TheFunction = Builder.GetInsertBlock()->getParent();
- BasicBlock *PreheaderBB = Builder.GetInsertBlock();
- BasicBlock *LoopBB = BasicBlock::Create(getGlobalContext(), "loop", TheFunction);
-
- // Insert an explicit fall through from the current block to the LoopBB.
- Builder.CreateBr(LoopBB);
-
- // Start insertion in LoopBB.
- Builder.SetInsertPoint(LoopBB);
-
- // Start the PHI node with an entry for Start.
- PHINode *Variable = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()), VarName.c_str());
- Variable->addIncoming(StartVal, PreheaderBB);
-
- // Within the loop, the variable is defined equal to the PHI node. If it
- // shadows an existing variable, we have to restore it, so save it now.
- Value *OldVal = NamedValues[VarName];
- NamedValues[VarName] = Variable;
-
- // Emit the body of the loop. This, like any other expr, can change the
- // current BB. Note that we ignore the value computed by the body, but don't
- // allow an error.
- if (Body->Codegen() == 0)
- return 0;
-
- // Emit the step value.
- Value *StepVal;
- if (Step) {
- StepVal = Step->Codegen();
- if (StepVal == 0) return 0;
- } else {
- // If not specified, use 1.0.
- StepVal = ConstantFP::get(getGlobalContext(), APFloat(1.0));
- }
-
- Value *NextVar = Builder.CreateAdd(Variable, StepVal, "nextvar");
-
- // Compute the end condition.
- Value *EndCond = End->Codegen();
- if (EndCond == 0) return EndCond;
-
- // Convert condition to a bool by comparing equal to 0.0.
- EndCond = Builder.CreateFCmpONE(EndCond,
- ConstantFP::get(getGlobalContext(), APFloat(0.0)),
- "loopcond");
-
- // Create the "after loop" block and insert it.
- BasicBlock *LoopEndBB = Builder.GetInsertBlock();
- BasicBlock *AfterBB = BasicBlock::Create(getGlobalContext(), "afterloop", TheFunction);
-
- // Insert the conditional branch into the end of LoopEndBB.
- Builder.CreateCondBr(EndCond, LoopBB, AfterBB);
-
- // Any new code will be inserted in AfterBB.
- Builder.SetInsertPoint(AfterBB);
-
- // Add a new entry to the PHI node for the backedge.
- Variable->addIncoming(NextVar, LoopEndBB);
-
- // Restore the unshadowed variable.
- if (OldVal)
- NamedValues[VarName] = OldVal;
- else
- NamedValues.erase(VarName);
-
-
- // for expr always returns 0.0.
- return Constant::getNullValue(Type::getDoubleTy(getGlobalContext()));
-}
-
-Function *PrototypeAST::Codegen() {
- // Make the function type: double(double,double) etc.
- std::vector<const Type*> Doubles(Args.size(),
- Type::getDoubleTy(getGlobalContext()));
- FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
- Doubles, false);
-
- Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
-
- // If F conflicted, there was already something named 'Name'. If it has a
- // body, don't allow redefinition or reextern.
- if (F->getName() != Name) {
- // Delete the one we just made and get the existing one.
- F->eraseFromParent();
- F = TheModule->getFunction(Name);
-
- // If F already has a body, reject this.
- if (!F->empty()) {
- ErrorF("redefinition of function");
- return 0;
- }
-
- // If F took a different number of args, reject.
- if (F->arg_size() != Args.size()) {
- ErrorF("redefinition of function with different # args");
- return 0;
- }
- }
-
- // Set names for all arguments.
- unsigned Idx = 0;
- for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size();
- ++AI, ++Idx) {
- AI->setName(Args[Idx]);
-
- // Add arguments to variable symbol table.
- NamedValues[Args[Idx]] = AI;
- }
-
- return F;
-}
-
-Function *FunctionAST::Codegen() {
- NamedValues.clear();
-
- Function *TheFunction = Proto->Codegen();
- if (TheFunction == 0)
- return 0;
-
- // Create a new basic block to start insertion into.
- BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
- Builder.SetInsertPoint(BB);
-
- if (Value *RetVal = Body->Codegen()) {
- // Finish off the function.
- Builder.CreateRet(RetVal);
-
- // Validate the generated code, checking for consistency.
- verifyFunction(*TheFunction);
-
- // Optimize the function.
- TheFPM->run(*TheFunction);
-
- return TheFunction;
- }
-
- // Error reading body, remove function.
- TheFunction->eraseFromParent();
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Top-Level parsing and JIT Driver
-//===----------------------------------------------------------------------===//
-
-static ExecutionEngine *TheExecutionEngine;
-
-static void HandleDefinition() {
- if (FunctionAST *F = ParseDefinition()) {
- if (Function *LF = F->Codegen()) {
- fprintf(stderr, "Read function definition:");
- LF->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleExtern() {
- if (PrototypeAST *P = ParseExtern()) {
- if (Function *F = P->Codegen()) {
- fprintf(stderr, "Read extern: ");
- F->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleTopLevelExpression() {
- // Evaluate a top-level expression into an anonymous function.
- if (FunctionAST *F = ParseTopLevelExpr()) {
- if (Function *LF = F->Codegen()) {
- // JIT the function, returning a function pointer.
- void *FPtr = TheExecutionEngine->getPointerToFunction(LF);
-
- // Cast it to the right type (takes no arguments, returns a double) so we
- // can call it as a native function.
- double (*FP)() = (double (*)())(intptr_t)FPtr;
- fprintf(stderr, "Evaluated to %f\n", FP());
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-/// top ::= definition | external | expression | ';'
-static void MainLoop() {
- while (1) {
- fprintf(stderr, "ready> ");
- switch (CurTok) {
- case tok_eof: return;
- case ';': getNextToken(); break; // ignore top-level semicolons.
- case tok_def: HandleDefinition(); break;
- case tok_extern: HandleExtern(); break;
- default: HandleTopLevelExpression(); break;
- }
- }
-}
-
-//===----------------------------------------------------------------------===//
-// "Library" functions that can be "extern'd" from user code.
-//===----------------------------------------------------------------------===//
-
-/// putchard - putchar that takes a double and returns 0.
-extern "C"
-double putchard(double X) {
- putchar((char)X);
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Main driver code.
-//===----------------------------------------------------------------------===//
-
-int main() {
- InitializeNativeTarget();
- LLVMContext &Context = getGlobalContext();
-
- // Install standard binary operators.
- // 1 is lowest precedence.
- BinopPrecedence['<'] = 10;
- BinopPrecedence['+'] = 20;
- BinopPrecedence['-'] = 20;
- BinopPrecedence['*'] = 40; // highest.
-
- // Prime the first token.
- fprintf(stderr, "ready> ");
- getNextToken();
-
- // Make the module, which holds all the code.
- TheModule = new Module("my cool jit", Context);
-
- // Create the JIT. This takes ownership of the module.
- std::string ErrStr;
- TheExecutionEngine = EngineBuilder(TheModule).setErrorStr(&ErrStr).create();
- if (!TheExecutionEngine) {
- fprintf(stderr, "Could not create ExecutionEngine: %s\n", ErrStr.c_str());
- exit(1);
- }
-
- FunctionPassManager OurFPM(TheModule);
-
- // Set up the optimizer pipeline. Start with registering info about how the
- // target lays out data structures.
- OurFPM.add(new TargetData(*TheExecutionEngine->getTargetData()));
- // Do simple "peephole" optimizations and bit-twiddling optzns.
- OurFPM.add(createInstructionCombiningPass());
- // Reassociate expressions.
- OurFPM.add(createReassociatePass());
- // Eliminate Common SubExpressions.
- OurFPM.add(createGVNPass());
- // Simplify the control flow graph (deleting unreachable blocks, etc).
- OurFPM.add(createCFGSimplificationPass());
-
- OurFPM.doInitialization();
-
- // Set the global so the code gen can use this.
- TheFPM = &OurFPM;
-
- // Run the main "interpreter loop" now.
- MainLoop();
-
- TheFPM = 0;
-
- // Print out all of the generated code.
- TheModule->dump();
-
- return 0;
-}
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter6/CMakeLists.txt b/contrib/llvm/examples/Kaleidoscope/Chapter6/CMakeLists.txt
deleted file mode 100644
index 2e15a5f..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter6/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-set(LLVM_LINK_COMPONENTS core jit interpreter native)
-
-add_llvm_example(Kaleidoscope-Ch6
- toy.cpp
- )
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter6/Makefile b/contrib/llvm/examples/Kaleidoscope/Chapter6/Makefile
deleted file mode 100644
index a5fbcbd..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter6/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-##===- examples/Kaleidoscope/Chapter6/Makefile -------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL = ../../..
-TOOLNAME = Kaleidoscope-Ch6
-EXAMPLE_TOOL = 1
-
-LINK_COMPONENTS := core jit native
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter6/toy.cpp b/contrib/llvm/examples/Kaleidoscope/Chapter6/toy.cpp
deleted file mode 100644
index 4e719e3..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter6/toy.cpp
+++ /dev/null
@@ -1,973 +0,0 @@
-#include "llvm/DerivedTypes.h"
-#include "llvm/ExecutionEngine/ExecutionEngine.h"
-#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/PassManager.h"
-#include "llvm/Analysis/Verifier.h"
-#include "llvm/Target/TargetData.h"
-#include "llvm/Target/TargetSelect.h"
-#include "llvm/Transforms/Scalar.h"
-#include "llvm/Support/IRBuilder.h"
-#include <cstdio>
-#include <string>
-#include <map>
-#include <vector>
-using namespace llvm;
-
-//===----------------------------------------------------------------------===//
-// Lexer
-//===----------------------------------------------------------------------===//
-
-// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
-// of these for known things.
-enum Token {
- tok_eof = -1,
-
- // commands
- tok_def = -2, tok_extern = -3,
-
- // primary
- tok_identifier = -4, tok_number = -5,
-
- // control
- tok_if = -6, tok_then = -7, tok_else = -8,
- tok_for = -9, tok_in = -10,
-
- // operators
- tok_binary = -11, tok_unary = -12
-};
-
-static std::string IdentifierStr; // Filled in if tok_identifier
-static double NumVal; // Filled in if tok_number
-
-/// gettok - Return the next token from standard input.
-static int gettok() {
- static int LastChar = ' ';
-
- // Skip any whitespace.
- while (isspace(LastChar))
- LastChar = getchar();
-
- if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
- IdentifierStr = LastChar;
- while (isalnum((LastChar = getchar())))
- IdentifierStr += LastChar;
-
- if (IdentifierStr == "def") return tok_def;
- if (IdentifierStr == "extern") return tok_extern;
- if (IdentifierStr == "if") return tok_if;
- if (IdentifierStr == "then") return tok_then;
- if (IdentifierStr == "else") return tok_else;
- if (IdentifierStr == "for") return tok_for;
- if (IdentifierStr == "in") return tok_in;
- if (IdentifierStr == "binary") return tok_binary;
- if (IdentifierStr == "unary") return tok_unary;
- return tok_identifier;
- }
-
- if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
- std::string NumStr;
- do {
- NumStr += LastChar;
- LastChar = getchar();
- } while (isdigit(LastChar) || LastChar == '.');
-
- NumVal = strtod(NumStr.c_str(), 0);
- return tok_number;
- }
-
- if (LastChar == '#') {
- // Comment until end of line.
- do LastChar = getchar();
- while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
-
- if (LastChar != EOF)
- return gettok();
- }
-
- // Check for end of file. Don't eat the EOF.
- if (LastChar == EOF)
- return tok_eof;
-
- // Otherwise, just return the character as its ascii value.
- int ThisChar = LastChar;
- LastChar = getchar();
- return ThisChar;
-}
-
-//===----------------------------------------------------------------------===//
-// Abstract Syntax Tree (aka Parse Tree)
-//===----------------------------------------------------------------------===//
-
-/// ExprAST - Base class for all expression nodes.
-class ExprAST {
-public:
- virtual ~ExprAST() {}
- virtual Value *Codegen() = 0;
-};
-
-/// NumberExprAST - Expression class for numeric literals like "1.0".
-class NumberExprAST : public ExprAST {
- double Val;
-public:
- NumberExprAST(double val) : Val(val) {}
- virtual Value *Codegen();
-};
-
-/// VariableExprAST - Expression class for referencing a variable, like "a".
-class VariableExprAST : public ExprAST {
- std::string Name;
-public:
- VariableExprAST(const std::string &name) : Name(name) {}
- virtual Value *Codegen();
-};
-
-/// UnaryExprAST - Expression class for a unary operator.
-class UnaryExprAST : public ExprAST {
- char Opcode;
- ExprAST *Operand;
-public:
- UnaryExprAST(char opcode, ExprAST *operand)
- : Opcode(opcode), Operand(operand) {}
- virtual Value *Codegen();
-};
-
-/// BinaryExprAST - Expression class for a binary operator.
-class BinaryExprAST : public ExprAST {
- char Op;
- ExprAST *LHS, *RHS;
-public:
- BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
- : Op(op), LHS(lhs), RHS(rhs) {}
- virtual Value *Codegen();
-};
-
-/// CallExprAST - Expression class for function calls.
-class CallExprAST : public ExprAST {
- std::string Callee;
- std::vector<ExprAST*> Args;
-public:
- CallExprAST(const std::string &callee, std::vector<ExprAST*> &args)
- : Callee(callee), Args(args) {}
- virtual Value *Codegen();
-};
-
-/// IfExprAST - Expression class for if/then/else.
-class IfExprAST : public ExprAST {
- ExprAST *Cond, *Then, *Else;
-public:
- IfExprAST(ExprAST *cond, ExprAST *then, ExprAST *_else)
- : Cond(cond), Then(then), Else(_else) {}
- virtual Value *Codegen();
-};
-
-/// ForExprAST - Expression class for for/in.
-class ForExprAST : public ExprAST {
- std::string VarName;
- ExprAST *Start, *End, *Step, *Body;
-public:
- ForExprAST(const std::string &varname, ExprAST *start, ExprAST *end,
- ExprAST *step, ExprAST *body)
- : VarName(varname), Start(start), End(end), Step(step), Body(body) {}
- virtual Value *Codegen();
-};
-
-/// PrototypeAST - This class represents the "prototype" for a function,
-/// which captures its name, and its argument names (thus implicitly the number
-/// of arguments the function takes), as well as if it is an operator.
-class PrototypeAST {
- std::string Name;
- std::vector<std::string> Args;
- bool isOperator;
- unsigned Precedence; // Precedence if a binary op.
-public:
- PrototypeAST(const std::string &name, const std::vector<std::string> &args,
- bool isoperator = false, unsigned prec = 0)
- : Name(name), Args(args), isOperator(isoperator), Precedence(prec) {}
-
- bool isUnaryOp() const { return isOperator && Args.size() == 1; }
- bool isBinaryOp() const { return isOperator && Args.size() == 2; }
-
- char getOperatorName() const {
- assert(isUnaryOp() || isBinaryOp());
- return Name[Name.size()-1];
- }
-
- unsigned getBinaryPrecedence() const { return Precedence; }
-
- Function *Codegen();
-};
-
-/// FunctionAST - This class represents a function definition itself.
-class FunctionAST {
- PrototypeAST *Proto;
- ExprAST *Body;
-public:
- FunctionAST(PrototypeAST *proto, ExprAST *body)
- : Proto(proto), Body(body) {}
-
- Function *Codegen();
-};
-
-//===----------------------------------------------------------------------===//
-// Parser
-//===----------------------------------------------------------------------===//
-
-/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
-/// token the parser is looking at. getNextToken reads another token from the
-/// lexer and updates CurTok with its results.
-static int CurTok;
-static int getNextToken() {
- return CurTok = gettok();
-}
-
-/// BinopPrecedence - This holds the precedence for each binary operator that is
-/// defined.
-static std::map<char, int> BinopPrecedence;
-
-/// GetTokPrecedence - Get the precedence of the pending binary operator token.
-static int GetTokPrecedence() {
- if (!isascii(CurTok))
- return -1;
-
- // Make sure it's a declared binop.
- int TokPrec = BinopPrecedence[CurTok];
- if (TokPrec <= 0) return -1;
- return TokPrec;
-}
-
-/// Error* - These are little helper functions for error handling.
-ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
-PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
-FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
-
-static ExprAST *ParseExpression();
-
-/// identifierexpr
-/// ::= identifier
-/// ::= identifier '(' expression* ')'
-static ExprAST *ParseIdentifierExpr() {
- std::string IdName = IdentifierStr;
-
- getNextToken(); // eat identifier.
-
- if (CurTok != '(') // Simple variable ref.
- return new VariableExprAST(IdName);
-
- // Call.
- getNextToken(); // eat (
- std::vector<ExprAST*> Args;
- if (CurTok != ')') {
- while (1) {
- ExprAST *Arg = ParseExpression();
- if (!Arg) return 0;
- Args.push_back(Arg);
-
- if (CurTok == ')') break;
-
- if (CurTok != ',')
- return Error("Expected ')' or ',' in argument list");
- getNextToken();
- }
- }
-
- // Eat the ')'.
- getNextToken();
-
- return new CallExprAST(IdName, Args);
-}
-
-/// numberexpr ::= number
-static ExprAST *ParseNumberExpr() {
- ExprAST *Result = new NumberExprAST(NumVal);
- getNextToken(); // consume the number
- return Result;
-}
-
-/// parenexpr ::= '(' expression ')'
-static ExprAST *ParseParenExpr() {
- getNextToken(); // eat (.
- ExprAST *V = ParseExpression();
- if (!V) return 0;
-
- if (CurTok != ')')
- return Error("expected ')'");
- getNextToken(); // eat ).
- return V;
-}
-
-/// ifexpr ::= 'if' expression 'then' expression 'else' expression
-static ExprAST *ParseIfExpr() {
- getNextToken(); // eat the if.
-
- // condition.
- ExprAST *Cond = ParseExpression();
- if (!Cond) return 0;
-
- if (CurTok != tok_then)
- return Error("expected then");
- getNextToken(); // eat the then
-
- ExprAST *Then = ParseExpression();
- if (Then == 0) return 0;
-
- if (CurTok != tok_else)
- return Error("expected else");
-
- getNextToken();
-
- ExprAST *Else = ParseExpression();
- if (!Else) return 0;
-
- return new IfExprAST(Cond, Then, Else);
-}
-
-/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
-static ExprAST *ParseForExpr() {
- getNextToken(); // eat the for.
-
- if (CurTok != tok_identifier)
- return Error("expected identifier after for");
-
- std::string IdName = IdentifierStr;
- getNextToken(); // eat identifier.
-
- if (CurTok != '=')
- return Error("expected '=' after for");
- getNextToken(); // eat '='.
-
-
- ExprAST *Start = ParseExpression();
- if (Start == 0) return 0;
- if (CurTok != ',')
- return Error("expected ',' after for start value");
- getNextToken();
-
- ExprAST *End = ParseExpression();
- if (End == 0) return 0;
-
- // The step value is optional.
- ExprAST *Step = 0;
- if (CurTok == ',') {
- getNextToken();
- Step = ParseExpression();
- if (Step == 0) return 0;
- }
-
- if (CurTok != tok_in)
- return Error("expected 'in' after for");
- getNextToken(); // eat 'in'.
-
- ExprAST *Body = ParseExpression();
- if (Body == 0) return 0;
-
- return new ForExprAST(IdName, Start, End, Step, Body);
-}
-
-/// primary
-/// ::= identifierexpr
-/// ::= numberexpr
-/// ::= parenexpr
-/// ::= ifexpr
-/// ::= forexpr
-static ExprAST *ParsePrimary() {
- switch (CurTok) {
- default: return Error("unknown token when expecting an expression");
- case tok_identifier: return ParseIdentifierExpr();
- case tok_number: return ParseNumberExpr();
- case '(': return ParseParenExpr();
- case tok_if: return ParseIfExpr();
- case tok_for: return ParseForExpr();
- }
-}
-
-/// unary
-/// ::= primary
-/// ::= '!' unary
-static ExprAST *ParseUnary() {
- // If the current token is not an operator, it must be a primary expr.
- if (!isascii(CurTok) || CurTok == '(' || CurTok == ',')
- return ParsePrimary();
-
- // If this is a unary operator, read it.
- int Opc = CurTok;
- getNextToken();
- if (ExprAST *Operand = ParseUnary())
- return new UnaryExprAST(Opc, Operand);
- return 0;
-}
-
-/// binoprhs
-/// ::= ('+' unary)*
-static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
- // If this is a binop, find its precedence.
- while (1) {
- int TokPrec = GetTokPrecedence();
-
- // If this is a binop that binds at least as tightly as the current binop,
- // consume it, otherwise we are done.
- if (TokPrec < ExprPrec)
- return LHS;
-
- // Okay, we know this is a binop.
- int BinOp = CurTok;
- getNextToken(); // eat binop
-
- // Parse the unary expression after the binary operator.
- ExprAST *RHS = ParseUnary();
- if (!RHS) return 0;
-
- // If BinOp binds less tightly with RHS than the operator after RHS, let
- // the pending operator take RHS as its LHS.
- int NextPrec = GetTokPrecedence();
- if (TokPrec < NextPrec) {
- RHS = ParseBinOpRHS(TokPrec+1, RHS);
- if (RHS == 0) return 0;
- }
-
- // Merge LHS/RHS.
- LHS = new BinaryExprAST(BinOp, LHS, RHS);
- }
-}
-
-/// expression
-/// ::= unary binoprhs
-///
-static ExprAST *ParseExpression() {
- ExprAST *LHS = ParseUnary();
- if (!LHS) return 0;
-
- return ParseBinOpRHS(0, LHS);
-}
-
-/// prototype
-/// ::= id '(' id* ')'
-/// ::= binary LETTER number? (id, id)
-/// ::= unary LETTER (id)
-static PrototypeAST *ParsePrototype() {
- std::string FnName;
-
- unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
- unsigned BinaryPrecedence = 30;
-
- switch (CurTok) {
- default:
- return ErrorP("Expected function name in prototype");
- case tok_identifier:
- FnName = IdentifierStr;
- Kind = 0;
- getNextToken();
- break;
- case tok_unary:
- getNextToken();
- if (!isascii(CurTok))
- return ErrorP("Expected unary operator");
- FnName = "unary";
- FnName += (char)CurTok;
- Kind = 1;
- getNextToken();
- break;
- case tok_binary:
- getNextToken();
- if (!isascii(CurTok))
- return ErrorP("Expected binary operator");
- FnName = "binary";
- FnName += (char)CurTok;
- Kind = 2;
- getNextToken();
-
- // Read the precedence if present.
- if (CurTok == tok_number) {
- if (NumVal < 1 || NumVal > 100)
- return ErrorP("Invalid precedecnce: must be 1..100");
- BinaryPrecedence = (unsigned)NumVal;
- getNextToken();
- }
- break;
- }
-
- if (CurTok != '(')
- return ErrorP("Expected '(' in prototype");
-
- std::vector<std::string> ArgNames;
- while (getNextToken() == tok_identifier)
- ArgNames.push_back(IdentifierStr);
- if (CurTok != ')')
- return ErrorP("Expected ')' in prototype");
-
- // success.
- getNextToken(); // eat ')'.
-
- // Verify right number of names for operator.
- if (Kind && ArgNames.size() != Kind)
- return ErrorP("Invalid number of operands for operator");
-
- return new PrototypeAST(FnName, ArgNames, Kind != 0, BinaryPrecedence);
-}
-
-/// definition ::= 'def' prototype expression
-static FunctionAST *ParseDefinition() {
- getNextToken(); // eat def.
- PrototypeAST *Proto = ParsePrototype();
- if (Proto == 0) return 0;
-
- if (ExprAST *E = ParseExpression())
- return new FunctionAST(Proto, E);
- return 0;
-}
-
-/// toplevelexpr ::= expression
-static FunctionAST *ParseTopLevelExpr() {
- if (ExprAST *E = ParseExpression()) {
- // Make an anonymous proto.
- PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>());
- return new FunctionAST(Proto, E);
- }
- return 0;
-}
-
-/// external ::= 'extern' prototype
-static PrototypeAST *ParseExtern() {
- getNextToken(); // eat extern.
- return ParsePrototype();
-}
-
-//===----------------------------------------------------------------------===//
-// Code Generation
-//===----------------------------------------------------------------------===//
-
-static Module *TheModule;
-static IRBuilder<> Builder(getGlobalContext());
-static std::map<std::string, Value*> NamedValues;
-static FunctionPassManager *TheFPM;
-
-Value *ErrorV(const char *Str) { Error(Str); return 0; }
-
-Value *NumberExprAST::Codegen() {
- return ConstantFP::get(getGlobalContext(), APFloat(Val));
-}
-
-Value *VariableExprAST::Codegen() {
- // Look this variable up in the function.
- Value *V = NamedValues[Name];
- return V ? V : ErrorV("Unknown variable name");
-}
-
-Value *UnaryExprAST::Codegen() {
- Value *OperandV = Operand->Codegen();
- if (OperandV == 0) return 0;
-
- Function *F = TheModule->getFunction(std::string("unary")+Opcode);
- if (F == 0)
- return ErrorV("Unknown unary operator");
-
- return Builder.CreateCall(F, OperandV, "unop");
-}
-
-Value *BinaryExprAST::Codegen() {
- Value *L = LHS->Codegen();
- Value *R = RHS->Codegen();
- if (L == 0 || R == 0) return 0;
-
- switch (Op) {
- case '+': return Builder.CreateAdd(L, R, "addtmp");
- case '-': return Builder.CreateSub(L, R, "subtmp");
- case '*': return Builder.CreateMul(L, R, "multmp");
- case '<':
- L = Builder.CreateFCmpULT(L, R, "cmptmp");
- // Convert bool 0/1 to double 0.0 or 1.0
- return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
- "booltmp");
- default: break;
- }
-
- // If it wasn't a builtin binary operator, it must be a user defined one. Emit
- // a call to it.
- Function *F = TheModule->getFunction(std::string("binary")+Op);
- assert(F && "binary operator not found!");
-
- Value *Ops[] = { L, R };
- return Builder.CreateCall(F, Ops, Ops+2, "binop");
-}
-
-Value *CallExprAST::Codegen() {
- // Look up the name in the global module table.
- Function *CalleeF = TheModule->getFunction(Callee);
- if (CalleeF == 0)
- return ErrorV("Unknown function referenced");
-
- // If argument mismatch error.
- if (CalleeF->arg_size() != Args.size())
- return ErrorV("Incorrect # arguments passed");
-
- std::vector<Value*> ArgsV;
- for (unsigned i = 0, e = Args.size(); i != e; ++i) {
- ArgsV.push_back(Args[i]->Codegen());
- if (ArgsV.back() == 0) return 0;
- }
-
- return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
-}
-
-Value *IfExprAST::Codegen() {
- Value *CondV = Cond->Codegen();
- if (CondV == 0) return 0;
-
- // Convert condition to a bool by comparing equal to 0.0.
- CondV = Builder.CreateFCmpONE(CondV,
- ConstantFP::get(getGlobalContext(), APFloat(0.0)),
- "ifcond");
-
- Function *TheFunction = Builder.GetInsertBlock()->getParent();
-
- // Create blocks for the then and else cases. Insert the 'then' block at the
- // end of the function.
- BasicBlock *ThenBB = BasicBlock::Create(getGlobalContext(), "then", TheFunction);
- BasicBlock *ElseBB = BasicBlock::Create(getGlobalContext(), "else");
- BasicBlock *MergeBB = BasicBlock::Create(getGlobalContext(), "ifcont");
-
- Builder.CreateCondBr(CondV, ThenBB, ElseBB);
-
- // Emit then value.
- Builder.SetInsertPoint(ThenBB);
-
- Value *ThenV = Then->Codegen();
- if (ThenV == 0) return 0;
-
- Builder.CreateBr(MergeBB);
- // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
- ThenBB = Builder.GetInsertBlock();
-
- // Emit else block.
- TheFunction->getBasicBlockList().push_back(ElseBB);
- Builder.SetInsertPoint(ElseBB);
-
- Value *ElseV = Else->Codegen();
- if (ElseV == 0) return 0;
-
- Builder.CreateBr(MergeBB);
- // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
- ElseBB = Builder.GetInsertBlock();
-
- // Emit merge block.
- TheFunction->getBasicBlockList().push_back(MergeBB);
- Builder.SetInsertPoint(MergeBB);
- PHINode *PN = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()),
- "iftmp");
-
- PN->addIncoming(ThenV, ThenBB);
- PN->addIncoming(ElseV, ElseBB);
- return PN;
-}
-
-Value *ForExprAST::Codegen() {
- // Output this as:
- // ...
- // start = startexpr
- // goto loop
- // loop:
- // variable = phi [start, loopheader], [nextvariable, loopend]
- // ...
- // bodyexpr
- // ...
- // loopend:
- // step = stepexpr
- // nextvariable = variable + step
- // endcond = endexpr
- // br endcond, loop, endloop
- // outloop:
-
- // Emit the start code first, without 'variable' in scope.
- Value *StartVal = Start->Codegen();
- if (StartVal == 0) return 0;
-
- // Make the new basic block for the loop header, inserting after current
- // block.
- Function *TheFunction = Builder.GetInsertBlock()->getParent();
- BasicBlock *PreheaderBB = Builder.GetInsertBlock();
- BasicBlock *LoopBB = BasicBlock::Create(getGlobalContext(), "loop", TheFunction);
-
- // Insert an explicit fall through from the current block to the LoopBB.
- Builder.CreateBr(LoopBB);
-
- // Start insertion in LoopBB.
- Builder.SetInsertPoint(LoopBB);
-
- // Start the PHI node with an entry for Start.
- PHINode *Variable = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()), VarName.c_str());
- Variable->addIncoming(StartVal, PreheaderBB);
-
- // Within the loop, the variable is defined equal to the PHI node. If it
- // shadows an existing variable, we have to restore it, so save it now.
- Value *OldVal = NamedValues[VarName];
- NamedValues[VarName] = Variable;
-
- // Emit the body of the loop. This, like any other expr, can change the
- // current BB. Note that we ignore the value computed by the body, but don't
- // allow an error.
- if (Body->Codegen() == 0)
- return 0;
-
- // Emit the step value.
- Value *StepVal;
- if (Step) {
- StepVal = Step->Codegen();
- if (StepVal == 0) return 0;
- } else {
- // If not specified, use 1.0.
- StepVal = ConstantFP::get(getGlobalContext(), APFloat(1.0));
- }
-
- Value *NextVar = Builder.CreateAdd(Variable, StepVal, "nextvar");
-
- // Compute the end condition.
- Value *EndCond = End->Codegen();
- if (EndCond == 0) return EndCond;
-
- // Convert condition to a bool by comparing equal to 0.0.
- EndCond = Builder.CreateFCmpONE(EndCond,
- ConstantFP::get(getGlobalContext(), APFloat(0.0)),
- "loopcond");
-
- // Create the "after loop" block and insert it.
- BasicBlock *LoopEndBB = Builder.GetInsertBlock();
- BasicBlock *AfterBB = BasicBlock::Create(getGlobalContext(), "afterloop", TheFunction);
-
- // Insert the conditional branch into the end of LoopEndBB.
- Builder.CreateCondBr(EndCond, LoopBB, AfterBB);
-
- // Any new code will be inserted in AfterBB.
- Builder.SetInsertPoint(AfterBB);
-
- // Add a new entry to the PHI node for the backedge.
- Variable->addIncoming(NextVar, LoopEndBB);
-
- // Restore the unshadowed variable.
- if (OldVal)
- NamedValues[VarName] = OldVal;
- else
- NamedValues.erase(VarName);
-
-
- // for expr always returns 0.0.
- return Constant::getNullValue(Type::getDoubleTy(getGlobalContext()));
-}
-
-Function *PrototypeAST::Codegen() {
- // Make the function type: double(double,double) etc.
- std::vector<const Type*> Doubles(Args.size(),
- Type::getDoubleTy(getGlobalContext()));
- FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
- Doubles, false);
-
- Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
-
- // If F conflicted, there was already something named 'Name'. If it has a
- // body, don't allow redefinition or reextern.
- if (F->getName() != Name) {
- // Delete the one we just made and get the existing one.
- F->eraseFromParent();
- F = TheModule->getFunction(Name);
-
- // If F already has a body, reject this.
- if (!F->empty()) {
- ErrorF("redefinition of function");
- return 0;
- }
-
- // If F took a different number of args, reject.
- if (F->arg_size() != Args.size()) {
- ErrorF("redefinition of function with different # args");
- return 0;
- }
- }
-
- // Set names for all arguments.
- unsigned Idx = 0;
- for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size();
- ++AI, ++Idx) {
- AI->setName(Args[Idx]);
-
- // Add arguments to variable symbol table.
- NamedValues[Args[Idx]] = AI;
- }
-
- return F;
-}
-
-Function *FunctionAST::Codegen() {
- NamedValues.clear();
-
- Function *TheFunction = Proto->Codegen();
- if (TheFunction == 0)
- return 0;
-
- // If this is an operator, install it.
- if (Proto->isBinaryOp())
- BinopPrecedence[Proto->getOperatorName()] = Proto->getBinaryPrecedence();
-
- // Create a new basic block to start insertion into.
- BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
- Builder.SetInsertPoint(BB);
-
- if (Value *RetVal = Body->Codegen()) {
- // Finish off the function.
- Builder.CreateRet(RetVal);
-
- // Validate the generated code, checking for consistency.
- verifyFunction(*TheFunction);
-
- // Optimize the function.
- TheFPM->run(*TheFunction);
-
- return TheFunction;
- }
-
- // Error reading body, remove function.
- TheFunction->eraseFromParent();
-
- if (Proto->isBinaryOp())
- BinopPrecedence.erase(Proto->getOperatorName());
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Top-Level parsing and JIT Driver
-//===----------------------------------------------------------------------===//
-
-static ExecutionEngine *TheExecutionEngine;
-
-static void HandleDefinition() {
- if (FunctionAST *F = ParseDefinition()) {
- if (Function *LF = F->Codegen()) {
- fprintf(stderr, "Read function definition:");
- LF->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleExtern() {
- if (PrototypeAST *P = ParseExtern()) {
- if (Function *F = P->Codegen()) {
- fprintf(stderr, "Read extern: ");
- F->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleTopLevelExpression() {
- // Evaluate a top-level expression into an anonymous function.
- if (FunctionAST *F = ParseTopLevelExpr()) {
- if (Function *LF = F->Codegen()) {
- // JIT the function, returning a function pointer.
- void *FPtr = TheExecutionEngine->getPointerToFunction(LF);
-
- // Cast it to the right type (takes no arguments, returns a double) so we
- // can call it as a native function.
- double (*FP)() = (double (*)())(intptr_t)FPtr;
- fprintf(stderr, "Evaluated to %f\n", FP());
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-/// top ::= definition | external | expression | ';'
-static void MainLoop() {
- while (1) {
- fprintf(stderr, "ready> ");
- switch (CurTok) {
- case tok_eof: return;
- case ';': getNextToken(); break; // ignore top-level semicolons.
- case tok_def: HandleDefinition(); break;
- case tok_extern: HandleExtern(); break;
- default: HandleTopLevelExpression(); break;
- }
- }
-}
-
-//===----------------------------------------------------------------------===//
-// "Library" functions that can be "extern'd" from user code.
-//===----------------------------------------------------------------------===//
-
-/// putchard - putchar that takes a double and returns 0.
-extern "C"
-double putchard(double X) {
- putchar((char)X);
- return 0;
-}
-
-/// printd - printf that takes a double prints it as "%f\n", returning 0.
-extern "C"
-double printd(double X) {
- printf("%f\n", X);
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Main driver code.
-//===----------------------------------------------------------------------===//
-
-int main() {
- InitializeNativeTarget();
- LLVMContext &Context = getGlobalContext();
-
- // Install standard binary operators.
- // 1 is lowest precedence.
- BinopPrecedence['<'] = 10;
- BinopPrecedence['+'] = 20;
- BinopPrecedence['-'] = 20;
- BinopPrecedence['*'] = 40; // highest.
-
- // Prime the first token.
- fprintf(stderr, "ready> ");
- getNextToken();
-
- // Make the module, which holds all the code.
- TheModule = new Module("my cool jit", Context);
-
- // Create the JIT. This takes ownership of the module.
- std::string ErrStr;
- TheExecutionEngine = EngineBuilder(TheModule).setErrorStr(&ErrStr).create();
- if (!TheExecutionEngine) {
- fprintf(stderr, "Could not create ExecutionEngine: %s\n", ErrStr.c_str());
- exit(1);
- }
-
- FunctionPassManager OurFPM(TheModule);
-
- // Set up the optimizer pipeline. Start with registering info about how the
- // target lays out data structures.
- OurFPM.add(new TargetData(*TheExecutionEngine->getTargetData()));
- // Do simple "peephole" optimizations and bit-twiddling optzns.
- OurFPM.add(createInstructionCombiningPass());
- // Reassociate expressions.
- OurFPM.add(createReassociatePass());
- // Eliminate Common SubExpressions.
- OurFPM.add(createGVNPass());
- // Simplify the control flow graph (deleting unreachable blocks, etc).
- OurFPM.add(createCFGSimplificationPass());
-
- OurFPM.doInitialization();
-
- // Set the global so the code gen can use this.
- TheFPM = &OurFPM;
-
- // Run the main "interpreter loop" now.
- MainLoop();
-
- TheFPM = 0;
-
- // Print out all of the generated code.
- TheModule->dump();
-
- return 0;
-}
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter7/CMakeLists.txt b/contrib/llvm/examples/Kaleidoscope/Chapter7/CMakeLists.txt
deleted file mode 100644
index 9b8227c..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter7/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-set(LLVM_LINK_COMPONENTS core jit interpreter native)
-
-add_llvm_example(Kaleidoscope-Ch7
- toy.cpp
- )
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter7/Makefile b/contrib/llvm/examples/Kaleidoscope/Chapter7/Makefile
deleted file mode 100644
index 6cec323..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter7/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-##===- examples/Kaleidoscope/Chapter7/Makefile -------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL = ../../..
-TOOLNAME = Kaleidoscope-Ch7
-EXAMPLE_TOOL = 1
-REQUIRES_RTTI := 1
-
-LINK_COMPONENTS := core jit native
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Kaleidoscope/Chapter7/toy.cpp b/contrib/llvm/examples/Kaleidoscope/Chapter7/toy.cpp
deleted file mode 100644
index 7dd9eae..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Chapter7/toy.cpp
+++ /dev/null
@@ -1,1139 +0,0 @@
-#include "llvm/DerivedTypes.h"
-#include "llvm/ExecutionEngine/ExecutionEngine.h"
-#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/PassManager.h"
-#include "llvm/Analysis/Verifier.h"
-#include "llvm/Target/TargetData.h"
-#include "llvm/Target/TargetSelect.h"
-#include "llvm/Transforms/Scalar.h"
-#include "llvm/Support/IRBuilder.h"
-#include <cstdio>
-#include <string>
-#include <map>
-#include <vector>
-using namespace llvm;
-
-//===----------------------------------------------------------------------===//
-// Lexer
-//===----------------------------------------------------------------------===//
-
-// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
-// of these for known things.
-enum Token {
- tok_eof = -1,
-
- // commands
- tok_def = -2, tok_extern = -3,
-
- // primary
- tok_identifier = -4, tok_number = -5,
-
- // control
- tok_if = -6, tok_then = -7, tok_else = -8,
- tok_for = -9, tok_in = -10,
-
- // operators
- tok_binary = -11, tok_unary = -12,
-
- // var definition
- tok_var = -13
-};
-
-static std::string IdentifierStr; // Filled in if tok_identifier
-static double NumVal; // Filled in if tok_number
-
-/// gettok - Return the next token from standard input.
-static int gettok() {
- static int LastChar = ' ';
-
- // Skip any whitespace.
- while (isspace(LastChar))
- LastChar = getchar();
-
- if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
- IdentifierStr = LastChar;
- while (isalnum((LastChar = getchar())))
- IdentifierStr += LastChar;
-
- if (IdentifierStr == "def") return tok_def;
- if (IdentifierStr == "extern") return tok_extern;
- if (IdentifierStr == "if") return tok_if;
- if (IdentifierStr == "then") return tok_then;
- if (IdentifierStr == "else") return tok_else;
- if (IdentifierStr == "for") return tok_for;
- if (IdentifierStr == "in") return tok_in;
- if (IdentifierStr == "binary") return tok_binary;
- if (IdentifierStr == "unary") return tok_unary;
- if (IdentifierStr == "var") return tok_var;
- return tok_identifier;
- }
-
- if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
- std::string NumStr;
- do {
- NumStr += LastChar;
- LastChar = getchar();
- } while (isdigit(LastChar) || LastChar == '.');
-
- NumVal = strtod(NumStr.c_str(), 0);
- return tok_number;
- }
-
- if (LastChar == '#') {
- // Comment until end of line.
- do LastChar = getchar();
- while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
-
- if (LastChar != EOF)
- return gettok();
- }
-
- // Check for end of file. Don't eat the EOF.
- if (LastChar == EOF)
- return tok_eof;
-
- // Otherwise, just return the character as its ascii value.
- int ThisChar = LastChar;
- LastChar = getchar();
- return ThisChar;
-}
-
-//===----------------------------------------------------------------------===//
-// Abstract Syntax Tree (aka Parse Tree)
-//===----------------------------------------------------------------------===//
-
-/// ExprAST - Base class for all expression nodes.
-class ExprAST {
-public:
- virtual ~ExprAST() {}
- virtual Value *Codegen() = 0;
-};
-
-/// NumberExprAST - Expression class for numeric literals like "1.0".
-class NumberExprAST : public ExprAST {
- double Val;
-public:
- NumberExprAST(double val) : Val(val) {}
- virtual Value *Codegen();
-};
-
-/// VariableExprAST - Expression class for referencing a variable, like "a".
-class VariableExprAST : public ExprAST {
- std::string Name;
-public:
- VariableExprAST(const std::string &name) : Name(name) {}
- const std::string &getName() const { return Name; }
- virtual Value *Codegen();
-};
-
-/// UnaryExprAST - Expression class for a unary operator.
-class UnaryExprAST : public ExprAST {
- char Opcode;
- ExprAST *Operand;
-public:
- UnaryExprAST(char opcode, ExprAST *operand)
- : Opcode(opcode), Operand(operand) {}
- virtual Value *Codegen();
-};
-
-/// BinaryExprAST - Expression class for a binary operator.
-class BinaryExprAST : public ExprAST {
- char Op;
- ExprAST *LHS, *RHS;
-public:
- BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
- : Op(op), LHS(lhs), RHS(rhs) {}
- virtual Value *Codegen();
-};
-
-/// CallExprAST - Expression class for function calls.
-class CallExprAST : public ExprAST {
- std::string Callee;
- std::vector<ExprAST*> Args;
-public:
- CallExprAST(const std::string &callee, std::vector<ExprAST*> &args)
- : Callee(callee), Args(args) {}
- virtual Value *Codegen();
-};
-
-/// IfExprAST - Expression class for if/then/else.
-class IfExprAST : public ExprAST {
- ExprAST *Cond, *Then, *Else;
-public:
- IfExprAST(ExprAST *cond, ExprAST *then, ExprAST *_else)
- : Cond(cond), Then(then), Else(_else) {}
- virtual Value *Codegen();
-};
-
-/// ForExprAST - Expression class for for/in.
-class ForExprAST : public ExprAST {
- std::string VarName;
- ExprAST *Start, *End, *Step, *Body;
-public:
- ForExprAST(const std::string &varname, ExprAST *start, ExprAST *end,
- ExprAST *step, ExprAST *body)
- : VarName(varname), Start(start), End(end), Step(step), Body(body) {}
- virtual Value *Codegen();
-};
-
-/// VarExprAST - Expression class for var/in
-class VarExprAST : public ExprAST {
- std::vector<std::pair<std::string, ExprAST*> > VarNames;
- ExprAST *Body;
-public:
- VarExprAST(const std::vector<std::pair<std::string, ExprAST*> > &varnames,
- ExprAST *body)
- : VarNames(varnames), Body(body) {}
-
- virtual Value *Codegen();
-};
-
-/// PrototypeAST - This class represents the "prototype" for a function,
-/// which captures its argument names as well as if it is an operator.
-class PrototypeAST {
- std::string Name;
- std::vector<std::string> Args;
- bool isOperator;
- unsigned Precedence; // Precedence if a binary op.
-public:
- PrototypeAST(const std::string &name, const std::vector<std::string> &args,
- bool isoperator = false, unsigned prec = 0)
- : Name(name), Args(args), isOperator(isoperator), Precedence(prec) {}
-
- bool isUnaryOp() const { return isOperator && Args.size() == 1; }
- bool isBinaryOp() const { return isOperator && Args.size() == 2; }
-
- char getOperatorName() const {
- assert(isUnaryOp() || isBinaryOp());
- return Name[Name.size()-1];
- }
-
- unsigned getBinaryPrecedence() const { return Precedence; }
-
- Function *Codegen();
-
- void CreateArgumentAllocas(Function *F);
-};
-
-/// FunctionAST - This class represents a function definition itself.
-class FunctionAST {
- PrototypeAST *Proto;
- ExprAST *Body;
-public:
- FunctionAST(PrototypeAST *proto, ExprAST *body)
- : Proto(proto), Body(body) {}
-
- Function *Codegen();
-};
-
-//===----------------------------------------------------------------------===//
-// Parser
-//===----------------------------------------------------------------------===//
-
-/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
-/// token the parser is looking at. getNextToken reads another token from the
-/// lexer and updates CurTok with its results.
-static int CurTok;
-static int getNextToken() {
- return CurTok = gettok();
-}
-
-/// BinopPrecedence - This holds the precedence for each binary operator that is
-/// defined.
-static std::map<char, int> BinopPrecedence;
-
-/// GetTokPrecedence - Get the precedence of the pending binary operator token.
-static int GetTokPrecedence() {
- if (!isascii(CurTok))
- return -1;
-
- // Make sure it's a declared binop.
- int TokPrec = BinopPrecedence[CurTok];
- if (TokPrec <= 0) return -1;
- return TokPrec;
-}
-
-/// Error* - These are little helper functions for error handling.
-ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
-PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
-FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
-
-static ExprAST *ParseExpression();
-
-/// identifierexpr
-/// ::= identifier
-/// ::= identifier '(' expression* ')'
-static ExprAST *ParseIdentifierExpr() {
- std::string IdName = IdentifierStr;
-
- getNextToken(); // eat identifier.
-
- if (CurTok != '(') // Simple variable ref.
- return new VariableExprAST(IdName);
-
- // Call.
- getNextToken(); // eat (
- std::vector<ExprAST*> Args;
- if (CurTok != ')') {
- while (1) {
- ExprAST *Arg = ParseExpression();
- if (!Arg) return 0;
- Args.push_back(Arg);
-
- if (CurTok == ')') break;
-
- if (CurTok != ',')
- return Error("Expected ')' or ',' in argument list");
- getNextToken();
- }
- }
-
- // Eat the ')'.
- getNextToken();
-
- return new CallExprAST(IdName, Args);
-}
-
-/// numberexpr ::= number
-static ExprAST *ParseNumberExpr() {
- ExprAST *Result = new NumberExprAST(NumVal);
- getNextToken(); // consume the number
- return Result;
-}
-
-/// parenexpr ::= '(' expression ')'
-static ExprAST *ParseParenExpr() {
- getNextToken(); // eat (.
- ExprAST *V = ParseExpression();
- if (!V) return 0;
-
- if (CurTok != ')')
- return Error("expected ')'");
- getNextToken(); // eat ).
- return V;
-}
-
-/// ifexpr ::= 'if' expression 'then' expression 'else' expression
-static ExprAST *ParseIfExpr() {
- getNextToken(); // eat the if.
-
- // condition.
- ExprAST *Cond = ParseExpression();
- if (!Cond) return 0;
-
- if (CurTok != tok_then)
- return Error("expected then");
- getNextToken(); // eat the then
-
- ExprAST *Then = ParseExpression();
- if (Then == 0) return 0;
-
- if (CurTok != tok_else)
- return Error("expected else");
-
- getNextToken();
-
- ExprAST *Else = ParseExpression();
- if (!Else) return 0;
-
- return new IfExprAST(Cond, Then, Else);
-}
-
-/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
-static ExprAST *ParseForExpr() {
- getNextToken(); // eat the for.
-
- if (CurTok != tok_identifier)
- return Error("expected identifier after for");
-
- std::string IdName = IdentifierStr;
- getNextToken(); // eat identifier.
-
- if (CurTok != '=')
- return Error("expected '=' after for");
- getNextToken(); // eat '='.
-
-
- ExprAST *Start = ParseExpression();
- if (Start == 0) return 0;
- if (CurTok != ',')
- return Error("expected ',' after for start value");
- getNextToken();
-
- ExprAST *End = ParseExpression();
- if (End == 0) return 0;
-
- // The step value is optional.
- ExprAST *Step = 0;
- if (CurTok == ',') {
- getNextToken();
- Step = ParseExpression();
- if (Step == 0) return 0;
- }
-
- if (CurTok != tok_in)
- return Error("expected 'in' after for");
- getNextToken(); // eat 'in'.
-
- ExprAST *Body = ParseExpression();
- if (Body == 0) return 0;
-
- return new ForExprAST(IdName, Start, End, Step, Body);
-}
-
-/// varexpr ::= 'var' identifier ('=' expression)?
-// (',' identifier ('=' expression)?)* 'in' expression
-static ExprAST *ParseVarExpr() {
- getNextToken(); // eat the var.
-
- std::vector<std::pair<std::string, ExprAST*> > VarNames;
-
- // At least one variable name is required.
- if (CurTok != tok_identifier)
- return Error("expected identifier after var");
-
- while (1) {
- std::string Name = IdentifierStr;
- getNextToken(); // eat identifier.
-
- // Read the optional initializer.
- ExprAST *Init = 0;
- if (CurTok == '=') {
- getNextToken(); // eat the '='.
-
- Init = ParseExpression();
- if (Init == 0) return 0;
- }
-
- VarNames.push_back(std::make_pair(Name, Init));
-
- // End of var list, exit loop.
- if (CurTok != ',') break;
- getNextToken(); // eat the ','.
-
- if (CurTok != tok_identifier)
- return Error("expected identifier list after var");
- }
-
- // At this point, we have to have 'in'.
- if (CurTok != tok_in)
- return Error("expected 'in' keyword after 'var'");
- getNextToken(); // eat 'in'.
-
- ExprAST *Body = ParseExpression();
- if (Body == 0) return 0;
-
- return new VarExprAST(VarNames, Body);
-}
-
-/// primary
-/// ::= identifierexpr
-/// ::= numberexpr
-/// ::= parenexpr
-/// ::= ifexpr
-/// ::= forexpr
-/// ::= varexpr
-static ExprAST *ParsePrimary() {
- switch (CurTok) {
- default: return Error("unknown token when expecting an expression");
- case tok_identifier: return ParseIdentifierExpr();
- case tok_number: return ParseNumberExpr();
- case '(': return ParseParenExpr();
- case tok_if: return ParseIfExpr();
- case tok_for: return ParseForExpr();
- case tok_var: return ParseVarExpr();
- }
-}
-
-/// unary
-/// ::= primary
-/// ::= '!' unary
-static ExprAST *ParseUnary() {
- // If the current token is not an operator, it must be a primary expr.
- if (!isascii(CurTok) || CurTok == '(' || CurTok == ',')
- return ParsePrimary();
-
- // If this is a unary operator, read it.
- int Opc = CurTok;
- getNextToken();
- if (ExprAST *Operand = ParseUnary())
- return new UnaryExprAST(Opc, Operand);
- return 0;
-}
-
-/// binoprhs
-/// ::= ('+' unary)*
-static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
- // If this is a binop, find its precedence.
- while (1) {
- int TokPrec = GetTokPrecedence();
-
- // If this is a binop that binds at least as tightly as the current binop,
- // consume it, otherwise we are done.
- if (TokPrec < ExprPrec)
- return LHS;
-
- // Okay, we know this is a binop.
- int BinOp = CurTok;
- getNextToken(); // eat binop
-
- // Parse the unary expression after the binary operator.
- ExprAST *RHS = ParseUnary();
- if (!RHS) return 0;
-
- // If BinOp binds less tightly with RHS than the operator after RHS, let
- // the pending operator take RHS as its LHS.
- int NextPrec = GetTokPrecedence();
- if (TokPrec < NextPrec) {
- RHS = ParseBinOpRHS(TokPrec+1, RHS);
- if (RHS == 0) return 0;
- }
-
- // Merge LHS/RHS.
- LHS = new BinaryExprAST(BinOp, LHS, RHS);
- }
-}
-
-/// expression
-/// ::= unary binoprhs
-///
-static ExprAST *ParseExpression() {
- ExprAST *LHS = ParseUnary();
- if (!LHS) return 0;
-
- return ParseBinOpRHS(0, LHS);
-}
-
-/// prototype
-/// ::= id '(' id* ')'
-/// ::= binary LETTER number? (id, id)
-/// ::= unary LETTER (id)
-static PrototypeAST *ParsePrototype() {
- std::string FnName;
-
- unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
- unsigned BinaryPrecedence = 30;
-
- switch (CurTok) {
- default:
- return ErrorP("Expected function name in prototype");
- case tok_identifier:
- FnName = IdentifierStr;
- Kind = 0;
- getNextToken();
- break;
- case tok_unary:
- getNextToken();
- if (!isascii(CurTok))
- return ErrorP("Expected unary operator");
- FnName = "unary";
- FnName += (char)CurTok;
- Kind = 1;
- getNextToken();
- break;
- case tok_binary:
- getNextToken();
- if (!isascii(CurTok))
- return ErrorP("Expected binary operator");
- FnName = "binary";
- FnName += (char)CurTok;
- Kind = 2;
- getNextToken();
-
- // Read the precedence if present.
- if (CurTok == tok_number) {
- if (NumVal < 1 || NumVal > 100)
- return ErrorP("Invalid precedecnce: must be 1..100");
- BinaryPrecedence = (unsigned)NumVal;
- getNextToken();
- }
- break;
- }
-
- if (CurTok != '(')
- return ErrorP("Expected '(' in prototype");
-
- std::vector<std::string> ArgNames;
- while (getNextToken() == tok_identifier)
- ArgNames.push_back(IdentifierStr);
- if (CurTok != ')')
- return ErrorP("Expected ')' in prototype");
-
- // success.
- getNextToken(); // eat ')'.
-
- // Verify right number of names for operator.
- if (Kind && ArgNames.size() != Kind)
- return ErrorP("Invalid number of operands for operator");
-
- return new PrototypeAST(FnName, ArgNames, Kind != 0, BinaryPrecedence);
-}
-
-/// definition ::= 'def' prototype expression
-static FunctionAST *ParseDefinition() {
- getNextToken(); // eat def.
- PrototypeAST *Proto = ParsePrototype();
- if (Proto == 0) return 0;
-
- if (ExprAST *E = ParseExpression())
- return new FunctionAST(Proto, E);
- return 0;
-}
-
-/// toplevelexpr ::= expression
-static FunctionAST *ParseTopLevelExpr() {
- if (ExprAST *E = ParseExpression()) {
- // Make an anonymous proto.
- PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>());
- return new FunctionAST(Proto, E);
- }
- return 0;
-}
-
-/// external ::= 'extern' prototype
-static PrototypeAST *ParseExtern() {
- getNextToken(); // eat extern.
- return ParsePrototype();
-}
-
-//===----------------------------------------------------------------------===//
-// Code Generation
-//===----------------------------------------------------------------------===//
-
-static Module *TheModule;
-static IRBuilder<> Builder(getGlobalContext());
-static std::map<std::string, AllocaInst*> NamedValues;
-static FunctionPassManager *TheFPM;
-
-Value *ErrorV(const char *Str) { Error(Str); return 0; }
-
-/// CreateEntryBlockAlloca - Create an alloca instruction in the entry block of
-/// the function. This is used for mutable variables etc.
-static AllocaInst *CreateEntryBlockAlloca(Function *TheFunction,
- const std::string &VarName) {
- IRBuilder<> TmpB(&TheFunction->getEntryBlock(),
- TheFunction->getEntryBlock().begin());
- return TmpB.CreateAlloca(Type::getDoubleTy(getGlobalContext()), 0,
- VarName.c_str());
-}
-
-Value *NumberExprAST::Codegen() {
- return ConstantFP::get(getGlobalContext(), APFloat(Val));
-}
-
-Value *VariableExprAST::Codegen() {
- // Look this variable up in the function.
- Value *V = NamedValues[Name];
- if (V == 0) return ErrorV("Unknown variable name");
-
- // Load the value.
- return Builder.CreateLoad(V, Name.c_str());
-}
-
-Value *UnaryExprAST::Codegen() {
- Value *OperandV = Operand->Codegen();
- if (OperandV == 0) return 0;
-
- Function *F = TheModule->getFunction(std::string("unary")+Opcode);
- if (F == 0)
- return ErrorV("Unknown unary operator");
-
- return Builder.CreateCall(F, OperandV, "unop");
-}
-
-Value *BinaryExprAST::Codegen() {
- // Special case '=' because we don't want to emit the LHS as an expression.
- if (Op == '=') {
- // Assignment requires the LHS to be an identifier.
- VariableExprAST *LHSE = dynamic_cast<VariableExprAST*>(LHS);
- if (!LHSE)
- return ErrorV("destination of '=' must be a variable");
- // Codegen the RHS.
- Value *Val = RHS->Codegen();
- if (Val == 0) return 0;
-
- // Look up the name.
- Value *Variable = NamedValues[LHSE->getName()];
- if (Variable == 0) return ErrorV("Unknown variable name");
-
- Builder.CreateStore(Val, Variable);
- return Val;
- }
-
- Value *L = LHS->Codegen();
- Value *R = RHS->Codegen();
- if (L == 0 || R == 0) return 0;
-
- switch (Op) {
- case '+': return Builder.CreateAdd(L, R, "addtmp");
- case '-': return Builder.CreateSub(L, R, "subtmp");
- case '*': return Builder.CreateMul(L, R, "multmp");
- case '<':
- L = Builder.CreateFCmpULT(L, R, "cmptmp");
- // Convert bool 0/1 to double 0.0 or 1.0
- return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
- "booltmp");
- default: break;
- }
-
- // If it wasn't a builtin binary operator, it must be a user defined one. Emit
- // a call to it.
- Function *F = TheModule->getFunction(std::string("binary")+Op);
- assert(F && "binary operator not found!");
-
- Value *Ops[] = { L, R };
- return Builder.CreateCall(F, Ops, Ops+2, "binop");
-}
-
-Value *CallExprAST::Codegen() {
- // Look up the name in the global module table.
- Function *CalleeF = TheModule->getFunction(Callee);
- if (CalleeF == 0)
- return ErrorV("Unknown function referenced");
-
- // If argument mismatch error.
- if (CalleeF->arg_size() != Args.size())
- return ErrorV("Incorrect # arguments passed");
-
- std::vector<Value*> ArgsV;
- for (unsigned i = 0, e = Args.size(); i != e; ++i) {
- ArgsV.push_back(Args[i]->Codegen());
- if (ArgsV.back() == 0) return 0;
- }
-
- return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
-}
-
-Value *IfExprAST::Codegen() {
- Value *CondV = Cond->Codegen();
- if (CondV == 0) return 0;
-
- // Convert condition to a bool by comparing equal to 0.0.
- CondV = Builder.CreateFCmpONE(CondV,
- ConstantFP::get(getGlobalContext(), APFloat(0.0)),
- "ifcond");
-
- Function *TheFunction = Builder.GetInsertBlock()->getParent();
-
- // Create blocks for the then and else cases. Insert the 'then' block at the
- // end of the function.
- BasicBlock *ThenBB = BasicBlock::Create(getGlobalContext(), "then", TheFunction);
- BasicBlock *ElseBB = BasicBlock::Create(getGlobalContext(), "else");
- BasicBlock *MergeBB = BasicBlock::Create(getGlobalContext(), "ifcont");
-
- Builder.CreateCondBr(CondV, ThenBB, ElseBB);
-
- // Emit then value.
- Builder.SetInsertPoint(ThenBB);
-
- Value *ThenV = Then->Codegen();
- if (ThenV == 0) return 0;
-
- Builder.CreateBr(MergeBB);
- // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
- ThenBB = Builder.GetInsertBlock();
-
- // Emit else block.
- TheFunction->getBasicBlockList().push_back(ElseBB);
- Builder.SetInsertPoint(ElseBB);
-
- Value *ElseV = Else->Codegen();
- if (ElseV == 0) return 0;
-
- Builder.CreateBr(MergeBB);
- // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
- ElseBB = Builder.GetInsertBlock();
-
- // Emit merge block.
- TheFunction->getBasicBlockList().push_back(MergeBB);
- Builder.SetInsertPoint(MergeBB);
- PHINode *PN = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()),
- "iftmp");
-
- PN->addIncoming(ThenV, ThenBB);
- PN->addIncoming(ElseV, ElseBB);
- return PN;
-}
-
-Value *ForExprAST::Codegen() {
- // Output this as:
- // var = alloca double
- // ...
- // start = startexpr
- // store start -> var
- // goto loop
- // loop:
- // ...
- // bodyexpr
- // ...
- // loopend:
- // step = stepexpr
- // endcond = endexpr
- //
- // curvar = load var
- // nextvar = curvar + step
- // store nextvar -> var
- // br endcond, loop, endloop
- // outloop:
-
- Function *TheFunction = Builder.GetInsertBlock()->getParent();
-
- // Create an alloca for the variable in the entry block.
- AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
-
- // Emit the start code first, without 'variable' in scope.
- Value *StartVal = Start->Codegen();
- if (StartVal == 0) return 0;
-
- // Store the value into the alloca.
- Builder.CreateStore(StartVal, Alloca);
-
- // Make the new basic block for the loop header, inserting after current
- // block.
- BasicBlock *LoopBB = BasicBlock::Create(getGlobalContext(), "loop", TheFunction);
-
- // Insert an explicit fall through from the current block to the LoopBB.
- Builder.CreateBr(LoopBB);
-
- // Start insertion in LoopBB.
- Builder.SetInsertPoint(LoopBB);
-
- // Within the loop, the variable is defined equal to the PHI node. If it
- // shadows an existing variable, we have to restore it, so save it now.
- AllocaInst *OldVal = NamedValues[VarName];
- NamedValues[VarName] = Alloca;
-
- // Emit the body of the loop. This, like any other expr, can change the
- // current BB. Note that we ignore the value computed by the body, but don't
- // allow an error.
- if (Body->Codegen() == 0)
- return 0;
-
- // Emit the step value.
- Value *StepVal;
- if (Step) {
- StepVal = Step->Codegen();
- if (StepVal == 0) return 0;
- } else {
- // If not specified, use 1.0.
- StepVal = ConstantFP::get(getGlobalContext(), APFloat(1.0));
- }
-
- // Compute the end condition.
- Value *EndCond = End->Codegen();
- if (EndCond == 0) return EndCond;
-
- // Reload, increment, and restore the alloca. This handles the case where
- // the body of the loop mutates the variable.
- Value *CurVar = Builder.CreateLoad(Alloca, VarName.c_str());
- Value *NextVar = Builder.CreateAdd(CurVar, StepVal, "nextvar");
- Builder.CreateStore(NextVar, Alloca);
-
- // Convert condition to a bool by comparing equal to 0.0.
- EndCond = Builder.CreateFCmpONE(EndCond,
- ConstantFP::get(getGlobalContext(), APFloat(0.0)),
- "loopcond");
-
- // Create the "after loop" block and insert it.
- BasicBlock *AfterBB = BasicBlock::Create(getGlobalContext(), "afterloop", TheFunction);
-
- // Insert the conditional branch into the end of LoopEndBB.
- Builder.CreateCondBr(EndCond, LoopBB, AfterBB);
-
- // Any new code will be inserted in AfterBB.
- Builder.SetInsertPoint(AfterBB);
-
- // Restore the unshadowed variable.
- if (OldVal)
- NamedValues[VarName] = OldVal;
- else
- NamedValues.erase(VarName);
-
-
- // for expr always returns 0.0.
- return Constant::getNullValue(Type::getDoubleTy(getGlobalContext()));
-}
-
-Value *VarExprAST::Codegen() {
- std::vector<AllocaInst *> OldBindings;
-
- Function *TheFunction = Builder.GetInsertBlock()->getParent();
-
- // Register all variables and emit their initializer.
- for (unsigned i = 0, e = VarNames.size(); i != e; ++i) {
- const std::string &VarName = VarNames[i].first;
- ExprAST *Init = VarNames[i].second;
-
- // Emit the initializer before adding the variable to scope, this prevents
- // the initializer from referencing the variable itself, and permits stuff
- // like this:
- // var a = 1 in
- // var a = a in ... # refers to outer 'a'.
- Value *InitVal;
- if (Init) {
- InitVal = Init->Codegen();
- if (InitVal == 0) return 0;
- } else { // If not specified, use 0.0.
- InitVal = ConstantFP::get(getGlobalContext(), APFloat(0.0));
- }
-
- AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
- Builder.CreateStore(InitVal, Alloca);
-
- // Remember the old variable binding so that we can restore the binding when
- // we unrecurse.
- OldBindings.push_back(NamedValues[VarName]);
-
- // Remember this binding.
- NamedValues[VarName] = Alloca;
- }
-
- // Codegen the body, now that all vars are in scope.
- Value *BodyVal = Body->Codegen();
- if (BodyVal == 0) return 0;
-
- // Pop all our variables from scope.
- for (unsigned i = 0, e = VarNames.size(); i != e; ++i)
- NamedValues[VarNames[i].first] = OldBindings[i];
-
- // Return the body computation.
- return BodyVal;
-}
-
-Function *PrototypeAST::Codegen() {
- // Make the function type: double(double,double) etc.
- std::vector<const Type*> Doubles(Args.size(),
- Type::getDoubleTy(getGlobalContext()));
- FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
- Doubles, false);
-
- Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
-
- // If F conflicted, there was already something named 'Name'. If it has a
- // body, don't allow redefinition or reextern.
- if (F->getName() != Name) {
- // Delete the one we just made and get the existing one.
- F->eraseFromParent();
- F = TheModule->getFunction(Name);
-
- // If F already has a body, reject this.
- if (!F->empty()) {
- ErrorF("redefinition of function");
- return 0;
- }
-
- // If F took a different number of args, reject.
- if (F->arg_size() != Args.size()) {
- ErrorF("redefinition of function with different # args");
- return 0;
- }
- }
-
- // Set names for all arguments.
- unsigned Idx = 0;
- for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size();
- ++AI, ++Idx)
- AI->setName(Args[Idx]);
-
- return F;
-}
-
-/// CreateArgumentAllocas - Create an alloca for each argument and register the
-/// argument in the symbol table so that references to it will succeed.
-void PrototypeAST::CreateArgumentAllocas(Function *F) {
- Function::arg_iterator AI = F->arg_begin();
- for (unsigned Idx = 0, e = Args.size(); Idx != e; ++Idx, ++AI) {
- // Create an alloca for this variable.
- AllocaInst *Alloca = CreateEntryBlockAlloca(F, Args[Idx]);
-
- // Store the initial value into the alloca.
- Builder.CreateStore(AI, Alloca);
-
- // Add arguments to variable symbol table.
- NamedValues[Args[Idx]] = Alloca;
- }
-}
-
-Function *FunctionAST::Codegen() {
- NamedValues.clear();
-
- Function *TheFunction = Proto->Codegen();
- if (TheFunction == 0)
- return 0;
-
- // If this is an operator, install it.
- if (Proto->isBinaryOp())
- BinopPrecedence[Proto->getOperatorName()] = Proto->getBinaryPrecedence();
-
- // Create a new basic block to start insertion into.
- BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
- Builder.SetInsertPoint(BB);
-
- // Add all arguments to the symbol table and create their allocas.
- Proto->CreateArgumentAllocas(TheFunction);
-
- if (Value *RetVal = Body->Codegen()) {
- // Finish off the function.
- Builder.CreateRet(RetVal);
-
- // Validate the generated code, checking for consistency.
- verifyFunction(*TheFunction);
-
- // Optimize the function.
- TheFPM->run(*TheFunction);
-
- return TheFunction;
- }
-
- // Error reading body, remove function.
- TheFunction->eraseFromParent();
-
- if (Proto->isBinaryOp())
- BinopPrecedence.erase(Proto->getOperatorName());
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Top-Level parsing and JIT Driver
-//===----------------------------------------------------------------------===//
-
-static ExecutionEngine *TheExecutionEngine;
-
-static void HandleDefinition() {
- if (FunctionAST *F = ParseDefinition()) {
- if (Function *LF = F->Codegen()) {
- fprintf(stderr, "Read function definition:");
- LF->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleExtern() {
- if (PrototypeAST *P = ParseExtern()) {
- if (Function *F = P->Codegen()) {
- fprintf(stderr, "Read extern: ");
- F->dump();
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-static void HandleTopLevelExpression() {
- // Evaluate a top-level expression into an anonymous function.
- if (FunctionAST *F = ParseTopLevelExpr()) {
- if (Function *LF = F->Codegen()) {
- // JIT the function, returning a function pointer.
- void *FPtr = TheExecutionEngine->getPointerToFunction(LF);
-
- // Cast it to the right type (takes no arguments, returns a double) so we
- // can call it as a native function.
- double (*FP)() = (double (*)())(intptr_t)FPtr;
- fprintf(stderr, "Evaluated to %f\n", FP());
- }
- } else {
- // Skip token for error recovery.
- getNextToken();
- }
-}
-
-/// top ::= definition | external | expression | ';'
-static void MainLoop() {
- while (1) {
- fprintf(stderr, "ready> ");
- switch (CurTok) {
- case tok_eof: return;
- case ';': getNextToken(); break; // ignore top-level semicolons.
- case tok_def: HandleDefinition(); break;
- case tok_extern: HandleExtern(); break;
- default: HandleTopLevelExpression(); break;
- }
- }
-}
-
-//===----------------------------------------------------------------------===//
-// "Library" functions that can be "extern'd" from user code.
-//===----------------------------------------------------------------------===//
-
-/// putchard - putchar that takes a double and returns 0.
-extern "C"
-double putchard(double X) {
- putchar((char)X);
- return 0;
-}
-
-/// printd - printf that takes a double prints it as "%f\n", returning 0.
-extern "C"
-double printd(double X) {
- printf("%f\n", X);
- return 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Main driver code.
-//===----------------------------------------------------------------------===//
-
-int main() {
- InitializeNativeTarget();
- LLVMContext &Context = getGlobalContext();
-
- // Install standard binary operators.
- // 1 is lowest precedence.
- BinopPrecedence['='] = 2;
- BinopPrecedence['<'] = 10;
- BinopPrecedence['+'] = 20;
- BinopPrecedence['-'] = 20;
- BinopPrecedence['*'] = 40; // highest.
-
- // Prime the first token.
- fprintf(stderr, "ready> ");
- getNextToken();
-
- // Make the module, which holds all the code.
- TheModule = new Module("my cool jit", Context);
-
- // Create the JIT. This takes ownership of the module.
- std::string ErrStr;
- TheExecutionEngine = EngineBuilder(TheModule).setErrorStr(&ErrStr).create();
- if (!TheExecutionEngine) {
- fprintf(stderr, "Could not create ExecutionEngine: %s\n", ErrStr.c_str());
- exit(1);
- }
-
- FunctionPassManager OurFPM(TheModule);
-
- // Set up the optimizer pipeline. Start with registering info about how the
- // target lays out data structures.
- OurFPM.add(new TargetData(*TheExecutionEngine->getTargetData()));
- // Promote allocas to registers.
- OurFPM.add(createPromoteMemoryToRegisterPass());
- // Do simple "peephole" optimizations and bit-twiddling optzns.
- OurFPM.add(createInstructionCombiningPass());
- // Reassociate expressions.
- OurFPM.add(createReassociatePass());
- // Eliminate Common SubExpressions.
- OurFPM.add(createGVNPass());
- // Simplify the control flow graph (deleting unreachable blocks, etc).
- OurFPM.add(createCFGSimplificationPass());
-
- OurFPM.doInitialization();
-
- // Set the global so the code gen can use this.
- TheFPM = &OurFPM;
-
- // Run the main "interpreter loop" now.
- MainLoop();
-
- TheFPM = 0;
-
- // Print out all of the generated code.
- TheModule->dump();
-
- return 0;
-}
diff --git a/contrib/llvm/examples/Kaleidoscope/Makefile b/contrib/llvm/examples/Kaleidoscope/Makefile
deleted file mode 100644
index bd0c252..0000000
--- a/contrib/llvm/examples/Kaleidoscope/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-##===- examples/Kaleidoscope/Makefile ----------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL=../..
-
-include $(LEVEL)/Makefile.config
-
-PARALLEL_DIRS:= Chapter2 Chapter3 Chapter4 Chapter5 Chapter6 Chapter7
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/Makefile b/contrib/llvm/examples/Makefile
deleted file mode 100644
index 5594c05..0000000
--- a/contrib/llvm/examples/Makefile
+++ /dev/null
@@ -1,32 +0,0 @@
-##===- examples/Makefile -----------------------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL=..
-
-include $(LEVEL)/Makefile.config
-
-PARALLEL_DIRS:= BrainF Fibonacci HowToUseJIT Kaleidoscope ModuleMaker
-
-ifeq ($(HAVE_PTHREAD),1)
-PARALLEL_DIRS += ParallelJIT
-endif
-
-ifeq ($(LLVM_ON_UNIX),1)
- ifeq ($(ARCH),x86)
- PARALLEL_DIRS += ExceptionDemo
- endif
- ifeq ($(ARCH),x86_64)
- PARALLEL_DIRS += ExceptionDemo
- endif
-endif
-
-ifeq ($(filter $(BINDINGS_TO_BUILD),ocaml),ocaml)
- PARALLEL_DIRS += OCaml-Kaleidoscope
-endif
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/ModuleMaker/CMakeLists.txt b/contrib/llvm/examples/ModuleMaker/CMakeLists.txt
deleted file mode 100644
index 81e9115..0000000
--- a/contrib/llvm/examples/ModuleMaker/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-set(LLVM_LINK_COMPONENTS bitwriter)
-
-add_llvm_example(ModuleMaker
- ModuleMaker.cpp
- )
diff --git a/contrib/llvm/examples/ModuleMaker/Makefile b/contrib/llvm/examples/ModuleMaker/Makefile
deleted file mode 100644
index 9454cf5..0000000
--- a/contrib/llvm/examples/ModuleMaker/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-##===- examples/ModuleMaker/Makefile -----------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL=../..
-TOOLNAME=ModuleMaker
-EXAMPLE_TOOL = 1
-LINK_COMPONENTS := bitwriter
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/ModuleMaker/ModuleMaker.cpp b/contrib/llvm/examples/ModuleMaker/ModuleMaker.cpp
deleted file mode 100644
index 6bc52c1..0000000
--- a/contrib/llvm/examples/ModuleMaker/ModuleMaker.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-//===- examples/ModuleMaker/ModuleMaker.cpp - Example project ---*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This programs is a simple example that creates an LLVM module "from scratch",
-// emitting it as a bitcode file to standard out. This is just to show how
-// LLVM projects work and to demonstrate some of the LLVM APIs.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/Constants.h"
-#include "llvm/Instructions.h"
-#include "llvm/Bitcode/ReaderWriter.h"
-#include "llvm/Support/raw_ostream.h"
-using namespace llvm;
-
-int main() {
- LLVMContext Context;
-
- // Create the "module" or "program" or "translation unit" to hold the
- // function
- Module *M = new Module("test", Context);
-
- // Create the main function: first create the type 'int ()'
- FunctionType *FT =
- FunctionType::get(Type::getInt32Ty(Context), /*not vararg*/false);
-
- // By passing a module as the last parameter to the Function constructor,
- // it automatically gets appended to the Module.
- Function *F = Function::Create(FT, Function::ExternalLinkage, "main", M);
-
- // Add a basic block to the function... again, it automatically inserts
- // because of the last argument.
- BasicBlock *BB = BasicBlock::Create(Context, "EntryBlock", F);
-
- // Get pointers to the constant integers...
- Value *Two = ConstantInt::get(Type::getInt32Ty(Context), 2);
- Value *Three = ConstantInt::get(Type::getInt32Ty(Context), 3);
-
- // Create the add instruction... does not insert...
- Instruction *Add = BinaryOperator::Create(Instruction::Add, Two, Three,
- "addresult");
-
- // explicitly insert it into the basic block...
- BB->getInstList().push_back(Add);
-
- // Create the return instruction and add it to the basic block
- BB->getInstList().push_back(ReturnInst::Create(Context, Add));
-
- // Output the bitcode file to stdout
- WriteBitcodeToFile(M, outs());
-
- // Delete the module and all of its contents.
- delete M;
- return 0;
-}
diff --git a/contrib/llvm/examples/ModuleMaker/README.txt b/contrib/llvm/examples/ModuleMaker/README.txt
deleted file mode 100644
index ecbe30e..0000000
--- a/contrib/llvm/examples/ModuleMaker/README.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-//===----------------------------------------------------------------------===//
-// ModuleMaker Sample project
-//===----------------------------------------------------------------------===//
-
-This project is an extremely simple example of using some simple pieces of the
-LLVM API. The actual executable generated by this project simply emits an
-LLVM bytecode file to standard output. It is designed to show some basic
-usage of LLVM APIs, and how to link to LLVM libraries.
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/Makefile b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/Makefile
deleted file mode 100644
index 8fc03da..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-##===- examples/OCaml-Kaleidoscope/Chapter2/Makefile -------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-#
-# This is the makefile for the Objective Caml kaleidoscope tutorial, chapter 2.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL := ../../..
-TOOLNAME := OCaml-Kaleidoscope-Ch2
-EXAMPLE_TOOL := 1
-UsedComponents := core
-UsedOcamLibs := llvm
-
-OCAMLCFLAGS += -pp camlp4of
-
-include $(LEVEL)/bindings/ocaml/Makefile.ocaml
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/_tags b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/_tags
deleted file mode 100644
index 7b9b80b..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/_tags
+++ /dev/null
@@ -1 +0,0 @@
-<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/ast.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/ast.ml
deleted file mode 100644
index 4cc2dea..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/ast.ml
+++ /dev/null
@@ -1,25 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Abstract Syntax Tree (aka Parse Tree)
- *===----------------------------------------------------------------------===*)
-
-(* expr - Base type for all expression nodes. *)
-type expr =
- (* variant for numeric literals like "1.0". *)
- | Number of float
-
- (* variant for referencing a variable, like "a". *)
- | Variable of string
-
- (* variant for a binary operator. *)
- | Binary of char * expr * expr
-
- (* variant for function calls. *)
- | Call of string * expr array
-
-(* proto - This type represents the "prototype" for a function, which captures
- * its name, and its argument names (thus implicitly the number of arguments the
- * function takes). *)
-type proto = Prototype of string * string array
-
-(* func - This type represents a function definition itself. *)
-type func = Function of proto * expr
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/lexer.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/lexer.ml
deleted file mode 100644
index 22a9155..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/lexer.ml
+++ /dev/null
@@ -1,52 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer
- *===----------------------------------------------------------------------===*)
-
-let rec lex = parser
- (* Skip any whitespace. *)
- | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
-
- (* identifier: [a-zA-Z][a-zA-Z0-9] *)
- | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_ident buffer stream
-
- (* number: [0-9.]+ *)
- | [< ' ('0' .. '9' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_number buffer stream
-
- (* Comment until end of line. *)
- | [< ' ('#'); stream >] ->
- lex_comment stream
-
- (* Otherwise, just return the character as its ascii value. *)
- | [< 'c; stream >] ->
- [< 'Token.Kwd c; lex stream >]
-
- (* end of stream. *)
- | [< >] -> [< >]
-
-and lex_number buffer = parser
- | [< ' ('0' .. '9' | '.' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_number buffer stream
- | [< stream=lex >] ->
- [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
-
-and lex_ident buffer = parser
- | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_ident buffer stream
- | [< stream=lex >] ->
- match Buffer.contents buffer with
- | "def" -> [< 'Token.Def; stream >]
- | "extern" -> [< 'Token.Extern; stream >]
- | id -> [< 'Token.Ident id; stream >]
-
-and lex_comment = parser
- | [< ' ('\n'); stream=lex >] -> stream
- | [< 'c; e=lex_comment >] -> e
- | [< >] -> [< >]
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/parser.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/parser.ml
deleted file mode 100644
index 83d9874..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/parser.ml
+++ /dev/null
@@ -1,122 +0,0 @@
-(*===---------------------------------------------------------------------===
- * Parser
- *===---------------------------------------------------------------------===*)
-
-(* binop_precedence - This holds the precedence for each binary operator that is
- * defined *)
-let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10
-
-(* precedence - Get the precedence of the pending binary operator token. *)
-let precedence c = try Hashtbl.find binop_precedence c with Not_found -> -1
-
-(* primary
- * ::= identifier
- * ::= numberexpr
- * ::= parenexpr *)
-let rec parse_primary = parser
- (* numberexpr ::= number *)
- | [< 'Token.Number n >] -> Ast.Number n
-
- (* parenexpr ::= '(' expression ')' *)
- | [< 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" >] -> e
-
- (* identifierexpr
- * ::= identifier
- * ::= identifier '(' argumentexpr ')' *)
- | [< 'Token.Ident id; stream >] ->
- let rec parse_args accumulator = parser
- | [< e=parse_expr; stream >] ->
- begin parser
- | [< 'Token.Kwd ','; e=parse_args (e :: accumulator) >] -> e
- | [< >] -> e :: accumulator
- end stream
- | [< >] -> accumulator
- in
- let rec parse_ident id = parser
- (* Call. *)
- | [< 'Token.Kwd '(';
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')'">] ->
- Ast.Call (id, Array.of_list (List.rev args))
-
- (* Simple variable ref. *)
- | [< >] -> Ast.Variable id
- in
- parse_ident id stream
-
- | [< >] -> raise (Stream.Error "unknown token when expecting an expression.")
-
-(* binoprhs
- * ::= ('+' primary)* *)
-and parse_bin_rhs expr_prec lhs stream =
- match Stream.peek stream with
- (* If this is a binop, find its precedence. *)
- | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c ->
- let token_prec = precedence c in
-
- (* If this is a binop that binds at least as tightly as the current binop,
- * consume it, otherwise we are done. *)
- if token_prec < expr_prec then lhs else begin
- (* Eat the binop. *)
- Stream.junk stream;
-
- (* Parse the primary expression after the binary operator. *)
- let rhs = parse_primary stream in
-
- (* Okay, we know this is a binop. *)
- let rhs =
- match Stream.peek stream with
- | Some (Token.Kwd c2) ->
- (* If BinOp binds less tightly with rhs than the operator after
- * rhs, let the pending operator take rhs as its lhs. *)
- let next_prec = precedence c2 in
- if token_prec < next_prec
- then parse_bin_rhs (token_prec + 1) rhs stream
- else rhs
- | _ -> rhs
- in
-
- (* Merge lhs/rhs. *)
- let lhs = Ast.Binary (c, lhs, rhs) in
- parse_bin_rhs expr_prec lhs stream
- end
- | _ -> lhs
-
-(* expression
- * ::= primary binoprhs *)
-and parse_expr = parser
- | [< lhs=parse_primary; stream >] -> parse_bin_rhs 0 lhs stream
-
-(* prototype
- * ::= id '(' id* ')' *)
-let parse_prototype =
- let rec parse_args accumulator = parser
- | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
- | [< >] -> accumulator
- in
-
- parser
- | [< 'Token.Ident id;
- 'Token.Kwd '(' ?? "expected '(' in prototype";
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
- (* success. *)
- Ast.Prototype (id, Array.of_list (List.rev args))
-
- | [< >] ->
- raise (Stream.Error "expected function name in prototype")
-
-(* definition ::= 'def' prototype expression *)
-let parse_definition = parser
- | [< 'Token.Def; p=parse_prototype; e=parse_expr >] ->
- Ast.Function (p, e)
-
-(* toplevelexpr ::= expression *)
-let parse_toplevel = parser
- | [< e=parse_expr >] ->
- (* Make an anonymous proto. *)
- Ast.Function (Ast.Prototype ("", [||]), e)
-
-(* external ::= 'extern' prototype *)
-let parse_extern = parser
- | [< 'Token.Extern; e=parse_prototype >] -> e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/token.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/token.ml
deleted file mode 100644
index 2ca782e..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/token.ml
+++ /dev/null
@@ -1,15 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer Tokens
- *===----------------------------------------------------------------------===*)
-
-(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
- * these others for known things. *)
-type token =
- (* commands *)
- | Def | Extern
-
- (* primary *)
- | Ident of string | Number of float
-
- (* unknown *)
- | Kwd of char
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/toplevel.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/toplevel.ml
deleted file mode 100644
index 01c85bd..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/toplevel.ml
+++ /dev/null
@@ -1,34 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Top-Level parsing and JIT Driver
- *===----------------------------------------------------------------------===*)
-
-(* top ::= definition | external | expression | ';' *)
-let rec main_loop stream =
- match Stream.peek stream with
- | None -> ()
-
- (* ignore top-level semicolons. *)
- | Some (Token.Kwd ';') ->
- Stream.junk stream;
- main_loop stream
-
- | Some token ->
- begin
- try match token with
- | Token.Def ->
- ignore(Parser.parse_definition stream);
- print_endline "parsed a function definition.";
- | Token.Extern ->
- ignore(Parser.parse_extern stream);
- print_endline "parsed an extern.";
- | _ ->
- (* Evaluate a top-level expression into an anonymous function. *)
- ignore(Parser.parse_toplevel stream);
- print_endline "parsed a top-level expr";
- with Stream.Error s ->
- (* Skip token for error recovery. *)
- Stream.junk stream;
- print_endline s;
- end;
- print_string "ready> "; flush stdout;
- main_loop stream
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/toy.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/toy.ml
deleted file mode 100644
index 42b19fe..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter2/toy.ml
+++ /dev/null
@@ -1,21 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Main driver code.
- *===----------------------------------------------------------------------===*)
-
-let main () =
- (* Install standard binary operators.
- * 1 is the lowest precedence. *)
- Hashtbl.add Parser.binop_precedence '<' 10;
- Hashtbl.add Parser.binop_precedence '+' 20;
- Hashtbl.add Parser.binop_precedence '-' 20;
- Hashtbl.add Parser.binop_precedence '*' 40; (* highest. *)
-
- (* Prime the first token. *)
- print_string "ready> "; flush stdout;
- let stream = Lexer.lex (Stream.of_channel stdin) in
-
- (* Run the main "interpreter loop" now. *)
- Toplevel.main_loop stream;
-;;
-
-main ()
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/Makefile b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/Makefile
deleted file mode 100644
index fdbcd51..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-##===- examples/OCaml-Kaleidoscope/Chapter3/Makefile -------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-#
-# This is the makefile for the Objective Caml kaleidoscope tutorial, chapter 3.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL := ../../..
-TOOLNAME := OCaml-Kaleidoscope-Ch3
-EXAMPLE_TOOL := 1
-UsedComponents := core
-UsedOcamLibs := llvm llvm_analysis
-
-OCAMLCFLAGS += -pp camlp4of
-
-ExcludeSources = $(PROJ_SRC_DIR)/myocamlbuild.ml
-
-include $(LEVEL)/bindings/ocaml/Makefile.ocaml
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/_tags b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/_tags
deleted file mode 100644
index 990490a..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/_tags
+++ /dev/null
@@ -1,2 +0,0 @@
-<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
-<*.{byte,native}>: g++, use_llvm, use_llvm_analysis
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/ast.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/ast.ml
deleted file mode 100644
index 4cc2dea..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/ast.ml
+++ /dev/null
@@ -1,25 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Abstract Syntax Tree (aka Parse Tree)
- *===----------------------------------------------------------------------===*)
-
-(* expr - Base type for all expression nodes. *)
-type expr =
- (* variant for numeric literals like "1.0". *)
- | Number of float
-
- (* variant for referencing a variable, like "a". *)
- | Variable of string
-
- (* variant for a binary operator. *)
- | Binary of char * expr * expr
-
- (* variant for function calls. *)
- | Call of string * expr array
-
-(* proto - This type represents the "prototype" for a function, which captures
- * its name, and its argument names (thus implicitly the number of arguments the
- * function takes). *)
-type proto = Prototype of string * string array
-
-(* func - This type represents a function definition itself. *)
-type func = Function of proto * expr
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/codegen.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/codegen.ml
deleted file mode 100644
index 275cd0b..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/codegen.ml
+++ /dev/null
@@ -1,100 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Code Generation
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-
-exception Error of string
-
-let context = global_context ()
-let the_module = create_module context "my cool jit"
-let builder = builder context
-let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
-let double_type = double_type context
-
-let rec codegen_expr = function
- | Ast.Number n -> const_float double_type n
- | Ast.Variable name ->
- (try Hashtbl.find named_values name with
- | Not_found -> raise (Error "unknown variable name"))
- | Ast.Binary (op, lhs, rhs) ->
- let lhs_val = codegen_expr lhs in
- let rhs_val = codegen_expr rhs in
- begin
- match op with
- | '+' -> build_add lhs_val rhs_val "addtmp" builder
- | '-' -> build_sub lhs_val rhs_val "subtmp" builder
- | '*' -> build_mul lhs_val rhs_val "multmp" builder
- | '<' ->
- (* Convert bool 0/1 to double 0.0 or 1.0 *)
- let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
- build_uitofp i double_type "booltmp" builder
- | _ -> raise (Error "invalid binary operator")
- end
- | Ast.Call (callee, args) ->
- (* Look up the name in the module table. *)
- let callee =
- match lookup_function callee the_module with
- | Some callee -> callee
- | None -> raise (Error "unknown function referenced")
- in
- let params = params callee in
-
- (* If argument mismatch error. *)
- if Array.length params == Array.length args then () else
- raise (Error "incorrect # arguments passed");
- let args = Array.map codegen_expr args in
- build_call callee args "calltmp" builder
-
-let codegen_proto = function
- | Ast.Prototype (name, args) ->
- (* Make the function type: double(double,double) etc. *)
- let doubles = Array.make (Array.length args) double_type in
- let ft = function_type double_type doubles in
- let f =
- match lookup_function name the_module with
- | None -> declare_function name ft the_module
-
- (* If 'f' conflicted, there was already something named 'name'. If it
- * has a body, don't allow redefinition or reextern. *)
- | Some f ->
- (* If 'f' already has a body, reject this. *)
- if block_begin f <> At_end f then
- raise (Error "redefinition of function");
-
- (* If 'f' took a different number of arguments, reject. *)
- if element_type (type_of f) <> ft then
- raise (Error "redefinition of function with different # args");
- f
- in
-
- (* Set names for all arguments. *)
- Array.iteri (fun i a ->
- let n = args.(i) in
- set_value_name n a;
- Hashtbl.add named_values n a;
- ) (params f);
- f
-
-let codegen_func = function
- | Ast.Function (proto, body) ->
- Hashtbl.clear named_values;
- let the_function = codegen_proto proto in
-
- (* Create a new basic block to start insertion into. *)
- let bb = append_block context "entry" the_function in
- position_at_end bb builder;
-
- try
- let ret_val = codegen_expr body in
-
- (* Finish off the function. *)
- let _ = build_ret ret_val builder in
-
- (* Validate the generated code, checking for consistency. *)
- Llvm_analysis.assert_valid_function the_function;
-
- the_function
- with e ->
- delete_function the_function;
- raise e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/lexer.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/lexer.ml
deleted file mode 100644
index 22a9155..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/lexer.ml
+++ /dev/null
@@ -1,52 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer
- *===----------------------------------------------------------------------===*)
-
-let rec lex = parser
- (* Skip any whitespace. *)
- | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
-
- (* identifier: [a-zA-Z][a-zA-Z0-9] *)
- | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_ident buffer stream
-
- (* number: [0-9.]+ *)
- | [< ' ('0' .. '9' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_number buffer stream
-
- (* Comment until end of line. *)
- | [< ' ('#'); stream >] ->
- lex_comment stream
-
- (* Otherwise, just return the character as its ascii value. *)
- | [< 'c; stream >] ->
- [< 'Token.Kwd c; lex stream >]
-
- (* end of stream. *)
- | [< >] -> [< >]
-
-and lex_number buffer = parser
- | [< ' ('0' .. '9' | '.' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_number buffer stream
- | [< stream=lex >] ->
- [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
-
-and lex_ident buffer = parser
- | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_ident buffer stream
- | [< stream=lex >] ->
- match Buffer.contents buffer with
- | "def" -> [< 'Token.Def; stream >]
- | "extern" -> [< 'Token.Extern; stream >]
- | id -> [< 'Token.Ident id; stream >]
-
-and lex_comment = parser
- | [< ' ('\n'); stream=lex >] -> stream
- | [< 'c; e=lex_comment >] -> e
- | [< >] -> [< >]
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/myocamlbuild.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/myocamlbuild.ml
deleted file mode 100644
index b71f5d7..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/myocamlbuild.ml
+++ /dev/null
@@ -1,6 +0,0 @@
-open Ocamlbuild_plugin;;
-
-ocaml_lib ~extern:true "llvm";;
-ocaml_lib ~extern:true "llvm_analysis";;
-
-flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"]);;
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/parser.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/parser.ml
deleted file mode 100644
index 83d9874..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/parser.ml
+++ /dev/null
@@ -1,122 +0,0 @@
-(*===---------------------------------------------------------------------===
- * Parser
- *===---------------------------------------------------------------------===*)
-
-(* binop_precedence - This holds the precedence for each binary operator that is
- * defined *)
-let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10
-
-(* precedence - Get the precedence of the pending binary operator token. *)
-let precedence c = try Hashtbl.find binop_precedence c with Not_found -> -1
-
-(* primary
- * ::= identifier
- * ::= numberexpr
- * ::= parenexpr *)
-let rec parse_primary = parser
- (* numberexpr ::= number *)
- | [< 'Token.Number n >] -> Ast.Number n
-
- (* parenexpr ::= '(' expression ')' *)
- | [< 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" >] -> e
-
- (* identifierexpr
- * ::= identifier
- * ::= identifier '(' argumentexpr ')' *)
- | [< 'Token.Ident id; stream >] ->
- let rec parse_args accumulator = parser
- | [< e=parse_expr; stream >] ->
- begin parser
- | [< 'Token.Kwd ','; e=parse_args (e :: accumulator) >] -> e
- | [< >] -> e :: accumulator
- end stream
- | [< >] -> accumulator
- in
- let rec parse_ident id = parser
- (* Call. *)
- | [< 'Token.Kwd '(';
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')'">] ->
- Ast.Call (id, Array.of_list (List.rev args))
-
- (* Simple variable ref. *)
- | [< >] -> Ast.Variable id
- in
- parse_ident id stream
-
- | [< >] -> raise (Stream.Error "unknown token when expecting an expression.")
-
-(* binoprhs
- * ::= ('+' primary)* *)
-and parse_bin_rhs expr_prec lhs stream =
- match Stream.peek stream with
- (* If this is a binop, find its precedence. *)
- | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c ->
- let token_prec = precedence c in
-
- (* If this is a binop that binds at least as tightly as the current binop,
- * consume it, otherwise we are done. *)
- if token_prec < expr_prec then lhs else begin
- (* Eat the binop. *)
- Stream.junk stream;
-
- (* Parse the primary expression after the binary operator. *)
- let rhs = parse_primary stream in
-
- (* Okay, we know this is a binop. *)
- let rhs =
- match Stream.peek stream with
- | Some (Token.Kwd c2) ->
- (* If BinOp binds less tightly with rhs than the operator after
- * rhs, let the pending operator take rhs as its lhs. *)
- let next_prec = precedence c2 in
- if token_prec < next_prec
- then parse_bin_rhs (token_prec + 1) rhs stream
- else rhs
- | _ -> rhs
- in
-
- (* Merge lhs/rhs. *)
- let lhs = Ast.Binary (c, lhs, rhs) in
- parse_bin_rhs expr_prec lhs stream
- end
- | _ -> lhs
-
-(* expression
- * ::= primary binoprhs *)
-and parse_expr = parser
- | [< lhs=parse_primary; stream >] -> parse_bin_rhs 0 lhs stream
-
-(* prototype
- * ::= id '(' id* ')' *)
-let parse_prototype =
- let rec parse_args accumulator = parser
- | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
- | [< >] -> accumulator
- in
-
- parser
- | [< 'Token.Ident id;
- 'Token.Kwd '(' ?? "expected '(' in prototype";
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
- (* success. *)
- Ast.Prototype (id, Array.of_list (List.rev args))
-
- | [< >] ->
- raise (Stream.Error "expected function name in prototype")
-
-(* definition ::= 'def' prototype expression *)
-let parse_definition = parser
- | [< 'Token.Def; p=parse_prototype; e=parse_expr >] ->
- Ast.Function (p, e)
-
-(* toplevelexpr ::= expression *)
-let parse_toplevel = parser
- | [< e=parse_expr >] ->
- (* Make an anonymous proto. *)
- Ast.Function (Ast.Prototype ("", [||]), e)
-
-(* external ::= 'extern' prototype *)
-let parse_extern = parser
- | [< 'Token.Extern; e=parse_prototype >] -> e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/token.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/token.ml
deleted file mode 100644
index 2ca782e..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/token.ml
+++ /dev/null
@@ -1,15 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer Tokens
- *===----------------------------------------------------------------------===*)
-
-(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
- * these others for known things. *)
-type token =
- (* commands *)
- | Def | Extern
-
- (* primary *)
- | Ident of string | Number of float
-
- (* unknown *)
- | Kwd of char
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/toplevel.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/toplevel.ml
deleted file mode 100644
index d1bf5d4..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/toplevel.ml
+++ /dev/null
@@ -1,39 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Top-Level parsing and JIT Driver
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-
-(* top ::= definition | external | expression | ';' *)
-let rec main_loop stream =
- match Stream.peek stream with
- | None -> ()
-
- (* ignore top-level semicolons. *)
- | Some (Token.Kwd ';') ->
- Stream.junk stream;
- main_loop stream
-
- | Some token ->
- begin
- try match token with
- | Token.Def ->
- let e = Parser.parse_definition stream in
- print_endline "parsed a function definition.";
- dump_value (Codegen.codegen_func e);
- | Token.Extern ->
- let e = Parser.parse_extern stream in
- print_endline "parsed an extern.";
- dump_value (Codegen.codegen_proto e);
- | _ ->
- (* Evaluate a top-level expression into an anonymous function. *)
- let e = Parser.parse_toplevel stream in
- print_endline "parsed a top-level expr";
- dump_value (Codegen.codegen_func e);
- with Stream.Error s | Codegen.Error s ->
- (* Skip token for error recovery. *)
- Stream.junk stream;
- print_endline s;
- end;
- print_string "ready> "; flush stdout;
- main_loop stream
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/toy.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/toy.ml
deleted file mode 100644
index 73c1a1e..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter3/toy.ml
+++ /dev/null
@@ -1,26 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Main driver code.
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-
-let main () =
- (* Install standard binary operators.
- * 1 is the lowest precedence. *)
- Hashtbl.add Parser.binop_precedence '<' 10;
- Hashtbl.add Parser.binop_precedence '+' 20;
- Hashtbl.add Parser.binop_precedence '-' 20;
- Hashtbl.add Parser.binop_precedence '*' 40; (* highest. *)
-
- (* Prime the first token. *)
- print_string "ready> "; flush stdout;
- let stream = Lexer.lex (Stream.of_channel stdin) in
-
- (* Run the main "interpreter loop" now. *)
- Toplevel.main_loop stream;
-
- (* Print out all the generated code. *)
- dump_module Codegen.the_module
-;;
-
-main ()
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/Makefile b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/Makefile
deleted file mode 100644
index d9c3f49..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-##===- examples/OCaml-Kaleidoscope/Chapter4/Makefile -------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-#
-# This is the makefile for the Objective Caml kaleidoscope tutorial, chapter 4.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL := ../../..
-TOOLNAME := OCaml-Kaleidoscope-Ch4
-EXAMPLE_TOOL := 1
-UsedComponents := core
-UsedOcamLibs := llvm llvm_analysis llvm_executionengine llvm_target \
- llvm_scalar_opts
-
-OCAMLCFLAGS += -pp camlp4of
-
-ExcludeSources = $(PROJ_SRC_DIR)/myocamlbuild.ml
-
-include $(LEVEL)/bindings/ocaml/Makefile.ocaml
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/_tags b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/_tags
deleted file mode 100644
index 7a03dba..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/_tags
+++ /dev/null
@@ -1,4 +0,0 @@
-<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
-<*.{byte,native}>: g++, use_llvm, use_llvm_analysis
-<*.{byte,native}>: use_llvm_executionengine, use_llvm_target
-<*.{byte,native}>: use_llvm_scalar_opts, use_bindings
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/ast.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/ast.ml
deleted file mode 100644
index 4cc2dea..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/ast.ml
+++ /dev/null
@@ -1,25 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Abstract Syntax Tree (aka Parse Tree)
- *===----------------------------------------------------------------------===*)
-
-(* expr - Base type for all expression nodes. *)
-type expr =
- (* variant for numeric literals like "1.0". *)
- | Number of float
-
- (* variant for referencing a variable, like "a". *)
- | Variable of string
-
- (* variant for a binary operator. *)
- | Binary of char * expr * expr
-
- (* variant for function calls. *)
- | Call of string * expr array
-
-(* proto - This type represents the "prototype" for a function, which captures
- * its name, and its argument names (thus implicitly the number of arguments the
- * function takes). *)
-type proto = Prototype of string * string array
-
-(* func - This type represents a function definition itself. *)
-type func = Function of proto * expr
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/bindings.c b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/bindings.c
deleted file mode 100644
index 053513b..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/bindings.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-/* putchard - putchar that takes a double and returns 0. */
-extern double putchard(double X) {
- putchar((char)X);
- return 0;
-}
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/codegen.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/codegen.ml
deleted file mode 100644
index 69d0928..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/codegen.ml
+++ /dev/null
@@ -1,103 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Code Generation
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-
-exception Error of string
-
-let context = global_context ()
-let the_module = create_module context "my cool jit"
-let builder = builder context
-let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
-let double_type = double_type context
-
-let rec codegen_expr = function
- | Ast.Number n -> const_float double_type n
- | Ast.Variable name ->
- (try Hashtbl.find named_values name with
- | Not_found -> raise (Error "unknown variable name"))
- | Ast.Binary (op, lhs, rhs) ->
- let lhs_val = codegen_expr lhs in
- let rhs_val = codegen_expr rhs in
- begin
- match op with
- | '+' -> build_add lhs_val rhs_val "addtmp" builder
- | '-' -> build_sub lhs_val rhs_val "subtmp" builder
- | '*' -> build_mul lhs_val rhs_val "multmp" builder
- | '<' ->
- (* Convert bool 0/1 to double 0.0 or 1.0 *)
- let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
- build_uitofp i double_type "booltmp" builder
- | _ -> raise (Error "invalid binary operator")
- end
- | Ast.Call (callee, args) ->
- (* Look up the name in the module table. *)
- let callee =
- match lookup_function callee the_module with
- | Some callee -> callee
- | None -> raise (Error "unknown function referenced")
- in
- let params = params callee in
-
- (* If argument mismatch error. *)
- if Array.length params == Array.length args then () else
- raise (Error "incorrect # arguments passed");
- let args = Array.map codegen_expr args in
- build_call callee args "calltmp" builder
-
-let codegen_proto = function
- | Ast.Prototype (name, args) ->
- (* Make the function type: double(double,double) etc. *)
- let doubles = Array.make (Array.length args) double_type in
- let ft = function_type double_type doubles in
- let f =
- match lookup_function name the_module with
- | None -> declare_function name ft the_module
-
- (* If 'f' conflicted, there was already something named 'name'. If it
- * has a body, don't allow redefinition or reextern. *)
- | Some f ->
- (* If 'f' already has a body, reject this. *)
- if block_begin f <> At_end f then
- raise (Error "redefinition of function");
-
- (* If 'f' took a different number of arguments, reject. *)
- if element_type (type_of f) <> ft then
- raise (Error "redefinition of function with different # args");
- f
- in
-
- (* Set names for all arguments. *)
- Array.iteri (fun i a ->
- let n = args.(i) in
- set_value_name n a;
- Hashtbl.add named_values n a;
- ) (params f);
- f
-
-let codegen_func the_fpm = function
- | Ast.Function (proto, body) ->
- Hashtbl.clear named_values;
- let the_function = codegen_proto proto in
-
- (* Create a new basic block to start insertion into. *)
- let bb = append_block context "entry" the_function in
- position_at_end bb builder;
-
- try
- let ret_val = codegen_expr body in
-
- (* Finish off the function. *)
- let _ = build_ret ret_val builder in
-
- (* Validate the generated code, checking for consistency. *)
- Llvm_analysis.assert_valid_function the_function;
-
- (* Optimize the function. *)
- let _ = PassManager.run_function the_function the_fpm in
-
- the_function
- with e ->
- delete_function the_function;
- raise e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/lexer.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/lexer.ml
deleted file mode 100644
index 22a9155..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/lexer.ml
+++ /dev/null
@@ -1,52 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer
- *===----------------------------------------------------------------------===*)
-
-let rec lex = parser
- (* Skip any whitespace. *)
- | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
-
- (* identifier: [a-zA-Z][a-zA-Z0-9] *)
- | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_ident buffer stream
-
- (* number: [0-9.]+ *)
- | [< ' ('0' .. '9' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_number buffer stream
-
- (* Comment until end of line. *)
- | [< ' ('#'); stream >] ->
- lex_comment stream
-
- (* Otherwise, just return the character as its ascii value. *)
- | [< 'c; stream >] ->
- [< 'Token.Kwd c; lex stream >]
-
- (* end of stream. *)
- | [< >] -> [< >]
-
-and lex_number buffer = parser
- | [< ' ('0' .. '9' | '.' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_number buffer stream
- | [< stream=lex >] ->
- [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
-
-and lex_ident buffer = parser
- | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_ident buffer stream
- | [< stream=lex >] ->
- match Buffer.contents buffer with
- | "def" -> [< 'Token.Def; stream >]
- | "extern" -> [< 'Token.Extern; stream >]
- | id -> [< 'Token.Ident id; stream >]
-
-and lex_comment = parser
- | [< ' ('\n'); stream=lex >] -> stream
- | [< 'c; e=lex_comment >] -> e
- | [< >] -> [< >]
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/myocamlbuild.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/myocamlbuild.ml
deleted file mode 100644
index ff42664..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/myocamlbuild.ml
+++ /dev/null
@@ -1,10 +0,0 @@
-open Ocamlbuild_plugin;;
-
-ocaml_lib ~extern:true "llvm";;
-ocaml_lib ~extern:true "llvm_analysis";;
-ocaml_lib ~extern:true "llvm_executionengine";;
-ocaml_lib ~extern:true "llvm_target";;
-ocaml_lib ~extern:true "llvm_scalar_opts";;
-
-flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"]);;
-dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];;
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/parser.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/parser.ml
deleted file mode 100644
index 83d9874..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/parser.ml
+++ /dev/null
@@ -1,122 +0,0 @@
-(*===---------------------------------------------------------------------===
- * Parser
- *===---------------------------------------------------------------------===*)
-
-(* binop_precedence - This holds the precedence for each binary operator that is
- * defined *)
-let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10
-
-(* precedence - Get the precedence of the pending binary operator token. *)
-let precedence c = try Hashtbl.find binop_precedence c with Not_found -> -1
-
-(* primary
- * ::= identifier
- * ::= numberexpr
- * ::= parenexpr *)
-let rec parse_primary = parser
- (* numberexpr ::= number *)
- | [< 'Token.Number n >] -> Ast.Number n
-
- (* parenexpr ::= '(' expression ')' *)
- | [< 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" >] -> e
-
- (* identifierexpr
- * ::= identifier
- * ::= identifier '(' argumentexpr ')' *)
- | [< 'Token.Ident id; stream >] ->
- let rec parse_args accumulator = parser
- | [< e=parse_expr; stream >] ->
- begin parser
- | [< 'Token.Kwd ','; e=parse_args (e :: accumulator) >] -> e
- | [< >] -> e :: accumulator
- end stream
- | [< >] -> accumulator
- in
- let rec parse_ident id = parser
- (* Call. *)
- | [< 'Token.Kwd '(';
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')'">] ->
- Ast.Call (id, Array.of_list (List.rev args))
-
- (* Simple variable ref. *)
- | [< >] -> Ast.Variable id
- in
- parse_ident id stream
-
- | [< >] -> raise (Stream.Error "unknown token when expecting an expression.")
-
-(* binoprhs
- * ::= ('+' primary)* *)
-and parse_bin_rhs expr_prec lhs stream =
- match Stream.peek stream with
- (* If this is a binop, find its precedence. *)
- | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c ->
- let token_prec = precedence c in
-
- (* If this is a binop that binds at least as tightly as the current binop,
- * consume it, otherwise we are done. *)
- if token_prec < expr_prec then lhs else begin
- (* Eat the binop. *)
- Stream.junk stream;
-
- (* Parse the primary expression after the binary operator. *)
- let rhs = parse_primary stream in
-
- (* Okay, we know this is a binop. *)
- let rhs =
- match Stream.peek stream with
- | Some (Token.Kwd c2) ->
- (* If BinOp binds less tightly with rhs than the operator after
- * rhs, let the pending operator take rhs as its lhs. *)
- let next_prec = precedence c2 in
- if token_prec < next_prec
- then parse_bin_rhs (token_prec + 1) rhs stream
- else rhs
- | _ -> rhs
- in
-
- (* Merge lhs/rhs. *)
- let lhs = Ast.Binary (c, lhs, rhs) in
- parse_bin_rhs expr_prec lhs stream
- end
- | _ -> lhs
-
-(* expression
- * ::= primary binoprhs *)
-and parse_expr = parser
- | [< lhs=parse_primary; stream >] -> parse_bin_rhs 0 lhs stream
-
-(* prototype
- * ::= id '(' id* ')' *)
-let parse_prototype =
- let rec parse_args accumulator = parser
- | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
- | [< >] -> accumulator
- in
-
- parser
- | [< 'Token.Ident id;
- 'Token.Kwd '(' ?? "expected '(' in prototype";
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
- (* success. *)
- Ast.Prototype (id, Array.of_list (List.rev args))
-
- | [< >] ->
- raise (Stream.Error "expected function name in prototype")
-
-(* definition ::= 'def' prototype expression *)
-let parse_definition = parser
- | [< 'Token.Def; p=parse_prototype; e=parse_expr >] ->
- Ast.Function (p, e)
-
-(* toplevelexpr ::= expression *)
-let parse_toplevel = parser
- | [< e=parse_expr >] ->
- (* Make an anonymous proto. *)
- Ast.Function (Ast.Prototype ("", [||]), e)
-
-(* external ::= 'extern' prototype *)
-let parse_extern = parser
- | [< 'Token.Extern; e=parse_prototype >] -> e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/token.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/token.ml
deleted file mode 100644
index 2ca782e..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/token.ml
+++ /dev/null
@@ -1,15 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer Tokens
- *===----------------------------------------------------------------------===*)
-
-(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
- * these others for known things. *)
-type token =
- (* commands *)
- | Def | Extern
-
- (* primary *)
- | Ident of string | Number of float
-
- (* unknown *)
- | Kwd of char
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/toplevel.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/toplevel.ml
deleted file mode 100644
index 01d24ed..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/toplevel.ml
+++ /dev/null
@@ -1,49 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Top-Level parsing and JIT Driver
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-open Llvm_executionengine
-
-(* top ::= definition | external | expression | ';' *)
-let rec main_loop the_fpm the_execution_engine stream =
- match Stream.peek stream with
- | None -> ()
-
- (* ignore top-level semicolons. *)
- | Some (Token.Kwd ';') ->
- Stream.junk stream;
- main_loop the_fpm the_execution_engine stream
-
- | Some token ->
- begin
- try match token with
- | Token.Def ->
- let e = Parser.parse_definition stream in
- print_endline "parsed a function definition.";
- dump_value (Codegen.codegen_func the_fpm e);
- | Token.Extern ->
- let e = Parser.parse_extern stream in
- print_endline "parsed an extern.";
- dump_value (Codegen.codegen_proto e);
- | _ ->
- (* Evaluate a top-level expression into an anonymous function. *)
- let e = Parser.parse_toplevel stream in
- print_endline "parsed a top-level expr";
- let the_function = Codegen.codegen_func the_fpm e in
- dump_value the_function;
-
- (* JIT the function, returning a function pointer. *)
- let result = ExecutionEngine.run_function the_function [||]
- the_execution_engine in
-
- print_string "Evaluated to ";
- print_float (GenericValue.as_float Codegen.double_type result);
- print_newline ();
- with Stream.Error s | Codegen.Error s ->
- (* Skip token for error recovery. *)
- Stream.junk stream;
- print_endline s;
- end;
- print_string "ready> "; flush stdout;
- main_loop the_fpm the_execution_engine stream
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/toy.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/toy.ml
deleted file mode 100644
index 5f9d912..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter4/toy.ml
+++ /dev/null
@@ -1,53 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Main driver code.
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-open Llvm_executionengine
-open Llvm_target
-open Llvm_scalar_opts
-
-let main () =
- ignore (initialize_native_target ());
-
- (* Install standard binary operators.
- * 1 is the lowest precedence. *)
- Hashtbl.add Parser.binop_precedence '<' 10;
- Hashtbl.add Parser.binop_precedence '+' 20;
- Hashtbl.add Parser.binop_precedence '-' 20;
- Hashtbl.add Parser.binop_precedence '*' 40; (* highest. *)
-
- (* Prime the first token. *)
- print_string "ready> "; flush stdout;
- let stream = Lexer.lex (Stream.of_channel stdin) in
-
- (* Create the JIT. *)
- let the_execution_engine = ExecutionEngine.create Codegen.the_module in
- let the_fpm = PassManager.create_function Codegen.the_module in
-
- (* Set up the optimizer pipeline. Start with registering info about how the
- * target lays out data structures. *)
- TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
-
- (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
- add_instruction_combination the_fpm;
-
- (* reassociate expressions. *)
- add_reassociation the_fpm;
-
- (* Eliminate Common SubExpressions. *)
- add_gvn the_fpm;
-
- (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
- add_cfg_simplification the_fpm;
-
- ignore (PassManager.initialize the_fpm);
-
- (* Run the main "interpreter loop" now. *)
- Toplevel.main_loop the_fpm the_execution_engine stream;
-
- (* Print out all the generated code. *)
- dump_module Codegen.the_module
-;;
-
-main ()
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/Makefile b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/Makefile
deleted file mode 100644
index f31c10d..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-##===- examples/OCaml-Kaleidoscope/Chapter5/Makefile -------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-#
-# This is the makefile for the Objective Caml kaleidoscope tutorial, chapter 5.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL := ../../..
-TOOLNAME := OCaml-Kaleidoscope-Ch5
-EXAMPLE_TOOL := 1
-UsedComponents := core
-UsedOcamLibs := llvm llvm_analysis llvm_executionengine llvm_target \
- llvm_scalar_opts
-
-OCAMLCFLAGS += -pp camlp4of
-
-ExcludeSources = $(PROJ_SRC_DIR)/myocamlbuild.ml
-
-include $(LEVEL)/bindings/ocaml/Makefile.ocaml
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/_tags b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/_tags
deleted file mode 100644
index 7a03dba..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/_tags
+++ /dev/null
@@ -1,4 +0,0 @@
-<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
-<*.{byte,native}>: g++, use_llvm, use_llvm_analysis
-<*.{byte,native}>: use_llvm_executionengine, use_llvm_target
-<*.{byte,native}>: use_llvm_scalar_opts, use_bindings
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/ast.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/ast.ml
deleted file mode 100644
index 8a6703d..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/ast.ml
+++ /dev/null
@@ -1,31 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Abstract Syntax Tree (aka Parse Tree)
- *===----------------------------------------------------------------------===*)
-
-(* expr - Base type for all expression nodes. *)
-type expr =
- (* variant for numeric literals like "1.0". *)
- | Number of float
-
- (* variant for referencing a variable, like "a". *)
- | Variable of string
-
- (* variant for a binary operator. *)
- | Binary of char * expr * expr
-
- (* variant for function calls. *)
- | Call of string * expr array
-
- (* variant for if/then/else. *)
- | If of expr * expr * expr
-
- (* variant for for/in. *)
- | For of string * expr * expr * expr option * expr
-
-(* proto - This type represents the "prototype" for a function, which captures
- * its name, and its argument names (thus implicitly the number of arguments the
- * function takes). *)
-type proto = Prototype of string * string array
-
-(* func - This type represents a function definition itself. *)
-type func = Function of proto * expr
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/bindings.c b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/bindings.c
deleted file mode 100644
index 053513b..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/bindings.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-/* putchard - putchar that takes a double and returns 0. */
-extern double putchard(double X) {
- putchar((char)X);
- return 0;
-}
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/codegen.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/codegen.ml
deleted file mode 100644
index e0db2d2..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/codegen.ml
+++ /dev/null
@@ -1,225 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Code Generation
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-
-exception Error of string
-
-let context = global_context ()
-let the_module = create_module context "my cool jit"
-let builder = builder context
-let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
-let double_type = double_type context
-
-let rec codegen_expr = function
- | Ast.Number n -> const_float double_type n
- | Ast.Variable name ->
- (try Hashtbl.find named_values name with
- | Not_found -> raise (Error "unknown variable name"))
- | Ast.Binary (op, lhs, rhs) ->
- let lhs_val = codegen_expr lhs in
- let rhs_val = codegen_expr rhs in
- begin
- match op with
- | '+' -> build_add lhs_val rhs_val "addtmp" builder
- | '-' -> build_sub lhs_val rhs_val "subtmp" builder
- | '*' -> build_mul lhs_val rhs_val "multmp" builder
- | '<' ->
- (* Convert bool 0/1 to double 0.0 or 1.0 *)
- let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
- build_uitofp i double_type "booltmp" builder
- | _ -> raise (Error "invalid binary operator")
- end
- | Ast.Call (callee, args) ->
- (* Look up the name in the module table. *)
- let callee =
- match lookup_function callee the_module with
- | Some callee -> callee
- | None -> raise (Error "unknown function referenced")
- in
- let params = params callee in
-
- (* If argument mismatch error. *)
- if Array.length params == Array.length args then () else
- raise (Error "incorrect # arguments passed");
- let args = Array.map codegen_expr args in
- build_call callee args "calltmp" builder
- | Ast.If (cond, then_, else_) ->
- let cond = codegen_expr cond in
-
- (* Convert condition to a bool by comparing equal to 0.0 *)
- let zero = const_float double_type 0.0 in
- let cond_val = build_fcmp Fcmp.One cond zero "ifcond" builder in
-
- (* Grab the first block so that we might later add the conditional branch
- * to it at the end of the function. *)
- let start_bb = insertion_block builder in
- let the_function = block_parent start_bb in
-
- let then_bb = append_block context "then" the_function in
-
- (* Emit 'then' value. *)
- position_at_end then_bb builder;
- let then_val = codegen_expr then_ in
-
- (* Codegen of 'then' can change the current block, update then_bb for the
- * phi. We create a new name because one is used for the phi node, and the
- * other is used for the conditional branch. *)
- let new_then_bb = insertion_block builder in
-
- (* Emit 'else' value. *)
- let else_bb = append_block context "else" the_function in
- position_at_end else_bb builder;
- let else_val = codegen_expr else_ in
-
- (* Codegen of 'else' can change the current block, update else_bb for the
- * phi. *)
- let new_else_bb = insertion_block builder in
-
- (* Emit merge block. *)
- let merge_bb = append_block context "ifcont" the_function in
- position_at_end merge_bb builder;
- let incoming = [(then_val, new_then_bb); (else_val, new_else_bb)] in
- let phi = build_phi incoming "iftmp" builder in
-
- (* Return to the start block to add the conditional branch. *)
- position_at_end start_bb builder;
- ignore (build_cond_br cond_val then_bb else_bb builder);
-
- (* Set a unconditional branch at the end of the 'then' block and the
- * 'else' block to the 'merge' block. *)
- position_at_end new_then_bb builder; ignore (build_br merge_bb builder);
- position_at_end new_else_bb builder; ignore (build_br merge_bb builder);
-
- (* Finally, set the builder to the end of the merge block. *)
- position_at_end merge_bb builder;
-
- phi
- | Ast.For (var_name, start, end_, step, body) ->
- (* Emit the start code first, without 'variable' in scope. *)
- let start_val = codegen_expr start in
-
- (* Make the new basic block for the loop header, inserting after current
- * block. *)
- let preheader_bb = insertion_block builder in
- let the_function = block_parent preheader_bb in
- let loop_bb = append_block context "loop" the_function in
-
- (* Insert an explicit fall through from the current block to the
- * loop_bb. *)
- ignore (build_br loop_bb builder);
-
- (* Start insertion in loop_bb. *)
- position_at_end loop_bb builder;
-
- (* Start the PHI node with an entry for start. *)
- let variable = build_phi [(start_val, preheader_bb)] var_name builder in
-
- (* Within the loop, the variable is defined equal to the PHI node. If it
- * shadows an existing variable, we have to restore it, so save it
- * now. *)
- let old_val =
- try Some (Hashtbl.find named_values var_name) with Not_found -> None
- in
- Hashtbl.add named_values var_name variable;
-
- (* Emit the body of the loop. This, like any other expr, can change the
- * current BB. Note that we ignore the value computed by the body, but
- * don't allow an error *)
- ignore (codegen_expr body);
-
- (* Emit the step value. *)
- let step_val =
- match step with
- | Some step -> codegen_expr step
- (* If not specified, use 1.0. *)
- | None -> const_float double_type 1.0
- in
-
- let next_var = build_add variable step_val "nextvar" builder in
-
- (* Compute the end condition. *)
- let end_cond = codegen_expr end_ in
-
- (* Convert condition to a bool by comparing equal to 0.0. *)
- let zero = const_float double_type 0.0 in
- let end_cond = build_fcmp Fcmp.One end_cond zero "loopcond" builder in
-
- (* Create the "after loop" block and insert it. *)
- let loop_end_bb = insertion_block builder in
- let after_bb = append_block context "afterloop" the_function in
-
- (* Insert the conditional branch into the end of loop_end_bb. *)
- ignore (build_cond_br end_cond loop_bb after_bb builder);
-
- (* Any new code will be inserted in after_bb. *)
- position_at_end after_bb builder;
-
- (* Add a new entry to the PHI node for the backedge. *)
- add_incoming (next_var, loop_end_bb) variable;
-
- (* Restore the unshadowed variable. *)
- begin match old_val with
- | Some old_val -> Hashtbl.add named_values var_name old_val
- | None -> ()
- end;
-
- (* for expr always returns 0.0. *)
- const_null double_type
-
-let codegen_proto = function
- | Ast.Prototype (name, args) ->
- (* Make the function type: double(double,double) etc. *)
- let doubles = Array.make (Array.length args) double_type in
- let ft = function_type double_type doubles in
- let f =
- match lookup_function name the_module with
- | None -> declare_function name ft the_module
-
- (* If 'f' conflicted, there was already something named 'name'. If it
- * has a body, don't allow redefinition or reextern. *)
- | Some f ->
- (* If 'f' already has a body, reject this. *)
- if block_begin f <> At_end f then
- raise (Error "redefinition of function");
-
- (* If 'f' took a different number of arguments, reject. *)
- if element_type (type_of f) <> ft then
- raise (Error "redefinition of function with different # args");
- f
- in
-
- (* Set names for all arguments. *)
- Array.iteri (fun i a ->
- let n = args.(i) in
- set_value_name n a;
- Hashtbl.add named_values n a;
- ) (params f);
- f
-
-let codegen_func the_fpm = function
- | Ast.Function (proto, body) ->
- Hashtbl.clear named_values;
- let the_function = codegen_proto proto in
-
- (* Create a new basic block to start insertion into. *)
- let bb = append_block context "entry" the_function in
- position_at_end bb builder;
-
- try
- let ret_val = codegen_expr body in
-
- (* Finish off the function. *)
- let _ = build_ret ret_val builder in
-
- (* Validate the generated code, checking for consistency. *)
- Llvm_analysis.assert_valid_function the_function;
-
- (* Optimize the function. *)
- let _ = PassManager.run_function the_function the_fpm in
-
- the_function
- with e ->
- delete_function the_function;
- raise e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/lexer.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/lexer.ml
deleted file mode 100644
index d8c1d56..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/lexer.ml
+++ /dev/null
@@ -1,57 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer
- *===----------------------------------------------------------------------===*)
-
-let rec lex = parser
- (* Skip any whitespace. *)
- | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
-
- (* identifier: [a-zA-Z][a-zA-Z0-9] *)
- | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_ident buffer stream
-
- (* number: [0-9.]+ *)
- | [< ' ('0' .. '9' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_number buffer stream
-
- (* Comment until end of line. *)
- | [< ' ('#'); stream >] ->
- lex_comment stream
-
- (* Otherwise, just return the character as its ascii value. *)
- | [< 'c; stream >] ->
- [< 'Token.Kwd c; lex stream >]
-
- (* end of stream. *)
- | [< >] -> [< >]
-
-and lex_number buffer = parser
- | [< ' ('0' .. '9' | '.' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_number buffer stream
- | [< stream=lex >] ->
- [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
-
-and lex_ident buffer = parser
- | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_ident buffer stream
- | [< stream=lex >] ->
- match Buffer.contents buffer with
- | "def" -> [< 'Token.Def; stream >]
- | "extern" -> [< 'Token.Extern; stream >]
- | "if" -> [< 'Token.If; stream >]
- | "then" -> [< 'Token.Then; stream >]
- | "else" -> [< 'Token.Else; stream >]
- | "for" -> [< 'Token.For; stream >]
- | "in" -> [< 'Token.In; stream >]
- | id -> [< 'Token.Ident id; stream >]
-
-and lex_comment = parser
- | [< ' ('\n'); stream=lex >] -> stream
- | [< 'c; e=lex_comment >] -> e
- | [< >] -> [< >]
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/myocamlbuild.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/myocamlbuild.ml
deleted file mode 100644
index ff42664..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/myocamlbuild.ml
+++ /dev/null
@@ -1,10 +0,0 @@
-open Ocamlbuild_plugin;;
-
-ocaml_lib ~extern:true "llvm";;
-ocaml_lib ~extern:true "llvm_analysis";;
-ocaml_lib ~extern:true "llvm_executionengine";;
-ocaml_lib ~extern:true "llvm_target";;
-ocaml_lib ~extern:true "llvm_scalar_opts";;
-
-flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"]);;
-dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];;
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/parser.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/parser.ml
deleted file mode 100644
index bfb4f16..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/parser.ml
+++ /dev/null
@@ -1,158 +0,0 @@
-(*===---------------------------------------------------------------------===
- * Parser
- *===---------------------------------------------------------------------===*)
-
-(* binop_precedence - This holds the precedence for each binary operator that is
- * defined *)
-let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10
-
-(* precedence - Get the precedence of the pending binary operator token. *)
-let precedence c = try Hashtbl.find binop_precedence c with Not_found -> -1
-
-(* primary
- * ::= identifier
- * ::= numberexpr
- * ::= parenexpr
- * ::= ifexpr
- * ::= forexpr *)
-let rec parse_primary = parser
- (* numberexpr ::= number *)
- | [< 'Token.Number n >] -> Ast.Number n
-
- (* parenexpr ::= '(' expression ')' *)
- | [< 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" >] -> e
-
- (* identifierexpr
- * ::= identifier
- * ::= identifier '(' argumentexpr ')' *)
- | [< 'Token.Ident id; stream >] ->
- let rec parse_args accumulator = parser
- | [< e=parse_expr; stream >] ->
- begin parser
- | [< 'Token.Kwd ','; e=parse_args (e :: accumulator) >] -> e
- | [< >] -> e :: accumulator
- end stream
- | [< >] -> accumulator
- in
- let rec parse_ident id = parser
- (* Call. *)
- | [< 'Token.Kwd '(';
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')'">] ->
- Ast.Call (id, Array.of_list (List.rev args))
-
- (* Simple variable ref. *)
- | [< >] -> Ast.Variable id
- in
- parse_ident id stream
-
- (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
- | [< 'Token.If; c=parse_expr;
- 'Token.Then ?? "expected 'then'"; t=parse_expr;
- 'Token.Else ?? "expected 'else'"; e=parse_expr >] ->
- Ast.If (c, t, e)
-
- (* forexpr
- ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression *)
- | [< 'Token.For;
- 'Token.Ident id ?? "expected identifier after for";
- 'Token.Kwd '=' ?? "expected '=' after for";
- stream >] ->
- begin parser
- | [<
- start=parse_expr;
- 'Token.Kwd ',' ?? "expected ',' after for";
- end_=parse_expr;
- stream >] ->
- let step =
- begin parser
- | [< 'Token.Kwd ','; step=parse_expr >] -> Some step
- | [< >] -> None
- end stream
- in
- begin parser
- | [< 'Token.In; body=parse_expr >] ->
- Ast.For (id, start, end_, step, body)
- | [< >] ->
- raise (Stream.Error "expected 'in' after for")
- end stream
- | [< >] ->
- raise (Stream.Error "expected '=' after for")
- end stream
-
- | [< >] -> raise (Stream.Error "unknown token when expecting an expression.")
-
-(* binoprhs
- * ::= ('+' primary)* *)
-and parse_bin_rhs expr_prec lhs stream =
- match Stream.peek stream with
- (* If this is a binop, find its precedence. *)
- | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c ->
- let token_prec = precedence c in
-
- (* If this is a binop that binds at least as tightly as the current binop,
- * consume it, otherwise we are done. *)
- if token_prec < expr_prec then lhs else begin
- (* Eat the binop. *)
- Stream.junk stream;
-
- (* Parse the primary expression after the binary operator. *)
- let rhs = parse_primary stream in
-
- (* Okay, we know this is a binop. *)
- let rhs =
- match Stream.peek stream with
- | Some (Token.Kwd c2) ->
- (* If BinOp binds less tightly with rhs than the operator after
- * rhs, let the pending operator take rhs as its lhs. *)
- let next_prec = precedence c2 in
- if token_prec < next_prec
- then parse_bin_rhs (token_prec + 1) rhs stream
- else rhs
- | _ -> rhs
- in
-
- (* Merge lhs/rhs. *)
- let lhs = Ast.Binary (c, lhs, rhs) in
- parse_bin_rhs expr_prec lhs stream
- end
- | _ -> lhs
-
-(* expression
- * ::= primary binoprhs *)
-and parse_expr = parser
- | [< lhs=parse_primary; stream >] -> parse_bin_rhs 0 lhs stream
-
-(* prototype
- * ::= id '(' id* ')' *)
-let parse_prototype =
- let rec parse_args accumulator = parser
- | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
- | [< >] -> accumulator
- in
-
- parser
- | [< 'Token.Ident id;
- 'Token.Kwd '(' ?? "expected '(' in prototype";
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
- (* success. *)
- Ast.Prototype (id, Array.of_list (List.rev args))
-
- | [< >] ->
- raise (Stream.Error "expected function name in prototype")
-
-(* definition ::= 'def' prototype expression *)
-let parse_definition = parser
- | [< 'Token.Def; p=parse_prototype; e=parse_expr >] ->
- Ast.Function (p, e)
-
-(* toplevelexpr ::= expression *)
-let parse_toplevel = parser
- | [< e=parse_expr >] ->
- (* Make an anonymous proto. *)
- Ast.Function (Ast.Prototype ("", [||]), e)
-
-(* external ::= 'extern' prototype *)
-let parse_extern = parser
- | [< 'Token.Extern; e=parse_prototype >] -> e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/token.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/token.ml
deleted file mode 100644
index 5eb502f..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/token.ml
+++ /dev/null
@@ -1,19 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer Tokens
- *===----------------------------------------------------------------------===*)
-
-(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
- * these others for known things. *)
-type token =
- (* commands *)
- | Def | Extern
-
- (* primary *)
- | Ident of string | Number of float
-
- (* unknown *)
- | Kwd of char
-
- (* control *)
- | If | Then | Else
- | For | In
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/toplevel.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/toplevel.ml
deleted file mode 100644
index 01d24ed..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/toplevel.ml
+++ /dev/null
@@ -1,49 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Top-Level parsing and JIT Driver
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-open Llvm_executionengine
-
-(* top ::= definition | external | expression | ';' *)
-let rec main_loop the_fpm the_execution_engine stream =
- match Stream.peek stream with
- | None -> ()
-
- (* ignore top-level semicolons. *)
- | Some (Token.Kwd ';') ->
- Stream.junk stream;
- main_loop the_fpm the_execution_engine stream
-
- | Some token ->
- begin
- try match token with
- | Token.Def ->
- let e = Parser.parse_definition stream in
- print_endline "parsed a function definition.";
- dump_value (Codegen.codegen_func the_fpm e);
- | Token.Extern ->
- let e = Parser.parse_extern stream in
- print_endline "parsed an extern.";
- dump_value (Codegen.codegen_proto e);
- | _ ->
- (* Evaluate a top-level expression into an anonymous function. *)
- let e = Parser.parse_toplevel stream in
- print_endline "parsed a top-level expr";
- let the_function = Codegen.codegen_func the_fpm e in
- dump_value the_function;
-
- (* JIT the function, returning a function pointer. *)
- let result = ExecutionEngine.run_function the_function [||]
- the_execution_engine in
-
- print_string "Evaluated to ";
- print_float (GenericValue.as_float Codegen.double_type result);
- print_newline ();
- with Stream.Error s | Codegen.Error s ->
- (* Skip token for error recovery. *)
- Stream.junk stream;
- print_endline s;
- end;
- print_string "ready> "; flush stdout;
- main_loop the_fpm the_execution_engine stream
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/toy.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/toy.ml
deleted file mode 100644
index 5f9d912..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter5/toy.ml
+++ /dev/null
@@ -1,53 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Main driver code.
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-open Llvm_executionengine
-open Llvm_target
-open Llvm_scalar_opts
-
-let main () =
- ignore (initialize_native_target ());
-
- (* Install standard binary operators.
- * 1 is the lowest precedence. *)
- Hashtbl.add Parser.binop_precedence '<' 10;
- Hashtbl.add Parser.binop_precedence '+' 20;
- Hashtbl.add Parser.binop_precedence '-' 20;
- Hashtbl.add Parser.binop_precedence '*' 40; (* highest. *)
-
- (* Prime the first token. *)
- print_string "ready> "; flush stdout;
- let stream = Lexer.lex (Stream.of_channel stdin) in
-
- (* Create the JIT. *)
- let the_execution_engine = ExecutionEngine.create Codegen.the_module in
- let the_fpm = PassManager.create_function Codegen.the_module in
-
- (* Set up the optimizer pipeline. Start with registering info about how the
- * target lays out data structures. *)
- TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
-
- (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
- add_instruction_combination the_fpm;
-
- (* reassociate expressions. *)
- add_reassociation the_fpm;
-
- (* Eliminate Common SubExpressions. *)
- add_gvn the_fpm;
-
- (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
- add_cfg_simplification the_fpm;
-
- ignore (PassManager.initialize the_fpm);
-
- (* Run the main "interpreter loop" now. *)
- Toplevel.main_loop the_fpm the_execution_engine stream;
-
- (* Print out all the generated code. *)
- dump_module Codegen.the_module
-;;
-
-main ()
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/Makefile b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/Makefile
deleted file mode 100644
index 8312138..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-##===- examples/OCaml-Kaleidoscope/Chapter6/Makefile -------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-#
-# This is the makefile for the Objective Caml kaleidoscope tutorial, chapter 6.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL := ../../..
-TOOLNAME := OCaml-Kaleidoscope-Ch6
-EXAMPLE_TOOL := 1
-UsedComponents := core
-UsedOcamLibs := llvm llvm_analysis llvm_executionengine llvm_target \
- llvm_scalar_opts
-
-OCAMLCFLAGS += -pp camlp4of
-
-ExcludeSources = $(PROJ_SRC_DIR)/myocamlbuild.ml
-
-include $(LEVEL)/bindings/ocaml/Makefile.ocaml
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/_tags b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/_tags
deleted file mode 100644
index 7a03dba..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/_tags
+++ /dev/null
@@ -1,4 +0,0 @@
-<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
-<*.{byte,native}>: g++, use_llvm, use_llvm_analysis
-<*.{byte,native}>: use_llvm_executionengine, use_llvm_target
-<*.{byte,native}>: use_llvm_scalar_opts, use_bindings
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/ast.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/ast.ml
deleted file mode 100644
index 99088cf..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/ast.ml
+++ /dev/null
@@ -1,36 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Abstract Syntax Tree (aka Parse Tree)
- *===----------------------------------------------------------------------===*)
-
-(* expr - Base type for all expression nodes. *)
-type expr =
- (* variant for numeric literals like "1.0". *)
- | Number of float
-
- (* variant for referencing a variable, like "a". *)
- | Variable of string
-
- (* variant for a unary operator. *)
- | Unary of char * expr
-
- (* variant for a binary operator. *)
- | Binary of char * expr * expr
-
- (* variant for function calls. *)
- | Call of string * expr array
-
- (* variant for if/then/else. *)
- | If of expr * expr * expr
-
- (* variant for for/in. *)
- | For of string * expr * expr * expr option * expr
-
-(* proto - This type represents the "prototype" for a function, which captures
- * its name, and its argument names (thus implicitly the number of arguments the
- * function takes). *)
-type proto =
- | Prototype of string * string array
- | BinOpPrototype of string * string array * int
-
-(* func - This type represents a function definition itself. *)
-type func = Function of proto * expr
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/bindings.c b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/bindings.c
deleted file mode 100644
index 90faed1..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/bindings.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-/* putchard - putchar that takes a double and returns 0. */
-extern double putchard(double X) {
- putchar((char)X);
- return 0;
-}
-
-/* printd - printf that takes a double prints it as "%f\n", returning 0. */
-extern double printd(double X) {
- printf("%f\n", X);
- return 0;
-}
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/codegen.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/codegen.ml
deleted file mode 100644
index e00edf2..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/codegen.ml
+++ /dev/null
@@ -1,251 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Code Generation
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-
-exception Error of string
-
-let context = global_context ()
-let the_module = create_module context "my cool jit"
-let builder = builder context
-let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
-let double_type = double_type context
-
-let rec codegen_expr = function
- | Ast.Number n -> const_float double_type n
- | Ast.Variable name ->
- (try Hashtbl.find named_values name with
- | Not_found -> raise (Error "unknown variable name"))
- | Ast.Unary (op, operand) ->
- let operand = codegen_expr operand in
- let callee = "unary" ^ (String.make 1 op) in
- let callee =
- match lookup_function callee the_module with
- | Some callee -> callee
- | None -> raise (Error "unknown unary operator")
- in
- build_call callee [|operand|] "unop" builder
- | Ast.Binary (op, lhs, rhs) ->
- let lhs_val = codegen_expr lhs in
- let rhs_val = codegen_expr rhs in
- begin
- match op with
- | '+' -> build_add lhs_val rhs_val "addtmp" builder
- | '-' -> build_sub lhs_val rhs_val "subtmp" builder
- | '*' -> build_mul lhs_val rhs_val "multmp" builder
- | '<' ->
- (* Convert bool 0/1 to double 0.0 or 1.0 *)
- let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
- build_uitofp i double_type "booltmp" builder
- | _ ->
- (* If it wasn't a builtin binary operator, it must be a user defined
- * one. Emit a call to it. *)
- let callee = "binary" ^ (String.make 1 op) in
- let callee =
- match lookup_function callee the_module with
- | Some callee -> callee
- | None -> raise (Error "binary operator not found!")
- in
- build_call callee [|lhs_val; rhs_val|] "binop" builder
- end
- | Ast.Call (callee, args) ->
- (* Look up the name in the module table. *)
- let callee =
- match lookup_function callee the_module with
- | Some callee -> callee
- | None -> raise (Error "unknown function referenced")
- in
- let params = params callee in
-
- (* If argument mismatch error. *)
- if Array.length params == Array.length args then () else
- raise (Error "incorrect # arguments passed");
- let args = Array.map codegen_expr args in
- build_call callee args "calltmp" builder
- | Ast.If (cond, then_, else_) ->
- let cond = codegen_expr cond in
-
- (* Convert condition to a bool by comparing equal to 0.0 *)
- let zero = const_float double_type 0.0 in
- let cond_val = build_fcmp Fcmp.One cond zero "ifcond" builder in
-
- (* Grab the first block so that we might later add the conditional branch
- * to it at the end of the function. *)
- let start_bb = insertion_block builder in
- let the_function = block_parent start_bb in
-
- let then_bb = append_block context "then" the_function in
-
- (* Emit 'then' value. *)
- position_at_end then_bb builder;
- let then_val = codegen_expr then_ in
-
- (* Codegen of 'then' can change the current block, update then_bb for the
- * phi. We create a new name because one is used for the phi node, and the
- * other is used for the conditional branch. *)
- let new_then_bb = insertion_block builder in
-
- (* Emit 'else' value. *)
- let else_bb = append_block context "else" the_function in
- position_at_end else_bb builder;
- let else_val = codegen_expr else_ in
-
- (* Codegen of 'else' can change the current block, update else_bb for the
- * phi. *)
- let new_else_bb = insertion_block builder in
-
- (* Emit merge block. *)
- let merge_bb = append_block context "ifcont" the_function in
- position_at_end merge_bb builder;
- let incoming = [(then_val, new_then_bb); (else_val, new_else_bb)] in
- let phi = build_phi incoming "iftmp" builder in
-
- (* Return to the start block to add the conditional branch. *)
- position_at_end start_bb builder;
- ignore (build_cond_br cond_val then_bb else_bb builder);
-
- (* Set a unconditional branch at the end of the 'then' block and the
- * 'else' block to the 'merge' block. *)
- position_at_end new_then_bb builder; ignore (build_br merge_bb builder);
- position_at_end new_else_bb builder; ignore (build_br merge_bb builder);
-
- (* Finally, set the builder to the end of the merge block. *)
- position_at_end merge_bb builder;
-
- phi
- | Ast.For (var_name, start, end_, step, body) ->
- (* Emit the start code first, without 'variable' in scope. *)
- let start_val = codegen_expr start in
-
- (* Make the new basic block for the loop header, inserting after current
- * block. *)
- let preheader_bb = insertion_block builder in
- let the_function = block_parent preheader_bb in
- let loop_bb = append_block context "loop" the_function in
-
- (* Insert an explicit fall through from the current block to the
- * loop_bb. *)
- ignore (build_br loop_bb builder);
-
- (* Start insertion in loop_bb. *)
- position_at_end loop_bb builder;
-
- (* Start the PHI node with an entry for start. *)
- let variable = build_phi [(start_val, preheader_bb)] var_name builder in
-
- (* Within the loop, the variable is defined equal to the PHI node. If it
- * shadows an existing variable, we have to restore it, so save it
- * now. *)
- let old_val =
- try Some (Hashtbl.find named_values var_name) with Not_found -> None
- in
- Hashtbl.add named_values var_name variable;
-
- (* Emit the body of the loop. This, like any other expr, can change the
- * current BB. Note that we ignore the value computed by the body, but
- * don't allow an error *)
- ignore (codegen_expr body);
-
- (* Emit the step value. *)
- let step_val =
- match step with
- | Some step -> codegen_expr step
- (* If not specified, use 1.0. *)
- | None -> const_float double_type 1.0
- in
-
- let next_var = build_add variable step_val "nextvar" builder in
-
- (* Compute the end condition. *)
- let end_cond = codegen_expr end_ in
-
- (* Convert condition to a bool by comparing equal to 0.0. *)
- let zero = const_float double_type 0.0 in
- let end_cond = build_fcmp Fcmp.One end_cond zero "loopcond" builder in
-
- (* Create the "after loop" block and insert it. *)
- let loop_end_bb = insertion_block builder in
- let after_bb = append_block context "afterloop" the_function in
-
- (* Insert the conditional branch into the end of loop_end_bb. *)
- ignore (build_cond_br end_cond loop_bb after_bb builder);
-
- (* Any new code will be inserted in after_bb. *)
- position_at_end after_bb builder;
-
- (* Add a new entry to the PHI node for the backedge. *)
- add_incoming (next_var, loop_end_bb) variable;
-
- (* Restore the unshadowed variable. *)
- begin match old_val with
- | Some old_val -> Hashtbl.add named_values var_name old_val
- | None -> ()
- end;
-
- (* for expr always returns 0.0. *)
- const_null double_type
-
-let codegen_proto = function
- | Ast.Prototype (name, args) | Ast.BinOpPrototype (name, args, _) ->
- (* Make the function type: double(double,double) etc. *)
- let doubles = Array.make (Array.length args) double_type in
- let ft = function_type double_type doubles in
- let f =
- match lookup_function name the_module with
- | None -> declare_function name ft the_module
-
- (* If 'f' conflicted, there was already something named 'name'. If it
- * has a body, don't allow redefinition or reextern. *)
- | Some f ->
- (* If 'f' already has a body, reject this. *)
- if block_begin f <> At_end f then
- raise (Error "redefinition of function");
-
- (* If 'f' took a different number of arguments, reject. *)
- if element_type (type_of f) <> ft then
- raise (Error "redefinition of function with different # args");
- f
- in
-
- (* Set names for all arguments. *)
- Array.iteri (fun i a ->
- let n = args.(i) in
- set_value_name n a;
- Hashtbl.add named_values n a;
- ) (params f);
- f
-
-let codegen_func the_fpm = function
- | Ast.Function (proto, body) ->
- Hashtbl.clear named_values;
- let the_function = codegen_proto proto in
-
- (* If this is an operator, install it. *)
- begin match proto with
- | Ast.BinOpPrototype (name, args, prec) ->
- let op = name.[String.length name - 1] in
- Hashtbl.add Parser.binop_precedence op prec;
- | _ -> ()
- end;
-
- (* Create a new basic block to start insertion into. *)
- let bb = append_block context "entry" the_function in
- position_at_end bb builder;
-
- try
- let ret_val = codegen_expr body in
-
- (* Finish off the function. *)
- let _ = build_ret ret_val builder in
-
- (* Validate the generated code, checking for consistency. *)
- Llvm_analysis.assert_valid_function the_function;
-
- (* Optimize the function. *)
- let _ = PassManager.run_function the_function the_fpm in
-
- the_function
- with e ->
- delete_function the_function;
- raise e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/lexer.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/lexer.ml
deleted file mode 100644
index 5fe9da4..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/lexer.ml
+++ /dev/null
@@ -1,59 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer
- *===----------------------------------------------------------------------===*)
-
-let rec lex = parser
- (* Skip any whitespace. *)
- | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
-
- (* identifier: [a-zA-Z][a-zA-Z0-9] *)
- | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_ident buffer stream
-
- (* number: [0-9.]+ *)
- | [< ' ('0' .. '9' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_number buffer stream
-
- (* Comment until end of line. *)
- | [< ' ('#'); stream >] ->
- lex_comment stream
-
- (* Otherwise, just return the character as its ascii value. *)
- | [< 'c; stream >] ->
- [< 'Token.Kwd c; lex stream >]
-
- (* end of stream. *)
- | [< >] -> [< >]
-
-and lex_number buffer = parser
- | [< ' ('0' .. '9' | '.' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_number buffer stream
- | [< stream=lex >] ->
- [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
-
-and lex_ident buffer = parser
- | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_ident buffer stream
- | [< stream=lex >] ->
- match Buffer.contents buffer with
- | "def" -> [< 'Token.Def; stream >]
- | "extern" -> [< 'Token.Extern; stream >]
- | "if" -> [< 'Token.If; stream >]
- | "then" -> [< 'Token.Then; stream >]
- | "else" -> [< 'Token.Else; stream >]
- | "for" -> [< 'Token.For; stream >]
- | "in" -> [< 'Token.In; stream >]
- | "binary" -> [< 'Token.Binary; stream >]
- | "unary" -> [< 'Token.Unary; stream >]
- | id -> [< 'Token.Ident id; stream >]
-
-and lex_comment = parser
- | [< ' ('\n'); stream=lex >] -> stream
- | [< 'c; e=lex_comment >] -> e
- | [< >] -> [< >]
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/myocamlbuild.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/myocamlbuild.ml
deleted file mode 100644
index 54d3fd9..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/myocamlbuild.ml
+++ /dev/null
@@ -1,10 +0,0 @@
-open Ocamlbuild_plugin;;
-
-ocaml_lib ~extern:true "llvm";;
-ocaml_lib ~extern:true "llvm_analysis";;
-ocaml_lib ~extern:true "llvm_executionengine";;
-ocaml_lib ~extern:true "llvm_target";;
-ocaml_lib ~extern:true "llvm_scalar_opts";;
-
-flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"; A"-cclib"; A"-rdynamic"]);;
-dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];;
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/parser.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/parser.ml
deleted file mode 100644
index da443c5..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/parser.ml
+++ /dev/null
@@ -1,195 +0,0 @@
-(*===---------------------------------------------------------------------===
- * Parser
- *===---------------------------------------------------------------------===*)
-
-(* binop_precedence - This holds the precedence for each binary operator that is
- * defined *)
-let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10
-
-(* precedence - Get the precedence of the pending binary operator token. *)
-let precedence c = try Hashtbl.find binop_precedence c with Not_found -> -1
-
-(* primary
- * ::= identifier
- * ::= numberexpr
- * ::= parenexpr
- * ::= ifexpr
- * ::= forexpr *)
-let rec parse_primary = parser
- (* numberexpr ::= number *)
- | [< 'Token.Number n >] -> Ast.Number n
-
- (* parenexpr ::= '(' expression ')' *)
- | [< 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" >] -> e
-
- (* identifierexpr
- * ::= identifier
- * ::= identifier '(' argumentexpr ')' *)
- | [< 'Token.Ident id; stream >] ->
- let rec parse_args accumulator = parser
- | [< e=parse_expr; stream >] ->
- begin parser
- | [< 'Token.Kwd ','; e=parse_args (e :: accumulator) >] -> e
- | [< >] -> e :: accumulator
- end stream
- | [< >] -> accumulator
- in
- let rec parse_ident id = parser
- (* Call. *)
- | [< 'Token.Kwd '(';
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')'">] ->
- Ast.Call (id, Array.of_list (List.rev args))
-
- (* Simple variable ref. *)
- | [< >] -> Ast.Variable id
- in
- parse_ident id stream
-
- (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
- | [< 'Token.If; c=parse_expr;
- 'Token.Then ?? "expected 'then'"; t=parse_expr;
- 'Token.Else ?? "expected 'else'"; e=parse_expr >] ->
- Ast.If (c, t, e)
-
- (* forexpr
- ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression *)
- | [< 'Token.For;
- 'Token.Ident id ?? "expected identifier after for";
- 'Token.Kwd '=' ?? "expected '=' after for";
- stream >] ->
- begin parser
- | [<
- start=parse_expr;
- 'Token.Kwd ',' ?? "expected ',' after for";
- end_=parse_expr;
- stream >] ->
- let step =
- begin parser
- | [< 'Token.Kwd ','; step=parse_expr >] -> Some step
- | [< >] -> None
- end stream
- in
- begin parser
- | [< 'Token.In; body=parse_expr >] ->
- Ast.For (id, start, end_, step, body)
- | [< >] ->
- raise (Stream.Error "expected 'in' after for")
- end stream
- | [< >] ->
- raise (Stream.Error "expected '=' after for")
- end stream
-
- | [< >] -> raise (Stream.Error "unknown token when expecting an expression.")
-
-(* unary
- * ::= primary
- * ::= '!' unary *)
-and parse_unary = parser
- (* If this is a unary operator, read it. *)
- | [< 'Token.Kwd op when op != '(' && op != ')'; operand=parse_expr >] ->
- Ast.Unary (op, operand)
-
- (* If the current token is not an operator, it must be a primary expr. *)
- | [< stream >] -> parse_primary stream
-
-(* binoprhs
- * ::= ('+' primary)* *)
-and parse_bin_rhs expr_prec lhs stream =
- match Stream.peek stream with
- (* If this is a binop, find its precedence. *)
- | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c ->
- let token_prec = precedence c in
-
- (* If this is a binop that binds at least as tightly as the current binop,
- * consume it, otherwise we are done. *)
- if token_prec < expr_prec then lhs else begin
- (* Eat the binop. *)
- Stream.junk stream;
-
- (* Parse the unary expression after the binary operator. *)
- let rhs = parse_unary stream in
-
- (* Okay, we know this is a binop. *)
- let rhs =
- match Stream.peek stream with
- | Some (Token.Kwd c2) ->
- (* If BinOp binds less tightly with rhs than the operator after
- * rhs, let the pending operator take rhs as its lhs. *)
- let next_prec = precedence c2 in
- if token_prec < next_prec
- then parse_bin_rhs (token_prec + 1) rhs stream
- else rhs
- | _ -> rhs
- in
-
- (* Merge lhs/rhs. *)
- let lhs = Ast.Binary (c, lhs, rhs) in
- parse_bin_rhs expr_prec lhs stream
- end
- | _ -> lhs
-
-(* expression
- * ::= primary binoprhs *)
-and parse_expr = parser
- | [< lhs=parse_unary; stream >] -> parse_bin_rhs 0 lhs stream
-
-(* prototype
- * ::= id '(' id* ')'
- * ::= binary LETTER number? (id, id)
- * ::= unary LETTER number? (id) *)
-let parse_prototype =
- let rec parse_args accumulator = parser
- | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
- | [< >] -> accumulator
- in
- let parse_operator = parser
- | [< 'Token.Unary >] -> "unary", 1
- | [< 'Token.Binary >] -> "binary", 2
- in
- let parse_binary_precedence = parser
- | [< 'Token.Number n >] -> int_of_float n
- | [< >] -> 30
- in
- parser
- | [< 'Token.Ident id;
- 'Token.Kwd '(' ?? "expected '(' in prototype";
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
- (* success. *)
- Ast.Prototype (id, Array.of_list (List.rev args))
- | [< (prefix, kind)=parse_operator;
- 'Token.Kwd op ?? "expected an operator";
- (* Read the precedence if present. *)
- binary_precedence=parse_binary_precedence;
- 'Token.Kwd '(' ?? "expected '(' in prototype";
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
- let name = prefix ^ (String.make 1 op) in
- let args = Array.of_list (List.rev args) in
-
- (* Verify right number of arguments for operator. *)
- if Array.length args != kind
- then raise (Stream.Error "invalid number of operands for operator")
- else
- if kind == 1 then
- Ast.Prototype (name, args)
- else
- Ast.BinOpPrototype (name, args, binary_precedence)
- | [< >] ->
- raise (Stream.Error "expected function name in prototype")
-
-(* definition ::= 'def' prototype expression *)
-let parse_definition = parser
- | [< 'Token.Def; p=parse_prototype; e=parse_expr >] ->
- Ast.Function (p, e)
-
-(* toplevelexpr ::= expression *)
-let parse_toplevel = parser
- | [< e=parse_expr >] ->
- (* Make an anonymous proto. *)
- Ast.Function (Ast.Prototype ("", [||]), e)
-
-(* external ::= 'extern' prototype *)
-let parse_extern = parser
- | [< 'Token.Extern; e=parse_prototype >] -> e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/token.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/token.ml
deleted file mode 100644
index c7a5f95..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/token.ml
+++ /dev/null
@@ -1,22 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer Tokens
- *===----------------------------------------------------------------------===*)
-
-(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
- * these others for known things. *)
-type token =
- (* commands *)
- | Def | Extern
-
- (* primary *)
- | Ident of string | Number of float
-
- (* unknown *)
- | Kwd of char
-
- (* control *)
- | If | Then | Else
- | For | In
-
- (* operators *)
- | Binary | Unary
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/toplevel.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/toplevel.ml
deleted file mode 100644
index 01d24ed..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/toplevel.ml
+++ /dev/null
@@ -1,49 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Top-Level parsing and JIT Driver
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-open Llvm_executionengine
-
-(* top ::= definition | external | expression | ';' *)
-let rec main_loop the_fpm the_execution_engine stream =
- match Stream.peek stream with
- | None -> ()
-
- (* ignore top-level semicolons. *)
- | Some (Token.Kwd ';') ->
- Stream.junk stream;
- main_loop the_fpm the_execution_engine stream
-
- | Some token ->
- begin
- try match token with
- | Token.Def ->
- let e = Parser.parse_definition stream in
- print_endline "parsed a function definition.";
- dump_value (Codegen.codegen_func the_fpm e);
- | Token.Extern ->
- let e = Parser.parse_extern stream in
- print_endline "parsed an extern.";
- dump_value (Codegen.codegen_proto e);
- | _ ->
- (* Evaluate a top-level expression into an anonymous function. *)
- let e = Parser.parse_toplevel stream in
- print_endline "parsed a top-level expr";
- let the_function = Codegen.codegen_func the_fpm e in
- dump_value the_function;
-
- (* JIT the function, returning a function pointer. *)
- let result = ExecutionEngine.run_function the_function [||]
- the_execution_engine in
-
- print_string "Evaluated to ";
- print_float (GenericValue.as_float Codegen.double_type result);
- print_newline ();
- with Stream.Error s | Codegen.Error s ->
- (* Skip token for error recovery. *)
- Stream.junk stream;
- print_endline s;
- end;
- print_string "ready> "; flush stdout;
- main_loop the_fpm the_execution_engine stream
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/toy.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/toy.ml
deleted file mode 100644
index 5f9d912..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter6/toy.ml
+++ /dev/null
@@ -1,53 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Main driver code.
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-open Llvm_executionengine
-open Llvm_target
-open Llvm_scalar_opts
-
-let main () =
- ignore (initialize_native_target ());
-
- (* Install standard binary operators.
- * 1 is the lowest precedence. *)
- Hashtbl.add Parser.binop_precedence '<' 10;
- Hashtbl.add Parser.binop_precedence '+' 20;
- Hashtbl.add Parser.binop_precedence '-' 20;
- Hashtbl.add Parser.binop_precedence '*' 40; (* highest. *)
-
- (* Prime the first token. *)
- print_string "ready> "; flush stdout;
- let stream = Lexer.lex (Stream.of_channel stdin) in
-
- (* Create the JIT. *)
- let the_execution_engine = ExecutionEngine.create Codegen.the_module in
- let the_fpm = PassManager.create_function Codegen.the_module in
-
- (* Set up the optimizer pipeline. Start with registering info about how the
- * target lays out data structures. *)
- TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
-
- (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
- add_instruction_combination the_fpm;
-
- (* reassociate expressions. *)
- add_reassociation the_fpm;
-
- (* Eliminate Common SubExpressions. *)
- add_gvn the_fpm;
-
- (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
- add_cfg_simplification the_fpm;
-
- ignore (PassManager.initialize the_fpm);
-
- (* Run the main "interpreter loop" now. *)
- Toplevel.main_loop the_fpm the_execution_engine stream;
-
- (* Print out all the generated code. *)
- dump_module Codegen.the_module
-;;
-
-main ()
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/Makefile b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/Makefile
deleted file mode 100644
index ddf667b..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-##===- examples/OCaml-Kaleidoscope/Chapter7/Makefile -------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-#
-# This is the makefile for the Objective Caml kaleidoscope tutorial, chapter 7.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL := ../../..
-TOOLNAME := OCaml-Kaleidoscope-Ch7
-EXAMPLE_TOOL := 1
-UsedComponents := core
-UsedOcamLibs := llvm llvm_analysis llvm_executionengine llvm_target \
- llvm_scalar_opts
-
-OCAMLCFLAGS += -pp camlp4of
-
-ExcludeSources = $(PROJ_SRC_DIR)/myocamlbuild.ml
-
-include $(LEVEL)/bindings/ocaml/Makefile.ocaml
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/_tags b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/_tags
deleted file mode 100644
index 7a03dba..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/_tags
+++ /dev/null
@@ -1,4 +0,0 @@
-<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
-<*.{byte,native}>: g++, use_llvm, use_llvm_analysis
-<*.{byte,native}>: use_llvm_executionengine, use_llvm_target
-<*.{byte,native}>: use_llvm_scalar_opts, use_bindings
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/ast.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/ast.ml
deleted file mode 100644
index c699e80..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/ast.ml
+++ /dev/null
@@ -1,39 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Abstract Syntax Tree (aka Parse Tree)
- *===----------------------------------------------------------------------===*)
-
-(* expr - Base type for all expression nodes. *)
-type expr =
- (* variant for numeric literals like "1.0". *)
- | Number of float
-
- (* variant for referencing a variable, like "a". *)
- | Variable of string
-
- (* variant for a unary operator. *)
- | Unary of char * expr
-
- (* variant for a binary operator. *)
- | Binary of char * expr * expr
-
- (* variant for function calls. *)
- | Call of string * expr array
-
- (* variant for if/then/else. *)
- | If of expr * expr * expr
-
- (* variant for for/in. *)
- | For of string * expr * expr * expr option * expr
-
- (* variant for var/in. *)
- | Var of (string * expr option) array * expr
-
-(* proto - This type represents the "prototype" for a function, which captures
- * its name, and its argument names (thus implicitly the number of arguments the
- * function takes). *)
-type proto =
- | Prototype of string * string array
- | BinOpPrototype of string * string array * int
-
-(* func - This type represents a function definition itself. *)
-type func = Function of proto * expr
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/bindings.c b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/bindings.c
deleted file mode 100644
index 90faed1..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/bindings.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-/* putchard - putchar that takes a double and returns 0. */
-extern double putchard(double X) {
- putchar((char)X);
- return 0;
-}
-
-/* printd - printf that takes a double prints it as "%f\n", returning 0. */
-extern double printd(double X) {
- printf("%f\n", X);
- return 0;
-}
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/codegen.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/codegen.ml
deleted file mode 100644
index e8fac32..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/codegen.ml
+++ /dev/null
@@ -1,370 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Code Generation
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-
-exception Error of string
-
-let context = global_context ()
-let the_module = create_module context "my cool jit"
-let builder = builder context
-let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
-let double_type = double_type context
-
-(* Create an alloca instruction in the entry block of the function. This
- * is used for mutable variables etc. *)
-let create_entry_block_alloca the_function var_name =
- let builder = builder_at context (instr_begin (entry_block the_function)) in
- build_alloca double_type var_name builder
-
-let rec codegen_expr = function
- | Ast.Number n -> const_float double_type n
- | Ast.Variable name ->
- let v = try Hashtbl.find named_values name with
- | Not_found -> raise (Error "unknown variable name")
- in
- (* Load the value. *)
- build_load v name builder
- | Ast.Unary (op, operand) ->
- let operand = codegen_expr operand in
- let callee = "unary" ^ (String.make 1 op) in
- let callee =
- match lookup_function callee the_module with
- | Some callee -> callee
- | None -> raise (Error "unknown unary operator")
- in
- build_call callee [|operand|] "unop" builder
- | Ast.Binary (op, lhs, rhs) ->
- begin match op with
- | '=' ->
- (* Special case '=' because we don't want to emit the LHS as an
- * expression. *)
- let name =
- match lhs with
- | Ast.Variable name -> name
- | _ -> raise (Error "destination of '=' must be a variable")
- in
-
- (* Codegen the rhs. *)
- let val_ = codegen_expr rhs in
-
- (* Lookup the name. *)
- let variable = try Hashtbl.find named_values name with
- | Not_found -> raise (Error "unknown variable name")
- in
- ignore(build_store val_ variable builder);
- val_
- | _ ->
- let lhs_val = codegen_expr lhs in
- let rhs_val = codegen_expr rhs in
- begin
- match op with
- | '+' -> build_add lhs_val rhs_val "addtmp" builder
- | '-' -> build_sub lhs_val rhs_val "subtmp" builder
- | '*' -> build_mul lhs_val rhs_val "multmp" builder
- | '<' ->
- (* Convert bool 0/1 to double 0.0 or 1.0 *)
- let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
- build_uitofp i double_type "booltmp" builder
- | _ ->
- (* If it wasn't a builtin binary operator, it must be a user defined
- * one. Emit a call to it. *)
- let callee = "binary" ^ (String.make 1 op) in
- let callee =
- match lookup_function callee the_module with
- | Some callee -> callee
- | None -> raise (Error "binary operator not found!")
- in
- build_call callee [|lhs_val; rhs_val|] "binop" builder
- end
- end
- | Ast.Call (callee, args) ->
- (* Look up the name in the module table. *)
- let callee =
- match lookup_function callee the_module with
- | Some callee -> callee
- | None -> raise (Error "unknown function referenced")
- in
- let params = params callee in
-
- (* If argument mismatch error. *)
- if Array.length params == Array.length args then () else
- raise (Error "incorrect # arguments passed");
- let args = Array.map codegen_expr args in
- build_call callee args "calltmp" builder
- | Ast.If (cond, then_, else_) ->
- let cond = codegen_expr cond in
-
- (* Convert condition to a bool by comparing equal to 0.0 *)
- let zero = const_float double_type 0.0 in
- let cond_val = build_fcmp Fcmp.One cond zero "ifcond" builder in
-
- (* Grab the first block so that we might later add the conditional branch
- * to it at the end of the function. *)
- let start_bb = insertion_block builder in
- let the_function = block_parent start_bb in
-
- let then_bb = append_block context "then" the_function in
-
- (* Emit 'then' value. *)
- position_at_end then_bb builder;
- let then_val = codegen_expr then_ in
-
- (* Codegen of 'then' can change the current block, update then_bb for the
- * phi. We create a new name because one is used for the phi node, and the
- * other is used for the conditional branch. *)
- let new_then_bb = insertion_block builder in
-
- (* Emit 'else' value. *)
- let else_bb = append_block context "else" the_function in
- position_at_end else_bb builder;
- let else_val = codegen_expr else_ in
-
- (* Codegen of 'else' can change the current block, update else_bb for the
- * phi. *)
- let new_else_bb = insertion_block builder in
-
- (* Emit merge block. *)
- let merge_bb = append_block context "ifcont" the_function in
- position_at_end merge_bb builder;
- let incoming = [(then_val, new_then_bb); (else_val, new_else_bb)] in
- let phi = build_phi incoming "iftmp" builder in
-
- (* Return to the start block to add the conditional branch. *)
- position_at_end start_bb builder;
- ignore (build_cond_br cond_val then_bb else_bb builder);
-
- (* Set a unconditional branch at the end of the 'then' block and the
- * 'else' block to the 'merge' block. *)
- position_at_end new_then_bb builder; ignore (build_br merge_bb builder);
- position_at_end new_else_bb builder; ignore (build_br merge_bb builder);
-
- (* Finally, set the builder to the end of the merge block. *)
- position_at_end merge_bb builder;
-
- phi
- | Ast.For (var_name, start, end_, step, body) ->
- (* Output this as:
- * var = alloca double
- * ...
- * start = startexpr
- * store start -> var
- * goto loop
- * loop:
- * ...
- * bodyexpr
- * ...
- * loopend:
- * step = stepexpr
- * endcond = endexpr
- *
- * curvar = load var
- * nextvar = curvar + step
- * store nextvar -> var
- * br endcond, loop, endloop
- * outloop: *)
-
- let the_function = block_parent (insertion_block builder) in
-
- (* Create an alloca for the variable in the entry block. *)
- let alloca = create_entry_block_alloca the_function var_name in
-
- (* Emit the start code first, without 'variable' in scope. *)
- let start_val = codegen_expr start in
-
- (* Store the value into the alloca. *)
- ignore(build_store start_val alloca builder);
-
- (* Make the new basic block for the loop header, inserting after current
- * block. *)
- let loop_bb = append_block context "loop" the_function in
-
- (* Insert an explicit fall through from the current block to the
- * loop_bb. *)
- ignore (build_br loop_bb builder);
-
- (* Start insertion in loop_bb. *)
- position_at_end loop_bb builder;
-
- (* Within the loop, the variable is defined equal to the PHI node. If it
- * shadows an existing variable, we have to restore it, so save it
- * now. *)
- let old_val =
- try Some (Hashtbl.find named_values var_name) with Not_found -> None
- in
- Hashtbl.add named_values var_name alloca;
-
- (* Emit the body of the loop. This, like any other expr, can change the
- * current BB. Note that we ignore the value computed by the body, but
- * don't allow an error *)
- ignore (codegen_expr body);
-
- (* Emit the step value. *)
- let step_val =
- match step with
- | Some step -> codegen_expr step
- (* If not specified, use 1.0. *)
- | None -> const_float double_type 1.0
- in
-
- (* Compute the end condition. *)
- let end_cond = codegen_expr end_ in
-
- (* Reload, increment, and restore the alloca. This handles the case where
- * the body of the loop mutates the variable. *)
- let cur_var = build_load alloca var_name builder in
- let next_var = build_add cur_var step_val "nextvar" builder in
- ignore(build_store next_var alloca builder);
-
- (* Convert condition to a bool by comparing equal to 0.0. *)
- let zero = const_float double_type 0.0 in
- let end_cond = build_fcmp Fcmp.One end_cond zero "loopcond" builder in
-
- (* Create the "after loop" block and insert it. *)
- let after_bb = append_block context "afterloop" the_function in
-
- (* Insert the conditional branch into the end of loop_end_bb. *)
- ignore (build_cond_br end_cond loop_bb after_bb builder);
-
- (* Any new code will be inserted in after_bb. *)
- position_at_end after_bb builder;
-
- (* Restore the unshadowed variable. *)
- begin match old_val with
- | Some old_val -> Hashtbl.add named_values var_name old_val
- | None -> ()
- end;
-
- (* for expr always returns 0.0. *)
- const_null double_type
- | Ast.Var (var_names, body) ->
- let old_bindings = ref [] in
-
- let the_function = block_parent (insertion_block builder) in
-
- (* Register all variables and emit their initializer. *)
- Array.iter (fun (var_name, init) ->
- (* Emit the initializer before adding the variable to scope, this
- * prevents the initializer from referencing the variable itself, and
- * permits stuff like this:
- * var a = 1 in
- * var a = a in ... # refers to outer 'a'. *)
- let init_val =
- match init with
- | Some init -> codegen_expr init
- (* If not specified, use 0.0. *)
- | None -> const_float double_type 0.0
- in
-
- let alloca = create_entry_block_alloca the_function var_name in
- ignore(build_store init_val alloca builder);
-
- (* Remember the old variable binding so that we can restore the binding
- * when we unrecurse. *)
- begin
- try
- let old_value = Hashtbl.find named_values var_name in
- old_bindings := (var_name, old_value) :: !old_bindings;
- with Not_found -> ()
- end;
-
- (* Remember this binding. *)
- Hashtbl.add named_values var_name alloca;
- ) var_names;
-
- (* Codegen the body, now that all vars are in scope. *)
- let body_val = codegen_expr body in
-
- (* Pop all our variables from scope. *)
- List.iter (fun (var_name, old_value) ->
- Hashtbl.add named_values var_name old_value
- ) !old_bindings;
-
- (* Return the body computation. *)
- body_val
-
-let codegen_proto = function
- | Ast.Prototype (name, args) | Ast.BinOpPrototype (name, args, _) ->
- (* Make the function type: double(double,double) etc. *)
- let doubles = Array.make (Array.length args) double_type in
- let ft = function_type double_type doubles in
- let f =
- match lookup_function name the_module with
- | None -> declare_function name ft the_module
-
- (* If 'f' conflicted, there was already something named 'name'. If it
- * has a body, don't allow redefinition or reextern. *)
- | Some f ->
- (* If 'f' already has a body, reject this. *)
- if block_begin f <> At_end f then
- raise (Error "redefinition of function");
-
- (* If 'f' took a different number of arguments, reject. *)
- if element_type (type_of f) <> ft then
- raise (Error "redefinition of function with different # args");
- f
- in
-
- (* Set names for all arguments. *)
- Array.iteri (fun i a ->
- let n = args.(i) in
- set_value_name n a;
- Hashtbl.add named_values n a;
- ) (params f);
- f
-
-(* Create an alloca for each argument and register the argument in the symbol
- * table so that references to it will succeed. *)
-let create_argument_allocas the_function proto =
- let args = match proto with
- | Ast.Prototype (_, args) | Ast.BinOpPrototype (_, args, _) -> args
- in
- Array.iteri (fun i ai ->
- let var_name = args.(i) in
- (* Create an alloca for this variable. *)
- let alloca = create_entry_block_alloca the_function var_name in
-
- (* Store the initial value into the alloca. *)
- ignore(build_store ai alloca builder);
-
- (* Add arguments to variable symbol table. *)
- Hashtbl.add named_values var_name alloca;
- ) (params the_function)
-
-let codegen_func the_fpm = function
- | Ast.Function (proto, body) ->
- Hashtbl.clear named_values;
- let the_function = codegen_proto proto in
-
- (* If this is an operator, install it. *)
- begin match proto with
- | Ast.BinOpPrototype (name, args, prec) ->
- let op = name.[String.length name - 1] in
- Hashtbl.add Parser.binop_precedence op prec;
- | _ -> ()
- end;
-
- (* Create a new basic block to start insertion into. *)
- let bb = append_block context "entry" the_function in
- position_at_end bb builder;
-
- try
- (* Add all arguments to the symbol table and create their allocas. *)
- create_argument_allocas the_function proto;
-
- let ret_val = codegen_expr body in
-
- (* Finish off the function. *)
- let _ = build_ret ret_val builder in
-
- (* Validate the generated code, checking for consistency. *)
- Llvm_analysis.assert_valid_function the_function;
-
- (* Optimize the function. *)
- let _ = PassManager.run_function the_function the_fpm in
-
- the_function
- with e ->
- delete_function the_function;
- raise e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/lexer.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/lexer.ml
deleted file mode 100644
index 922cabf..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/lexer.ml
+++ /dev/null
@@ -1,60 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer
- *===----------------------------------------------------------------------===*)
-
-let rec lex = parser
- (* Skip any whitespace. *)
- | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
-
- (* identifier: [a-zA-Z][a-zA-Z0-9] *)
- | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_ident buffer stream
-
- (* number: [0-9.]+ *)
- | [< ' ('0' .. '9' as c); stream >] ->
- let buffer = Buffer.create 1 in
- Buffer.add_char buffer c;
- lex_number buffer stream
-
- (* Comment until end of line. *)
- | [< ' ('#'); stream >] ->
- lex_comment stream
-
- (* Otherwise, just return the character as its ascii value. *)
- | [< 'c; stream >] ->
- [< 'Token.Kwd c; lex stream >]
-
- (* end of stream. *)
- | [< >] -> [< >]
-
-and lex_number buffer = parser
- | [< ' ('0' .. '9' | '.' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_number buffer stream
- | [< stream=lex >] ->
- [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
-
-and lex_ident buffer = parser
- | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
- Buffer.add_char buffer c;
- lex_ident buffer stream
- | [< stream=lex >] ->
- match Buffer.contents buffer with
- | "def" -> [< 'Token.Def; stream >]
- | "extern" -> [< 'Token.Extern; stream >]
- | "if" -> [< 'Token.If; stream >]
- | "then" -> [< 'Token.Then; stream >]
- | "else" -> [< 'Token.Else; stream >]
- | "for" -> [< 'Token.For; stream >]
- | "in" -> [< 'Token.In; stream >]
- | "binary" -> [< 'Token.Binary; stream >]
- | "unary" -> [< 'Token.Unary; stream >]
- | "var" -> [< 'Token.Var; stream >]
- | id -> [< 'Token.Ident id; stream >]
-
-and lex_comment = parser
- | [< ' ('\n'); stream=lex >] -> stream
- | [< 'c; e=lex_comment >] -> e
- | [< >] -> [< >]
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/myocamlbuild.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/myocamlbuild.ml
deleted file mode 100644
index 54d3fd9..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/myocamlbuild.ml
+++ /dev/null
@@ -1,10 +0,0 @@
-open Ocamlbuild_plugin;;
-
-ocaml_lib ~extern:true "llvm";;
-ocaml_lib ~extern:true "llvm_analysis";;
-ocaml_lib ~extern:true "llvm_executionengine";;
-ocaml_lib ~extern:true "llvm_target";;
-ocaml_lib ~extern:true "llvm_scalar_opts";;
-
-flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"; A"-cclib"; A"-rdynamic"]);;
-dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];;
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/parser.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/parser.ml
deleted file mode 100644
index c0e7db8..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/parser.ml
+++ /dev/null
@@ -1,221 +0,0 @@
-(*===---------------------------------------------------------------------===
- * Parser
- *===---------------------------------------------------------------------===*)
-
-(* binop_precedence - This holds the precedence for each binary operator that is
- * defined *)
-let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10
-
-(* precedence - Get the precedence of the pending binary operator token. *)
-let precedence c = try Hashtbl.find binop_precedence c with Not_found -> -1
-
-(* primary
- * ::= identifier
- * ::= numberexpr
- * ::= parenexpr
- * ::= ifexpr
- * ::= forexpr
- * ::= varexpr *)
-let rec parse_primary = parser
- (* numberexpr ::= number *)
- | [< 'Token.Number n >] -> Ast.Number n
-
- (* parenexpr ::= '(' expression ')' *)
- | [< 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" >] -> e
-
- (* identifierexpr
- * ::= identifier
- * ::= identifier '(' argumentexpr ')' *)
- | [< 'Token.Ident id; stream >] ->
- let rec parse_args accumulator = parser
- | [< e=parse_expr; stream >] ->
- begin parser
- | [< 'Token.Kwd ','; e=parse_args (e :: accumulator) >] -> e
- | [< >] -> e :: accumulator
- end stream
- | [< >] -> accumulator
- in
- let rec parse_ident id = parser
- (* Call. *)
- | [< 'Token.Kwd '(';
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')'">] ->
- Ast.Call (id, Array.of_list (List.rev args))
-
- (* Simple variable ref. *)
- | [< >] -> Ast.Variable id
- in
- parse_ident id stream
-
- (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
- | [< 'Token.If; c=parse_expr;
- 'Token.Then ?? "expected 'then'"; t=parse_expr;
- 'Token.Else ?? "expected 'else'"; e=parse_expr >] ->
- Ast.If (c, t, e)
-
- (* forexpr
- ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression *)
- | [< 'Token.For;
- 'Token.Ident id ?? "expected identifier after for";
- 'Token.Kwd '=' ?? "expected '=' after for";
- stream >] ->
- begin parser
- | [<
- start=parse_expr;
- 'Token.Kwd ',' ?? "expected ',' after for";
- end_=parse_expr;
- stream >] ->
- let step =
- begin parser
- | [< 'Token.Kwd ','; step=parse_expr >] -> Some step
- | [< >] -> None
- end stream
- in
- begin parser
- | [< 'Token.In; body=parse_expr >] ->
- Ast.For (id, start, end_, step, body)
- | [< >] ->
- raise (Stream.Error "expected 'in' after for")
- end stream
- | [< >] ->
- raise (Stream.Error "expected '=' after for")
- end stream
-
- (* varexpr
- * ::= 'var' identifier ('=' expression?
- * (',' identifier ('=' expression)?)* 'in' expression *)
- | [< 'Token.Var;
- (* At least one variable name is required. *)
- 'Token.Ident id ?? "expected identifier after var";
- init=parse_var_init;
- var_names=parse_var_names [(id, init)];
- (* At this point, we have to have 'in'. *)
- 'Token.In ?? "expected 'in' keyword after 'var'";
- body=parse_expr >] ->
- Ast.Var (Array.of_list (List.rev var_names), body)
-
- | [< >] -> raise (Stream.Error "unknown token when expecting an expression.")
-
-(* unary
- * ::= primary
- * ::= '!' unary *)
-and parse_unary = parser
- (* If this is a unary operator, read it. *)
- | [< 'Token.Kwd op when op != '(' && op != ')'; operand=parse_expr >] ->
- Ast.Unary (op, operand)
-
- (* If the current token is not an operator, it must be a primary expr. *)
- | [< stream >] -> parse_primary stream
-
-(* binoprhs
- * ::= ('+' primary)* *)
-and parse_bin_rhs expr_prec lhs stream =
- match Stream.peek stream with
- (* If this is a binop, find its precedence. *)
- | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c ->
- let token_prec = precedence c in
-
- (* If this is a binop that binds at least as tightly as the current binop,
- * consume it, otherwise we are done. *)
- if token_prec < expr_prec then lhs else begin
- (* Eat the binop. *)
- Stream.junk stream;
-
- (* Parse the primary expression after the binary operator. *)
- let rhs = parse_unary stream in
-
- (* Okay, we know this is a binop. *)
- let rhs =
- match Stream.peek stream with
- | Some (Token.Kwd c2) ->
- (* If BinOp binds less tightly with rhs than the operator after
- * rhs, let the pending operator take rhs as its lhs. *)
- let next_prec = precedence c2 in
- if token_prec < next_prec
- then parse_bin_rhs (token_prec + 1) rhs stream
- else rhs
- | _ -> rhs
- in
-
- (* Merge lhs/rhs. *)
- let lhs = Ast.Binary (c, lhs, rhs) in
- parse_bin_rhs expr_prec lhs stream
- end
- | _ -> lhs
-
-and parse_var_init = parser
- (* read in the optional initializer. *)
- | [< 'Token.Kwd '='; e=parse_expr >] -> Some e
- | [< >] -> None
-
-and parse_var_names accumulator = parser
- | [< 'Token.Kwd ',';
- 'Token.Ident id ?? "expected identifier list after var";
- init=parse_var_init;
- e=parse_var_names ((id, init) :: accumulator) >] -> e
- | [< >] -> accumulator
-
-(* expression
- * ::= primary binoprhs *)
-and parse_expr = parser
- | [< lhs=parse_unary; stream >] -> parse_bin_rhs 0 lhs stream
-
-(* prototype
- * ::= id '(' id* ')'
- * ::= binary LETTER number? (id, id)
- * ::= unary LETTER number? (id) *)
-let parse_prototype =
- let rec parse_args accumulator = parser
- | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
- | [< >] -> accumulator
- in
- let parse_operator = parser
- | [< 'Token.Unary >] -> "unary", 1
- | [< 'Token.Binary >] -> "binary", 2
- in
- let parse_binary_precedence = parser
- | [< 'Token.Number n >] -> int_of_float n
- | [< >] -> 30
- in
- parser
- | [< 'Token.Ident id;
- 'Token.Kwd '(' ?? "expected '(' in prototype";
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
- (* success. *)
- Ast.Prototype (id, Array.of_list (List.rev args))
- | [< (prefix, kind)=parse_operator;
- 'Token.Kwd op ?? "expected an operator";
- (* Read the precedence if present. *)
- binary_precedence=parse_binary_precedence;
- 'Token.Kwd '(' ?? "expected '(' in prototype";
- args=parse_args [];
- 'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
- let name = prefix ^ (String.make 1 op) in
- let args = Array.of_list (List.rev args) in
-
- (* Verify right number of arguments for operator. *)
- if Array.length args != kind
- then raise (Stream.Error "invalid number of operands for operator")
- else
- if kind == 1 then
- Ast.Prototype (name, args)
- else
- Ast.BinOpPrototype (name, args, binary_precedence)
- | [< >] ->
- raise (Stream.Error "expected function name in prototype")
-
-(* definition ::= 'def' prototype expression *)
-let parse_definition = parser
- | [< 'Token.Def; p=parse_prototype; e=parse_expr >] ->
- Ast.Function (p, e)
-
-(* toplevelexpr ::= expression *)
-let parse_toplevel = parser
- | [< e=parse_expr >] ->
- (* Make an anonymous proto. *)
- Ast.Function (Ast.Prototype ("", [||]), e)
-
-(* external ::= 'extern' prototype *)
-let parse_extern = parser
- | [< 'Token.Extern; e=parse_prototype >] -> e
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/token.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/token.ml
deleted file mode 100644
index 1489f0b..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/token.ml
+++ /dev/null
@@ -1,25 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Lexer Tokens
- *===----------------------------------------------------------------------===*)
-
-(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
- * these others for known things. *)
-type token =
- (* commands *)
- | Def | Extern
-
- (* primary *)
- | Ident of string | Number of float
-
- (* unknown *)
- | Kwd of char
-
- (* control *)
- | If | Then | Else
- | For | In
-
- (* operators *)
- | Binary | Unary
-
- (* var definition *)
- | Var
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/toplevel.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/toplevel.ml
deleted file mode 100644
index 01d24ed..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/toplevel.ml
+++ /dev/null
@@ -1,49 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Top-Level parsing and JIT Driver
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-open Llvm_executionengine
-
-(* top ::= definition | external | expression | ';' *)
-let rec main_loop the_fpm the_execution_engine stream =
- match Stream.peek stream with
- | None -> ()
-
- (* ignore top-level semicolons. *)
- | Some (Token.Kwd ';') ->
- Stream.junk stream;
- main_loop the_fpm the_execution_engine stream
-
- | Some token ->
- begin
- try match token with
- | Token.Def ->
- let e = Parser.parse_definition stream in
- print_endline "parsed a function definition.";
- dump_value (Codegen.codegen_func the_fpm e);
- | Token.Extern ->
- let e = Parser.parse_extern stream in
- print_endline "parsed an extern.";
- dump_value (Codegen.codegen_proto e);
- | _ ->
- (* Evaluate a top-level expression into an anonymous function. *)
- let e = Parser.parse_toplevel stream in
- print_endline "parsed a top-level expr";
- let the_function = Codegen.codegen_func the_fpm e in
- dump_value the_function;
-
- (* JIT the function, returning a function pointer. *)
- let result = ExecutionEngine.run_function the_function [||]
- the_execution_engine in
-
- print_string "Evaluated to ";
- print_float (GenericValue.as_float Codegen.double_type result);
- print_newline ();
- with Stream.Error s | Codegen.Error s ->
- (* Skip token for error recovery. *)
- Stream.junk stream;
- print_endline s;
- end;
- print_string "ready> "; flush stdout;
- main_loop the_fpm the_execution_engine stream
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/toy.ml b/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/toy.ml
deleted file mode 100644
index babab28..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Chapter7/toy.ml
+++ /dev/null
@@ -1,57 +0,0 @@
-(*===----------------------------------------------------------------------===
- * Main driver code.
- *===----------------------------------------------------------------------===*)
-
-open Llvm
-open Llvm_executionengine
-open Llvm_target
-open Llvm_scalar_opts
-
-let main () =
- ignore (initialize_native_target ());
-
- (* Install standard binary operators.
- * 1 is the lowest precedence. *)
- Hashtbl.add Parser.binop_precedence '=' 2;
- Hashtbl.add Parser.binop_precedence '<' 10;
- Hashtbl.add Parser.binop_precedence '+' 20;
- Hashtbl.add Parser.binop_precedence '-' 20;
- Hashtbl.add Parser.binop_precedence '*' 40; (* highest. *)
-
- (* Prime the first token. *)
- print_string "ready> "; flush stdout;
- let stream = Lexer.lex (Stream.of_channel stdin) in
-
- (* Create the JIT. *)
- let the_execution_engine = ExecutionEngine.create Codegen.the_module in
- let the_fpm = PassManager.create_function Codegen.the_module in
-
- (* Set up the optimizer pipeline. Start with registering info about how the
- * target lays out data structures. *)
- TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
-
- (* Promote allocas to registers. *)
- add_memory_to_register_promotion the_fpm;
-
- (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
- add_instruction_combination the_fpm;
-
- (* reassociate expressions. *)
- add_reassociation the_fpm;
-
- (* Eliminate Common SubExpressions. *)
- add_gvn the_fpm;
-
- (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
- add_cfg_simplification the_fpm;
-
- ignore (PassManager.initialize the_fpm);
-
- (* Run the main "interpreter loop" now. *)
- Toplevel.main_loop the_fpm the_execution_engine stream;
-
- (* Print out all the generated code. *)
- dump_module Codegen.the_module
-;;
-
-main ()
diff --git a/contrib/llvm/examples/OCaml-Kaleidoscope/Makefile b/contrib/llvm/examples/OCaml-Kaleidoscope/Makefile
deleted file mode 100644
index 5342b94..0000000
--- a/contrib/llvm/examples/OCaml-Kaleidoscope/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-##===- examples/OCaml-Kaleidoscope/Makefile ----------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL=../..
-
-include $(LEVEL)/Makefile.config
-
-PARALLEL_DIRS:= Chapter2 Chapter3 Chapter4 Chapter5 Chapter6 Chapter7
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/examples/ParallelJIT/CMakeLists.txt b/contrib/llvm/examples/ParallelJIT/CMakeLists.txt
deleted file mode 100644
index fbdc6e5..0000000
--- a/contrib/llvm/examples/ParallelJIT/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-set(LLVM_LINK_COMPONENTS jit interpreter nativecodegen)
-
-add_llvm_example(ParallelJIT
- ParallelJIT.cpp
- )
-
-if(HAVE_LIBPTHREAD)
- target_link_libraries(ParallelJIT pthread)
-endif(HAVE_LIBPTHREAD)
diff --git a/contrib/llvm/examples/ParallelJIT/Makefile b/contrib/llvm/examples/ParallelJIT/Makefile
deleted file mode 100644
index 8a49d42..0000000
--- a/contrib/llvm/examples/ParallelJIT/Makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-##===- examples/ParallelJIT/Makefile -----------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-LEVEL = ../..
-TOOLNAME = ParallelJIT
-EXAMPLE_TOOL = 1
-
-LINK_COMPONENTS := jit interpreter nativecodegen
-
-include $(LEVEL)/Makefile.common
-
-LIBS += -lpthread
diff --git a/contrib/llvm/examples/ParallelJIT/ParallelJIT.cpp b/contrib/llvm/examples/ParallelJIT/ParallelJIT.cpp
deleted file mode 100644
index 9231abf..0000000
--- a/contrib/llvm/examples/ParallelJIT/ParallelJIT.cpp
+++ /dev/null
@@ -1,304 +0,0 @@
-//===-- examples/ParallelJIT/ParallelJIT.cpp - Exercise threaded-safe JIT -===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Parallel JIT
-//
-// This test program creates two LLVM functions then calls them from three
-// separate threads. It requires the pthreads library.
-// The three threads are created and then block waiting on a condition variable.
-// Once all threads are blocked on the conditional variable, the main thread
-// wakes them up. This complicated work is performed so that all three threads
-// call into the JIT at the same time (or the best possible approximation of the
-// same time). This test had assertion errors until I got the locking right.
-
-#include <pthread.h>
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/Constants.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/Instructions.h"
-#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/ExecutionEngine/Interpreter.h"
-#include "llvm/ExecutionEngine/GenericValue.h"
-#include "llvm/Target/TargetSelect.h"
-#include <iostream>
-using namespace llvm;
-
-static Function* createAdd1(Module *M) {
- // Create the add1 function entry and insert this entry into module M. The
- // function will have a return type of "int" and take an argument of "int".
- // The '0' terminates the list of argument types.
- Function *Add1F =
- cast<Function>(M->getOrInsertFunction("add1",
- Type::getInt32Ty(M->getContext()),
- Type::getInt32Ty(M->getContext()),
- (Type *)0));
-
- // Add a basic block to the function. As before, it automatically inserts
- // because of the last argument.
- BasicBlock *BB = BasicBlock::Create(M->getContext(), "EntryBlock", Add1F);
-
- // Get pointers to the constant `1'.
- Value *One = ConstantInt::get(Type::getInt32Ty(M->getContext()), 1);
-
- // Get pointers to the integer argument of the add1 function...
- assert(Add1F->arg_begin() != Add1F->arg_end()); // Make sure there's an arg
- Argument *ArgX = Add1F->arg_begin(); // Get the arg
- ArgX->setName("AnArg"); // Give it a nice symbolic name for fun.
-
- // Create the add instruction, inserting it into the end of BB.
- Instruction *Add = BinaryOperator::CreateAdd(One, ArgX, "addresult", BB);
-
- // Create the return instruction and add it to the basic block
- ReturnInst::Create(M->getContext(), Add, BB);
-
- // Now, function add1 is ready.
- return Add1F;
-}
-
-static Function *CreateFibFunction(Module *M) {
- // Create the fib function and insert it into module M. This function is said
- // to return an int and take an int parameter.
- Function *FibF =
- cast<Function>(M->getOrInsertFunction("fib",
- Type::getInt32Ty(M->getContext()),
- Type::getInt32Ty(M->getContext()),
- (Type *)0));
-
- // Add a basic block to the function.
- BasicBlock *BB = BasicBlock::Create(M->getContext(), "EntryBlock", FibF);
-
- // Get pointers to the constants.
- Value *One = ConstantInt::get(Type::getInt32Ty(M->getContext()), 1);
- Value *Two = ConstantInt::get(Type::getInt32Ty(M->getContext()), 2);
-
- // Get pointer to the integer argument of the add1 function...
- Argument *ArgX = FibF->arg_begin(); // Get the arg.
- ArgX->setName("AnArg"); // Give it a nice symbolic name for fun.
-
- // Create the true_block.
- BasicBlock *RetBB = BasicBlock::Create(M->getContext(), "return", FibF);
- // Create an exit block.
- BasicBlock* RecurseBB = BasicBlock::Create(M->getContext(), "recurse", FibF);
-
- // Create the "if (arg < 2) goto exitbb"
- Value *CondInst = new ICmpInst(*BB, ICmpInst::ICMP_SLE, ArgX, Two, "cond");
- BranchInst::Create(RetBB, RecurseBB, CondInst, BB);
-
- // Create: ret int 1
- ReturnInst::Create(M->getContext(), One, RetBB);
-
- // create fib(x-1)
- Value *Sub = BinaryOperator::CreateSub(ArgX, One, "arg", RecurseBB);
- Value *CallFibX1 = CallInst::Create(FibF, Sub, "fibx1", RecurseBB);
-
- // create fib(x-2)
- Sub = BinaryOperator::CreateSub(ArgX, Two, "arg", RecurseBB);
- Value *CallFibX2 = CallInst::Create(FibF, Sub, "fibx2", RecurseBB);
-
- // fib(x-1)+fib(x-2)
- Value *Sum =
- BinaryOperator::CreateAdd(CallFibX1, CallFibX2, "addresult", RecurseBB);
-
- // Create the return instruction and add it to the basic block
- ReturnInst::Create(M->getContext(), Sum, RecurseBB);
-
- return FibF;
-}
-
-struct threadParams {
- ExecutionEngine* EE;
- Function* F;
- int value;
-};
-
-// We block the subthreads just before they begin to execute:
-// we want all of them to call into the JIT at the same time,
-// to verify that the locking is working correctly.
-class WaitForThreads
-{
-public:
- WaitForThreads()
- {
- n = 0;
- waitFor = 0;
-
- int result = pthread_cond_init( &condition, NULL );
- assert( result == 0 );
-
- result = pthread_mutex_init( &mutex, NULL );
- assert( result == 0 );
- }
-
- ~WaitForThreads()
- {
- int result = pthread_cond_destroy( &condition );
- assert( result == 0 );
-
- result = pthread_mutex_destroy( &mutex );
- assert( result == 0 );
- }
-
- // All threads will stop here until another thread calls releaseThreads
- void block()
- {
- int result = pthread_mutex_lock( &mutex );
- assert( result == 0 );
- n ++;
- //~ std::cout << "block() n " << n << " waitFor " << waitFor << std::endl;
-
- assert( waitFor == 0 || n <= waitFor );
- if ( waitFor > 0 && n == waitFor )
- {
- // There are enough threads blocked that we can release all of them
- std::cout << "Unblocking threads from block()" << std::endl;
- unblockThreads();
- }
- else
- {
- // We just need to wait until someone unblocks us
- result = pthread_cond_wait( &condition, &mutex );
- assert( result == 0 );
- }
-
- // unlock the mutex before returning
- result = pthread_mutex_unlock( &mutex );
- assert( result == 0 );
- }
-
- // If there are num or more threads blocked, it will signal them all
- // Otherwise, this thread blocks until there are enough OTHER threads
- // blocked
- void releaseThreads( size_t num )
- {
- int result = pthread_mutex_lock( &mutex );
- assert( result == 0 );
-
- if ( n >= num ) {
- std::cout << "Unblocking threads from releaseThreads()" << std::endl;
- unblockThreads();
- }
- else
- {
- waitFor = num;
- pthread_cond_wait( &condition, &mutex );
- }
-
- // unlock the mutex before returning
- result = pthread_mutex_unlock( &mutex );
- assert( result == 0 );
- }
-
-private:
- void unblockThreads()
- {
- // Reset the counters to zero: this way, if any new threads
- // enter while threads are exiting, they will block instead
- // of triggering a new release of threads
- n = 0;
-
- // Reset waitFor to zero: this way, if waitFor threads enter
- // while threads are exiting, they will block instead of
- // triggering a new release of threads
- waitFor = 0;
-
- int result = pthread_cond_broadcast( &condition );
- assert(result == 0); result=result;
- }
-
- size_t n;
- size_t waitFor;
- pthread_cond_t condition;
- pthread_mutex_t mutex;
-};
-
-static WaitForThreads synchronize;
-
-void* callFunc( void* param )
-{
- struct threadParams* p = (struct threadParams*) param;
-
- // Call the `foo' function with no arguments:
- std::vector<GenericValue> Args(1);
- Args[0].IntVal = APInt(32, p->value);
-
- synchronize.block(); // wait until other threads are at this point
- GenericValue gv = p->EE->runFunction(p->F, Args);
-
- return (void*)(intptr_t)gv.IntVal.getZExtValue();
-}
-
-int main() {
- InitializeNativeTarget();
- LLVMContext Context;
-
- // Create some module to put our function into it.
- Module *M = new Module("test", Context);
-
- Function* add1F = createAdd1( M );
- Function* fibF = CreateFibFunction( M );
-
- // Now we create the JIT.
- ExecutionEngine* EE = EngineBuilder(M).create();
-
- //~ std::cout << "We just constructed this LLVM module:\n\n" << *M;
- //~ std::cout << "\n\nRunning foo: " << std::flush;
-
- // Create one thread for add1 and two threads for fib
- struct threadParams add1 = { EE, add1F, 1000 };
- struct threadParams fib1 = { EE, fibF, 39 };
- struct threadParams fib2 = { EE, fibF, 42 };
-
- pthread_t add1Thread;
- int result = pthread_create( &add1Thread, NULL, callFunc, &add1 );
- if ( result != 0 ) {
- std::cerr << "Could not create thread" << std::endl;
- return 1;
- }
-
- pthread_t fibThread1;
- result = pthread_create( &fibThread1, NULL, callFunc, &fib1 );
- if ( result != 0 ) {
- std::cerr << "Could not create thread" << std::endl;
- return 1;
- }
-
- pthread_t fibThread2;
- result = pthread_create( &fibThread2, NULL, callFunc, &fib2 );
- if ( result != 0 ) {
- std::cerr << "Could not create thread" << std::endl;
- return 1;
- }
-
- synchronize.releaseThreads(3); // wait until other threads are at this point
-
- void* returnValue;
- result = pthread_join( add1Thread, &returnValue );
- if ( result != 0 ) {
- std::cerr << "Could not join thread" << std::endl;
- return 1;
- }
- std::cout << "Add1 returned " << intptr_t(returnValue) << std::endl;
-
- result = pthread_join( fibThread1, &returnValue );
- if ( result != 0 ) {
- std::cerr << "Could not join thread" << std::endl;
- return 1;
- }
- std::cout << "Fib1 returned " << intptr_t(returnValue) << std::endl;
-
- result = pthread_join( fibThread2, &returnValue );
- if ( result != 0 ) {
- std::cerr << "Could not join thread" << std::endl;
- return 1;
- }
- std::cout << "Fib2 returned " << intptr_t(returnValue) << std::endl;
-
- return 0;
-}
diff --git a/contrib/llvm/tools/clang/examples/CMakeLists.txt b/contrib/llvm/tools/clang/examples/CMakeLists.txt
deleted file mode 100644
index d2738c6..0000000
--- a/contrib/llvm/tools/clang/examples/CMakeLists.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-add_subdirectory(clang-interpreter)
-add_subdirectory(PrintFunctionNames)
-add_subdirectory(wpa)
-
diff --git a/contrib/llvm/tools/clang/examples/Makefile b/contrib/llvm/tools/clang/examples/Makefile
deleted file mode 100644
index 869197d..0000000
--- a/contrib/llvm/tools/clang/examples/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-##===- examples/Makefile -----------------------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL = ../../..
-
-PARALLEL_DIRS := clang-interpreter PrintFunctionNames wpa
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/tools/clang/examples/PrintFunctionNames/CMakeLists.txt b/contrib/llvm/tools/clang/examples/PrintFunctionNames/CMakeLists.txt
deleted file mode 100644
index 49dd22a..0000000
--- a/contrib/llvm/tools/clang/examples/PrintFunctionNames/CMakeLists.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-set(SHARED_LIBRARY TRUE)
-
-set(LLVM_NO_RTTI 1)
-
-set(LLVM_USED_LIBS
- clangIndex
- clangFrontend
- clangDriver
- clangSema
- clangAnalysis
- clangAST
- clangParse
- clangLex
- clangBasic)
-
-set( LLVM_LINK_COMPONENTS
- bitreader
- mc
- core
- )
-
-add_clang_library(PrintFunctionNames PrintFunctionNames.cpp)
-
-set_target_properties(PrintFunctionNames
- PROPERTIES
- LINKER_LANGUAGE CXX)
diff --git a/contrib/llvm/tools/clang/examples/PrintFunctionNames/Makefile b/contrib/llvm/tools/clang/examples/PrintFunctionNames/Makefile
deleted file mode 100644
index 57d3ba9..0000000
--- a/contrib/llvm/tools/clang/examples/PrintFunctionNames/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-##===- examples/PrintFunctionNames/Makefile ----------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL = ../../../..
-LIBRARYNAME = PrintFunctionNames
-
-CPPFLAGS += -I$(PROJ_SRC_DIR)/../../include -I$(PROJ_OBJ_DIR)/../../include
-
-# Include this here so we can get the configuration of the targets that have
-# been configured for construction. We have to do this early so we can set up
-# LINK_COMPONENTS before including Makefile.rules
-include $(LEVEL)/Makefile.config
-
-LINK_LIBS_IN_SHARED = 1
-SHARED_LIBRARY = 1
-
-LINK_COMPONENTS := bitreader mc core
-USEDLIBS = clangIndex.a clangFrontend.a clangDriver.a clangSema.a \
- clangAnalysis.a clangAST.a clangParse.a clangLex.a clangBasic.a
-
-include $(LEVEL)/Makefile.common
diff --git a/contrib/llvm/tools/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp b/contrib/llvm/tools/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp
deleted file mode 100644
index 5b7b66a..0000000
--- a/contrib/llvm/tools/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-//===- PrintFunctionNames.cpp ---------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Example clang plugin which simply prints the names of all the top-level decls
-// in the input file.
-//
-//===----------------------------------------------------------------------===//
-
-#include "clang/Frontend/FrontendPluginRegistry.h"
-#include "clang/AST/ASTConsumer.h"
-#include "clang/AST/AST.h"
-#include "llvm/Support/raw_ostream.h"
-using namespace clang;
-
-namespace {
-
-class PrintFunctionsConsumer : public ASTConsumer {
-public:
- virtual void HandleTopLevelDecl(DeclGroupRef DG) {
- for (DeclGroupRef::iterator i = DG.begin(), e = DG.end(); i != e; ++i) {
- const Decl *D = *i;
- if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
- llvm::errs() << "top-level-decl: \"" << ND->getNameAsString() << "\"\n";
- }
- }
-};
-
-class PrintFunctionNamesAction : public ASTFrontendAction {
-protected:
- ASTConsumer *CreateASTConsumer(CompilerInstance &CI, llvm::StringRef) {
- return new PrintFunctionsConsumer();
- }
-};
-
-}
-
-FrontendPluginRegistry::Add<PrintFunctionNamesAction>
-X("print-fns", "print function names");
diff --git a/contrib/llvm/tools/clang/examples/PrintFunctionNames/README.txt b/contrib/llvm/tools/clang/examples/PrintFunctionNames/README.txt
deleted file mode 100644
index 267865c..0000000
--- a/contrib/llvm/tools/clang/examples/PrintFunctionNames/README.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-This is a simple example demonstrating how to use clang's facility for
-providing AST consumers using a plugin.
-
-You will probably need to build clang so that it exports all symbols (disable
-TOOL_NO_EXPORT in the tools/clang Makefile).
-
-Once the plugin is built, you can run it using:
---
-$ clang -cc1 -load path/to/PrintFunctionNames.so -plugin print-fns some-input-file.c
---
diff --git a/contrib/llvm/tools/clang/examples/clang-interpreter/CMakeLists.txt b/contrib/llvm/tools/clang/examples/clang-interpreter/CMakeLists.txt
deleted file mode 100644
index 0f63b5f..0000000
--- a/contrib/llvm/tools/clang/examples/clang-interpreter/CMakeLists.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-set(LLVM_NO_RTTI 1)
-
-set(LLVM_USED_LIBS
- clangFrontend
- clangDriver
- clangCodeGen
- clangSema
- clangChecker
- clangAnalysis
- clangRewrite
- clangAST
- clangParse
- clangLex
- clangBasic
- )
-
-set(LLVM_LINK_COMPONENTS
- jit
- interpreter
- nativecodegen
- bitreader
- bitwriter
- ipo
- selectiondag
- )
-
-add_clang_executable(clang-interpreter
- main.cpp
- )
-add_dependencies(clang-interpreter clang-headers)
diff --git a/contrib/llvm/tools/clang/examples/clang-interpreter/Makefile b/contrib/llvm/tools/clang/examples/clang-interpreter/Makefile
deleted file mode 100644
index fecc3f5..0000000
--- a/contrib/llvm/tools/clang/examples/clang-interpreter/Makefile
+++ /dev/null
@@ -1,30 +0,0 @@
-##===- examples/clang-interpreter/Makefile -----------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL = ../../../..
-
-TOOLNAME = clang-interpreter
-CPPFLAGS += -I$(PROJ_SRC_DIR)/../../include -I$(PROJ_OBJ_DIR)/../../include
-NO_INSTALL = 1
-
-# No plugins, optimize startup time.
-TOOL_NO_EXPORTS = 1
-
-# Include this here so we can get the configuration of the targets that have
-# been configured for construction. We have to do this early so we can set up
-# LINK_COMPONENTS before including Makefile.rules
-include $(LEVEL)/Makefile.config
-
-LINK_COMPONENTS := jit interpreter nativecodegen bitreader bitwriter ipo \
- selectiondag
-USEDLIBS = clangFrontend.a clangDriver.a clangCodeGen.a clangSema.a \
- clangChecker.a clangAnalysis.a clangRewrite.a clangAST.a \
- clangParse.a clangLex.a clangBasic.a
-
-include $(LLVM_SRC_ROOT)/Makefile.rules
diff --git a/contrib/llvm/tools/clang/examples/clang-interpreter/README.txt b/contrib/llvm/tools/clang/examples/clang-interpreter/README.txt
deleted file mode 100644
index 7dd45fa..0000000
--- a/contrib/llvm/tools/clang/examples/clang-interpreter/README.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-This is an example of Clang based interpreter, for executing standalone C
-programs.
-
-It demonstrates the following features:
- 1. Parsing standard compiler command line arguments using the Driver library.
-
- 2. Constructing a Clang compiler instance, using the appropriate arguments
- derived in step #1.
-
- 3. Invoking the Clang compiler to lex, parse, syntax check, and then generate
- LLVM code.
-
- 4. Use the LLVM JIT functionality to execute the final module.
-
-The implementation has many limitations and is not designed to be a full fledged
-C interpreter. It is designed to demonstrate a simple but functional use of the
-Clang compiler libraries.
diff --git a/contrib/llvm/tools/clang/examples/clang-interpreter/main.cpp b/contrib/llvm/tools/clang/examples/clang-interpreter/main.cpp
deleted file mode 100644
index 8623954..0000000
--- a/contrib/llvm/tools/clang/examples/clang-interpreter/main.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-//===-- examples/clang-interpreter/main.cpp - Clang C Interpreter Example -===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "clang/Driver/Compilation.h"
-#include "clang/Driver/Driver.h"
-#include "clang/Driver/Tool.h"
-#include "clang/Frontend/CodeGenAction.h"
-#include "clang/Frontend/CompilerInvocation.h"
-#include "clang/Frontend/CompilerInstance.h"
-#include "clang/Frontend/DiagnosticOptions.h"
-#include "clang/Frontend/FrontendDiagnostic.h"
-#include "clang/Frontend/TextDiagnosticPrinter.h"
-
-#include "llvm/LLVMContext.h"
-#include "llvm/Module.h"
-#include "llvm/Config/config.h"
-#include "llvm/ADT/OwningPtr.h"
-#include "llvm/ADT/SmallString.h"
-#include "llvm/Config/config.h"
-#include "llvm/ExecutionEngine/ExecutionEngine.h"
-#include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/raw_ostream.h"
-#include "llvm/System/Host.h"
-#include "llvm/System/Path.h"
-#include "llvm/Target/TargetSelect.h"
-using namespace clang;
-using namespace clang::driver;
-
-llvm::sys::Path GetExecutablePath(const char *Argv0) {
- // This just needs to be some symbol in the binary; C++ doesn't
- // allow taking the address of ::main however.
- void *MainAddr = (void*) (intptr_t) GetExecutablePath;
- return llvm::sys::Path::GetMainExecutable(Argv0, MainAddr);
-}
-
-int Execute(llvm::Module *Mod, char * const *envp) {
- llvm::InitializeNativeTarget();
-
- std::string Error;
- llvm::OwningPtr<llvm::ExecutionEngine> EE(
- llvm::ExecutionEngine::createJIT(Mod, &Error));
- if (!EE) {
- llvm::errs() << "unable to make execution engine: " << Error << "\n";
- return 255;
- }
-
- llvm::Function *EntryFn = Mod->getFunction("main");
- if (!EntryFn) {
- llvm::errs() << "'main' function not found in module.\n";
- return 255;
- }
-
- // FIXME: Support passing arguments.
- std::vector<std::string> Args;
- Args.push_back(Mod->getModuleIdentifier());
-
- return EE->runFunctionAsMain(EntryFn, Args, envp);
-}
-
-int main(int argc, const char **argv, char * const *envp) {
- void *MainAddr = (void*) (intptr_t) GetExecutablePath;
- llvm::sys::Path Path = GetExecutablePath(argv[0]);
- TextDiagnosticPrinter DiagClient(llvm::errs(), DiagnosticOptions());
-
- Diagnostic Diags(&DiagClient);
- Driver TheDriver(Path.getBasename(), Path.getDirname(),
- llvm::sys::getHostTriple(),
- "a.out", /*IsProduction=*/false, /*CXXIsProduction=*/false,
- Diags);
- TheDriver.setTitle("clang interpreter");
-
- // FIXME: This is a hack to try to force the driver to do something we can
- // recognize. We need to extend the driver library to support this use model
- // (basically, exactly one input, and the operation mode is hard wired).
- llvm::SmallVector<const char *, 16> Args(argv, argv + argc);
- Args.push_back("-fsyntax-only");
- llvm::OwningPtr<Compilation> C(TheDriver.BuildCompilation(Args.size(),
- Args.data()));
- if (!C)
- return 0;
-
- // FIXME: This is copied from ASTUnit.cpp; simplify and eliminate.
-
- // We expect to get back exactly one command job, if we didn't something
- // failed. Extract that job from the compilation.
- const driver::JobList &Jobs = C->getJobs();
- if (Jobs.size() != 1 || !isa<driver::Command>(Jobs.begin())) {
- llvm::SmallString<256> Msg;
- llvm::raw_svector_ostream OS(Msg);
- C->PrintJob(OS, C->getJobs(), "; ", true);
- Diags.Report(diag::err_fe_expected_compiler_job) << OS.str();
- return 1;
- }
-
- const driver::Command *Cmd = cast<driver::Command>(*Jobs.begin());
- if (llvm::StringRef(Cmd->getCreator().getName()) != "clang") {
- Diags.Report(diag::err_fe_expected_clang_command);
- return 1;
- }
-
- // Initialize a compiler invocation object from the clang (-cc1) arguments.
- const driver::ArgStringList &CCArgs = Cmd->getArguments();
- llvm::OwningPtr<CompilerInvocation> CI(new CompilerInvocation);
- CompilerInvocation::CreateFromArgs(*CI,
- const_cast<const char **>(CCArgs.data()),
- const_cast<const char **>(CCArgs.data()) +
- CCArgs.size(),
- Diags);
-
- // Show the invocation, with -v.
- if (CI->getHeaderSearchOpts().Verbose) {
- llvm::errs() << "clang invocation:\n";
- C->PrintJob(llvm::errs(), C->getJobs(), "\n", true);
- llvm::errs() << "\n";
- }
-
- // FIXME: This is copied from cc1_main.cpp; simplify and eliminate.
-
- // Create a compiler instance to handle the actual work.
- CompilerInstance Clang;
- Clang.setLLVMContext(new llvm::LLVMContext);
- Clang.setInvocation(CI.take());
-
- // Create the compilers actual diagnostics engine.
- Clang.createDiagnostics(int(CCArgs.size()),const_cast<char**>(CCArgs.data()));
- if (!Clang.hasDiagnostics())
- return 1;
-
- // Infer the builtin include path if unspecified.
- if (Clang.getHeaderSearchOpts().UseBuiltinIncludes &&
- Clang.getHeaderSearchOpts().ResourceDir.empty())
- Clang.getHeaderSearchOpts().ResourceDir =
- CompilerInvocation::GetResourcesPath(argv[0], MainAddr);
-
- // Create and execute the frontend to generate an LLVM bitcode module.
- llvm::OwningPtr<CodeGenAction> Act(new EmitLLVMOnlyAction());
- if (!Clang.ExecuteAction(*Act))
- return 1;
-
- int Res = 255;
- if (llvm::Module *Module = Act->takeModule())
- Res = Execute(Module, envp);
-
- // Shutdown.
-
- llvm::llvm_shutdown();
-
- return Res;
-}
diff --git a/contrib/llvm/tools/clang/examples/wpa/CMakeLists.txt b/contrib/llvm/tools/clang/examples/wpa/CMakeLists.txt
deleted file mode 100644
index 8d443d6..0000000
--- a/contrib/llvm/tools/clang/examples/wpa/CMakeLists.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-set(LLVM_NO_RTTI 1)
-
-set(LLVM_USED_LIBS
- clangIndex
- clangFrontend
- clangDriver
- clangSema
- clangAnalysis
- clangAST
- clangParse
- clangLex
- clangBasic)
-
-set( LLVM_LINK_COMPONENTS
- bitreader
- mc
- core
- )
-
-add_clang_executable(clang-wpa
- clang-wpa.cpp
- )
-add_dependencies(clang-wpa clang-headers)
diff --git a/contrib/llvm/tools/clang/examples/wpa/Makefile b/contrib/llvm/tools/clang/examples/wpa/Makefile
deleted file mode 100644
index 6b7f407..0000000
--- a/contrib/llvm/tools/clang/examples/wpa/Makefile
+++ /dev/null
@@ -1,28 +0,0 @@
-##===- examples/wpa/Makefile -------------------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-
-LEVEL = ../../../..
-
-TOOLNAME = clang-wpa
-CPPFLAGS += -I$(PROJ_SRC_DIR)/../../include -I$(PROJ_OBJ_DIR)/../../include
-NO_INSTALL = 1
-
-# No plugins, optimize startup time.
-TOOL_NO_EXPORTS = 1
-
-# Include this here so we can get the configuration of the targets that have
-# been configured for construction. We have to do this early so we can set up
-# LINK_COMPONENTS before including Makefile.rules
-include $(LEVEL)/Makefile.config
-
-LINK_COMPONENTS := bitreader mc core
-USEDLIBS = clangIndex.a clangFrontend.a clangDriver.a clangSema.a \
- clangAnalysis.a clangAST.a clangParse.a clangLex.a clangBasic.a
-
-include $(LLVM_SRC_ROOT)/Makefile.rules
diff --git a/contrib/llvm/tools/clang/examples/wpa/clang-wpa.cpp b/contrib/llvm/tools/clang/examples/wpa/clang-wpa.cpp
deleted file mode 100644
index b515e33..0000000
--- a/contrib/llvm/tools/clang/examples/wpa/clang-wpa.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-//===--- clang-wpa.cpp - clang whole program analyzer ---------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This tool reads a sequence of precompiled AST files, and do various
-// cross translation unit analyses.
-//
-//===----------------------------------------------------------------------===//
-
-#include "clang/Basic/FileManager.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Frontend/ASTUnit.h"
-#include "clang/Frontend/CompilerInstance.h"
-#include "clang/Index/CallGraph.h"
-#include "llvm/ADT/IntrusiveRefCntPtr.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/raw_ostream.h"
-using namespace clang;
-using namespace idx;
-
-static llvm::cl::list<std::string>
-InputFilenames(llvm::cl::Positional, llvm::cl::desc("<input AST files>"));
-
-int main(int argc, char **argv) {
- llvm::cl::ParseCommandLineOptions(argc, argv, "clang-wpa");
- FileManager FileMgr;
- std::vector<ASTUnit*> ASTUnits;
-
- if (InputFilenames.empty())
- return 0;
-
- DiagnosticOptions DiagOpts;
- llvm::IntrusiveRefCntPtr<Diagnostic> Diags
- = CompilerInstance::createDiagnostics(DiagOpts, argc, argv);
- for (unsigned i = 0, e = InputFilenames.size(); i != e; ++i) {
- const std::string &InFile = InputFilenames[i];
- llvm::OwningPtr<ASTUnit> AST(ASTUnit::LoadFromPCHFile(InFile, Diags));
- if (!AST)
- return 1;
-
- ASTUnits.push_back(AST.take());
- }
-
- llvm::OwningPtr<CallGraph> CG;
- CG.reset(new CallGraph());
-
- for (unsigned i = 0, e = ASTUnits.size(); i != e; ++i)
- CG->addTU(ASTUnits[i]->getASTContext());
-
- CG->ViewCallGraph();
-}
diff --git a/contrib/llvm/tools/clang/www/CheckerNotes.html b/contrib/llvm/tools/clang/www/CheckerNotes.html
deleted file mode 100644
index 523048d..0000000
--- a/contrib/llvm/tools/clang/www/CheckerNotes.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-<title>Static Analysis</title>
-<meta http-equiv="REFRESH" content="0;url=http://clang.llvm.org/StaticAnalysis.html"></HEAD>
-<BODY>
-This page has relocated: <a href="http://clang.llvm.org/StaticAnalysis.html">http://clang.llvm.org/StaticAnalysis.html</a>.
-</BODY>
-</HTML>
diff --git a/contrib/llvm/tools/clang/www/OpenProjects.html b/contrib/llvm/tools/clang/www/OpenProjects.html
deleted file mode 100644
index 46d9716..0000000
--- a/contrib/llvm/tools/clang/www/OpenProjects.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Get Involved</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<h1>Open Clang Projects</h1>
-
-<p>Here are a few tasks that are available for newcomers to work on, depending
-on what your interests are. This list is provided to generate ideas, it is not
-intended to be comprehensive. Please ask on cfe-dev for more specifics or to
-verify that one of these isn't already completed. :)</p>
-
-<ul>
-<li><b>Compile your favorite C/ObjC project with Clang</b>:
-Clang's type-checking and code generation is very close to complete (but not bug free!) for C and Objective-C. We appreciate all reports of code that is
-rejected or miscompiled by the front-end. If you notice invalid code that is not rejected, or poor diagnostics when code is rejected, that is also very important to us. For make-based projects,
-the <a href="get_started.html#driver"><code>clang</code></a> driver works as a drop-in replacement for GCC.</li>
-
-<li><b>Undefined behavior checking</b>: CodeGen could
-insert runtime checks for all sorts of different undefined behaviors, from
-reading uninitialized variables, buffer overflows, and many other things. This
-checking would be expensive, but the optimizers could eliminate many of the
-checks in some cases, and it would be very interesting to test code in this mode
-for certain crowds of people. Because the inserted code is coming from clang,
-the "abort" message could be very detailed about exactly what went wrong.</li>
-
-<li><b>Improve target support</b>: The current target interfaces are heavily
-stubbed out and need to be implemented fully. See the FIXME's in TargetInfo.
-Additionally, the actual target implementations (instances of TargetInfoImpl)
-also need to be completed.</li>
-
-<li><b>Implement an tool to generate code documentation</b>: Clang's
-library-based design allows it to be used by a variety of tools that reason
-about source code. One great application of Clang would be to build an
-auto-documentation system like doxygen that generates code documentation from
-source code. The advantage of using Clang for such a tool is that the tool would
-use the same preprocessor/parser/ASTs as the compiler itself, giving it a very
-rich understanding of the code.</li>
-
-<li><b>Use clang libraries to implement better versions of existing tools</b>:
-Clang is built as a set of libraries, which means that it is possible to
-implement capabilities similar to other source language tools, improving them
-in various ways. Two examples are <a href="http://distcc.samba.org/">distcc</a>
-and the <a href="http://delta.tigris.org/">delta testcase reduction tool</a>.
-The former can be improved to scale better and be more efficient. The latter
-could also be faster and more efficient at reducing C-family programs if built
-on the clang preprocessor.</li>
-
-<li><b>Use clang libraries to extend Ragel with a JIT</b>: <a
-href="http://research.cs.queensu.ca/~thurston/ragel/">Ragel</a> is a state
-machine compiler that lets you embed C code into state machines and generate
-C code. It would be relatively easy to turn this into a JIT compiler using
-LLVM.</li>
-
-<li><b>Self-testing using clang</b>: There are several neat ways to
-improve the quality of clang by self-testing. Some examples:
-<ul>
- <li>Improve the reliability of AST printing and serialization by
- ensuring that the AST produced by clang on an input doesn't change
- when it is reparsed or unserialized.
-
- <li>Improve parser reliability and error generation by automatically
- or randomly changing the input checking that clang doesn't crash and
- that it doesn't generate excessive errors for small input
- changes. Manipulating the input at both the text and token levels is
- likely to produce interesting test cases.
-</ul>
-</li>
-
-<li><b>Continue work on C++ support</b>: Implementing all of C++ is a very big
-job, but there are lots of little pieces that can be picked off and implemented. Here are some small- to mid-sized C++ implementation projects:
-<ul>
- <li>Fix bugs: there are a number of XFAIL'd test cases in Clang's repository (particularly in the CXX subdirectory). Pick a test case and fix Clang to make it work!</li>
- <li>Write tests: the CXX test subdirectory in Clang's repository has placeholders for tests of every paragraph in the C++ standard. Pick a paragraph, write a few tests, and see if they work! Even if they don't we'd still like the new tests (with XFAIL'd) so that we know what to fix.</li>
- <li>Parsing and semantic analysis for using declarations in classes</li>
- <li>Inherited conversion functions</li>
- <li>Improved diagnostics for overloading failures and ambiguities</li>
- <li>Improved template error messages, e.g., with more informative backtraces</li>
-</ul>
-
-Also, see the <a href="cxx_status.html">C++ status report page</a> to
-find out what is missing and what is already at least partially
-supported.</li>
-</ul>
-
-<p>If you hit a bug with clang, it is very useful for us if you reduce the code
-that demonstrates the problem down to something small. There are many ways to
-do this; ask on cfe-dev for advice.</p>
-
-<li><b>StringRef'ize APIs</b>: A thankless but incredibly useful project is
-StringRef'izing (converting to use <tt>llvm::StringRef</tt> instead of <tt>const
-char *</tt> or <tt>std::string</tt>) various clang interfaces. This generally
-simplifies the code and makes it more efficient.</li>
-
-<li><b>Universal Driver</b>: Clang is inherently a cross compiler. We would like
-to define a new model for cross compilation which provides a great user
-experience -- it should be easy to cross compile applications, install support
-for new architectures, access different compilers and tools, and be consistent
-across different platforms. See the <a href="UniversalDriver.html">Universal
-Driver</a> web page for more information.</li>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/StaticAnalysis.html b/contrib/llvm/tools/clang/www/StaticAnalysis.html
deleted file mode 100644
index a701c0ff0..0000000
--- a/contrib/llvm/tools/clang/www/StaticAnalysis.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <meta HTTP-EQUIV="REFRESH" content="0; url=http://clang-analyzer.llvm.org">
- <title>LLVM/Clang Static Analyzer</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<p>This page has moved: <a href="http://clang-analyzer.llvm.org">clang.analyzer.llvm.org</a>.</p>
-
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/StaticAnalysisUsage.html b/contrib/llvm/tools/clang/www/StaticAnalysisUsage.html
deleted file mode 100644
index a701c0ff0..0000000
--- a/contrib/llvm/tools/clang/www/StaticAnalysisUsage.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <meta HTTP-EQUIV="REFRESH" content="0; url=http://clang-analyzer.llvm.org">
- <title>LLVM/Clang Static Analyzer</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<p>This page has moved: <a href="http://clang-analyzer.llvm.org">clang.analyzer.llvm.org</a>.</p>
-
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/UniversalDriver.html b/contrib/llvm/tools/clang/www/UniversalDriver.html
deleted file mode 100644
index 82ccc8de..0000000
--- a/contrib/llvm/tools/clang/www/UniversalDriver.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Universal Driver</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<h1>The Clang Universal Driver Project</h1>
-
-<p>Clang is inherently a cross compiler, in that it is always capable of
-building code for targets which are a different architecture or even operating
-system from the one running the compiler. However, actually cross compiling in
-practice involves much more than just generating the right assembly code for a
-target, it also requires having an appropriate tool chain (assemblers, linkers),
-access to header files and libraries for the target, and many other details (for
-example, the calling convention or whether software floating point is in
-use). Traditionally, compilers and development environments provide little
-assistance with this process, so users do not have easy access to the powerful
-underlying cross-compilation abilities of clang.</p>
-
-<p>We would like to solve this problem by defining a new model for how cross
-compilation is done, based on the idea of a <i>universal driver</i>. The key
-point of this model is that the user would always access the compiler through a
-single entry point (e.g., <tt>/usr/bin/cc</tt>) and provide an argument
-specifying the <i>configuration</i> they would like to target. Under the hood
-this entry point (the universal driver) would have access to all the information
-that the driver, compiler, and other tools need to build applications for that
-target.</p>
-
-<p>This is a large and open-ended project. It's eventual success depends not
-just on implementing the model, but also on getting buy-in from compiler
-developers, operating system distribution vendors and the development community
-at large. Our plan is to begin by defining a clear list of the problems we want
-to solve and a proposed implementation (from the user perspective).</p>
-
-<p>This project is in the very early (i.e., thought experiment) stages of
-development. Stay tuned for more information, and of course, patches
-welcome!</p>
-
-<p>See also <a href="http://llvm.org/PR4127">PR4127</a>.</p>
-
-<h2>Existing Solutions and Related Work</h2>
-
-<ul>
- <li>gcc's command line arguments <tt>-V</tt>, <tt>-B</tt>, <tt>-b</tt> are
- generic but limited solutions to related problems. Similarly, <tt>-m32</tt>
- and <tt>-m64</tt> solve a small subset of the problem for specific
- architectures.</li>
-
- <li>gcc's <a href="http://www.airs.com/ian/configure/configure_8.html">multilibs</a>
- solve the part of the problem that relates to finding appropriate libraries
- and include files based on particular feature support (soft float,
- etc.).</li>
-
- <li>Apple's "driver driver" supported by gcc and clang solve a subset of the
- problem by supporting <tt>-arch</tt>. Apple also provides a tool chain which
- supports <a href="http://en.wikipedia.org/wiki/Universal_binary">universal
- binaries</a> and object files which may include data for multiple
- architectures. See <a href="http://developer.apple.com/mac/library/technotes/tn2005/tn2137.html">TN2137</a>
- for an example of how this is used.</li>
-
- <li>Many operating systems and environments solve the problem by installing
- complete development environments (including the IDE, tools, header files,
- and libraries) for a single tool chain. This is cumbersome for users and
- does not match well with tools which are inherently capable of cross
- compiling.</li>
-
- <li>The Debian <a href="http://wiki.debian.org/ArmEabiPort">ArmEabiPort</a>
- wiki page for their work to support the ARM EABI provide an interesting
- glimpse into how related issues impact the operating system distribution.</li>
-
- <li><a href="http://icculus.org/fatelf/">FatELF</a> is a proposal for bringing
- Mac OS X like "Universal Binary" support to ELF based platforms.</li>
-
-</ul>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/analyzer/annotations.html b/contrib/llvm/tools/clang/www/analyzer/annotations.html
deleted file mode 100644
index 5184aed..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/annotations.html
+++ /dev/null
@@ -1,458 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <title>Source Annotations</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <script type="text/javascript" src="scripts/menu.js"></script>
- <script type="text/javascript" src="scripts/dbtree.js"></script>
-</head>
-<body>
-
-<div id="page">
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<h1>Source Annotations</h1>
-
-<p>The Clang frontend supports several source-level annotations in the form of
-<a href="http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html">GCC-style
-attributes</a> and pragmas that can help make using the Clang Static Analyzer
-more useful. These annotations can both help suppress false positives as well as
-enhance the analyzer's ability to find bugs.</p>
-
-<p>This page gives a practical overview of such annotations. For more technical
-specifics regarding Clang-specific annotations please see the Clang's list of <a
-href="http://clang.llvm.org/docs/LanguageExtensions.html">language
-extensions</a>. Details of &quot;standard&quot; GCC attributes (that Clang also
-supports) can be found in the <a href="http://gcc.gnu.org/onlinedocs/gcc/">GCC
-manual</a>, with the majority of the relevant attributes being in the section on
-<a href="http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html">function
-attributes</a>.</p>
-
-<p>Note that attributes that are labeled <b>Clang-specific</b> are not
-recognized by GCC. Their use can be conditioned using preprocessor macros
-(examples included on this page).</p>
-
-<h4>Specific Topics</h4>
-
-<ul id="collapsetree" class="dbtree onclick multiple">
-<li><a href="#generic">Annotations to Enhance Generic Checks</a>
- <ul>
- <li><a href="#null_checking"><span>Null Pointer Checking</span></a>
- <ul>
- <li><a href="#attr_nonnull"><span>Attribute 'nonnull'</span></a></li>
- </ul>
- </li>
- </ul>
-</li>
-<li><a href="#macosx">Mac OS X API Annotations</a>
- <ul>
- <li><a href="#cocoa_mem">Cocoa &amp; Core Foundation Memory Management Annotations</a>
- <ul>
- <li><a href="#attr_ns_returns_retained">Attribute 'ns_returns_retained'</a></li>
- <li><a href="#attr_ns_returns_not_retained">Attribute 'ns_returns_not_retained'</a></li>
- <li><a href="#attr_cf_returns_retained">Attribute 'cf_returns_retained'</a></li>
- <li><a href="#attr_cf_returns_not_retained">Attribute 'cf_returns_not_retained'</a></li>
- </ul>
- </li>
- </ul>
-</li>
-<li><a href="#custom_assertions">Custom Assertion Handlers</a>
- <ul>
- <li><a href="#attr_noreturn">Attribute 'noreturn'</a></li>
- <li><a href="#attr_analyzer_noreturn">Attribute 'analyzer_noreturn'</a></li>
- </ul>
- </li>
-</ul>
-
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<h2 id="generic">Annotations to Enhance Generic Checks</h2>
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-
-<h3 id="null_checking">Null Pointer Checking</h3>
-
-<h4 id="attr_nonnull">Attribute 'nonnull'</h4>
-
-<p>The analyzer recognizes the GCC attribute 'nonnull', which indicates that a
-function expects that a given function parameter is not a null pointer. Specific
-details of the syntax of using the 'nonnull' attribute can be found in <a
-href="http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#index-g_t_0040code_007bnonnull_007d-function-attribute-2263">GCC's
-documentation</a>.</p>
-
-<p>Both the Clang compiler and GCC will flag warnings for simple cases where a
-null pointer is directly being passed to a function with a 'nonnull' parameter
-(e.g., as a constant). The analyzer extends this checking by using its deeper
-symbolic analysis to track what pointer values are potentially null and then
-flag warnings when they are passed in a function call via a 'nonnull'
-parameter.</p>
-
-<p><b>Example</b></p>
-
-<pre class="code_example">
-<span class="command">$ cat test.m</span>
-int bar(int*p, int q, int *r) __attribute__((nonnull(1,3)));
-
-int foo(int *p, int *q) {
- return !p ? bar(q, 2, p)
- : bar(p, 2, q);
-}
-</pre>
-
-<p>Running <tt>scan-build</tt> over this source produces the following
-output:</p>
-
-<img src="images/example_attribute_nonnull.png">
-
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<h2 id="macosx">Mac OS X API Annotations</h2>
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-
-<h3 id="cocoa_mem">Cocoa &amp; Core Foundation Memory Management
-Annotations</h3>
-
-<!--
-<p>As described in <a href="/available_checks.html#retain_release">Available
-Checks</a>,
--->
-<p>The analyzer supports the proper management of retain counts for
-both Cocoa and Core Foundation objects. This checking is largely based on
-enforcing Cocoa and Core Foundation naming conventions for Objective-C methods
-(Cocoa) and C functions (Core Foundation). Not strictly following these
-conventions can cause the analyzer to miss bugs or flag false positives.</p>
-
-<p>One can educate the analyzer (and others who read your code) about methods or
-functions that deviate from the Cocoa and Core Foundation conventions using the
-attributes described here.</p>
-
-<h4 id="attr_ns_returns_retained">Attribute 'ns_returns_retained'
-(Clang-specific)</h4>
-
-<p>The GCC-style (Clang-specific) attribute 'ns_returns_retained' allows one to
-annotate an Objective-C method or C function as returning a retained Cocoa
-object that the caller is responsible for releasing (via sending a
-<tt>release</tt> message to the object).</p>
-
-<p><b>Placing on Objective-C methods</b>: For Objective-C methods, this
-annotation essentially tells the analyzer to treat the method as if its name
-begins with &quot;alloc&quot; or &quot;new&quot; or contais the word
-&quot;copy&quot;.</p>
-
-<p><b>Placing on C functions</b>: For C functions returning Cocoa objects, the
-analyzer typically does not make any assumptions about whether or not the object
-is returned retained. Explicitly adding the 'ns_returns_retained' attribute to C
-functions allows the analyzer to perform extra checking.</p>
-
-<p><b>Important note when using Garbage Collection</b>: Note that the analyzer
-interprets this attribute slightly differently when using Objective-C garbage
-collection (available on Mac OS 10.5+). When analyzing Cocoa code that uses
-garbage collection, &quot;alloc&quot; methods are assumed to return an object
-that is managed by the garbage collector (and thus doesn't have a retain count
-the caller must balance). These same assumptions are applied to methods or
-functions annotated with 'ns_returns_retained'. If you are returning a Core
-Foundation object (which may not be managed by the garbage collector) you should
-use 'cf_returns_retained'.</p>
-
-<p><b>Example</b></p>
-
-<pre class="code_example">
-<span class="command">$ cat test.m</span>
-#import &lt;Foundation/Foundation.h&gt;
-
-#ifndef __has_feature // Optional.
-#define __has_feature(x) 0 // Compatibility with non-clang compilers.
-#endif
-
-#ifndef NS_RETURNS_RETAINED
-#if __has_feature(attribute_ns_returns_retained)
-<span class="code_highlight">#define NS_RETURNS_RETAINED __attribute__((ns_returns_retained))</span>
-#else
-#define NS_RETURNS_RETAINED
-#endif
-#endif
-
-@interface MyClass : NSObject {}
-- (NSString*) returnsRetained <span class="code_highlight">NS_RETURNS_RETAINED</span>;
-- (NSString*) alsoReturnsRetained;
-@end
-
-@implementation MyClass
-- (NSString*) returnsRetained {
- return [[NSString alloc] initWithCString:"no leak here"];
-}
-- (NSString*) alsoReturnsRetained {
- return [[NSString alloc] initWithCString:"flag a leak"];
-}
-@end
-</pre>
-
-<p>Running <tt>scan-build</tt> on this source file produces the following output:</p>
-
-<img src="images/example_ns_returns_retained.png">
-
-<h4 id="attr_ns_returns_not_retained">Attribute 'ns_returns_not_retained'
-(Clang-specific)</h4>
-
-<p>The 'ns_returns_not_retained' attribute is the complement of '<a
-href="#attr_ns_returns_retained">ns_returns_retained</a>'. Where a function or
-method may appear to obey the Cocoa conventions and return a retained Cocoa
-object, this attribute can be used to indicate that the object reference
-returned should not be considered as an &quot;owning&quot; reference being
-returned to the caller.</p>
-
-<p>Usage is identical to <a
-href="#attr_ns_returns_retained">ns_returns_retained</a>. When using the
-attribute, be sure to declare it within the proper macro that checks for
-its availability, as it is not available in earlier versions of the analyzer:</p>
-
-<pre class="code_example">
-<span class="command">$ cat test.m</span>
-#ifndef __has_feature // Optional.
-#define __has_feature(x) 0 // Compatibility with non-clang compilers.
-#endif
-
-#ifndef NS_RETURNS_NOT_RETAINED
-#if __has_feature(attribute_ns_returns_not_retained)
-<span class="code_highlight">#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))</span>
-#else
-#define NS_RETURNS_NOT_RETAINED
-#endif
-#endif
-</pre>
-
-<h4 id="attr_cf_returns_retained">Attribute 'cf_returns_retained'
-(Clang-specific)</h4>
-
-<p>The GCC-style (Clang-specific) attribute 'cf_returns_retained' allows one to
-annotate an Objective-C method or C function as returning a retained Core
-Foundation object that the caller is responsible for releasing.
-
-<p><b>Placing on Objective-C methods</b>: With respect to Objective-C methods.,
-this attribute is identical in its behavior and usage to 'ns_returns_retained'
-except for the distinction of returning a Core Foundation object instead of a
-Cocoa object. This distinction is important for two reasons:</p>
-
-<ul>
- <li>Core Foundation objects are not automatically managed by the Objective-C
- garbage collector.</li>
- <li>Because Core Foundation is a C API, the analyzer cannot always tell that a
- pointer return value refers to a Core Foundation object. In contrast, it is
- trivial for the analyzer to recognize if a pointer refers to a Cocoa object
- (given the Objective-C type system).</p>
-</ul>
-
-<p><b>Placing on C functions</b>: When placing the attribute
-'cf_returns_retained' on the declarations of C functions, the analyzer
-interprets the function as:</p>
-
-<ol>
- <li>Returning a Core Foundation Object</li>
- <li>Treating the function as if it its name
-contained the keywords &quot;create&quot; or &quot;copy&quot;. This means the
-returned object as a +1 retain count that must be released by the caller, either
-by sending a <tt>release</tt> message (via toll-free bridging to an Objective-C
-object pointer), calling <tt>CFRelease</tt> (or similar function), or using
-<tt>CFMakeCollectable</tt> to register the object with the Objective-C garbage
-collector.</li>
-</ol>
-
-<p><b>Example</b></p>
-
-<p>In this example, observe the difference in output when the code is compiled
-to not use garbage collection versus when it is compiled to only use garbage
-collection (<tt>-fobjc-gc-only</tt>).</p>
-
-<pre class="code_example">
-<span class="command">$ cat test.m</span>
-$ cat test.m
-#import &lt;Cocoa/Cocoa.h&gt;
-
-#ifndef __has_feature // Optional.
-#define __has_feature(x) 0 // Compatibility with non-clang compilers.
-#endif
-
-#ifndef CF_RETURNS_RETAINED
-#if __has_feature(attribute_cf_returns_retained)
-<span class="code_highlight">#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))</span>
-#else
-#define CF_RETURNS_RETAINED
-#endif
-#endif
-
-@interface MyClass : NSObject {}
-- (NSDate*) returnsCFRetained <span class="code_highlight">CF_RETURNS_RETAINED</span>;
-- (NSDate*) alsoReturnsRetained;
-- (NSDate*) returnsNSRetained <span class="code_highlight">NS_RETURNS_RETAINED</span>;
-@end
-
-<span class="code_highlight">CF_RETURNS_RETAINED</span>
-CFDateRef returnsRetainedCFDate() {
- return CFDateCreate(0, CFAbsoluteTimeGetCurrent());
-}
-
-@implementation MyClass
-- (NSDate*) returnsCFRetained {
- return (NSDate*) returnsRetainedCFDate(); // No leak.
-}
-
-- (NSDate*) alsoReturnsRetained {
- return (NSDate*) returnsRetainedCFDate(); // Always report a leak.
-}
-
-- (NSDate*) returnsNSRetained {
- return (NSDate*) returnsRetainedCFDate(); // Report a leak when using GC.
-}
-@end
-</pre>
-
-<p>Running <tt>scan-build</tt> on this example produces the following output:</p>
-
-<img src="images/example_cf_returns_retained.png">
-
-</p>When the above code is compiled using Objective-C garbage collection (i.e.,
-code is compiled with the flag <tt>-fobjc-gc</tt> or <tt>-fobjc-gc-only</tt>),
-<tt>scan-build</tt> produces both the above error (with slightly different text
-to indicate the code uses garbage collection) as well as the following warning,
-which indicates a leak that occurs <em>only</em> when using garbage
-collection:</p>
-
-<img src="images/example_cf_returns_retained_gc.png">
-
-<h4 id="attr_cf_returns_not_retained">Attribute 'cf_returns_not_retained'
-(Clang-specific)</h4>
-
-<p>The 'cf_returns_not_retained' attribute is the complement of '<a
-href="#attr_cf_returns_retained">cf_returns_retained</a>'. Where a function or
-method may appear to obey the Core Foundation or Cocoa conventions and return
-a retained Core Foundation object, this attribute can be used to indicate that
-the object reference returned should not be considered as an
-&quot;owning&quot; reference being returned to the caller.</p>
-
-<p>Usage is identical to <a
-href="#attr_cf_returns_retained">cf_returns_retained</a>. When using the
-attribute, be sure to declare it within the proper macro that checks for
-its availability, as it is not available in earlier versions of the analyzer:</p>
-
-<pre class="code_example">
-<span class="command">$ cat test.m</span>
-#ifndef __has_feature // Optional.
-#define __has_feature(x) 0 // Compatibility with non-clang compilers.
-#endif
-
-#ifndef CF_RETURNS_NOT_RETAINED
-#if __has_feature(attribute_cf_returns_not_retained)
-<span class="code_highlight">#define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained))</span>
-#else
-#define CF_RETURNS_NOT_RETAINED
-#endif
-#endif
-</pre>
-
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<h2 id="custom_assertions">Custom Assertion Handlers</h2>
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-
-<p>The analyzer exploits code assertions by pruning off paths where the
-assertion condition is false. The idea is capture any program invariants
-specified in the assertion that the developer may know but is not immediately
-apparent in the code itself. In this way assertions make implicit assumptions
-explicit in the code, which not only makes the analyzer more accurate when
-finding bugs, but can help others better able to understand your code as well.
-It can also help remove certain kinds of analyzer false positives by pruning off
-false paths.</p>
-
-<p>In order to exploit assertions, however, the analyzer must understand when it
-encounters an &quot;assertion handler.&quot; Typically assertions are
-implemented with a macro, with the macro performing a check for the assertion
-condition and, when the check fails, calling an assertion handler. For example, consider the following code
-fragment:</p>
-
-<pre class="code_example">
-void foo(int *p) {
- assert(p != NULL);
-}
-</pre>
-
-<p>When this code is preprocessed on Mac OS X it expands to the following:</p>
-
-<pre class="code_example">
-void foo(int *p) {
- (__builtin_expect(!(p != NULL), 0) ? __assert_rtn(__func__, "t.c", 4, "p != NULL") : (void)0);
-}
-</pre>
-
-<p>In this example, the assertion handler is <tt>__assert_rtn</tt>. When called,
-most assertion handlers typically print an error and terminate the program. The
-analyzer can exploit such semantics by ending the analysis of a path once it
-hits a call to an assertion handler.</p>
-
-<p>The trick, however, is that the analyzer needs to know that a called function
-is an assertion handler; otherwise the analyzer might assume the function call
-returns and it will continue analyzing the path where the assertion condition
-failed. This can lead to false positives, as the assertion condition usually
-implies a safety condition (e.g., a pointer is not null) prior to performing
-some action that depends on that condition (e.g., dereferencing a pointer).</p>
-
-<p>The analyzer knows about several well-known assertion handlers, but can
-automatically infer if a function should be treated as an assertion handler if
-it is annotated with the 'noreturn' attribute or the (Clang-specific)
-'analyzer_noreturn' attribute.</p>
-
-<h4 id="attr_noreturn">Attribute 'noreturn'</h4>
-
-<p>The 'noreturn' attribute is a GCC-attribute that can be placed on the
-declarations of functions. It means exactly what its name implies: a function
-with a 'noreturn' attribute should never return.</p>
-
-<p>Specific details of the syntax of using the 'noreturn' attribute can be found
-in <a
-href="http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#index-g_t_0040code_007bnoreturn_007d-function-attribute-2264">GCC's
-documentation</a>.</p>
-
-<p>Not only does the analyzer exploit this information when pruning false paths,
-but the compiler also takes it seriously and will generate different code (and
-possibly better optimized) under the assumption that the function does not
-return.</p>
-
-<p><b>Example</b></p>
-
-<p>On Mac OS X, the function prototype for <tt>__assert_rtn</tt> (declared in
-<tt>assert.h</tt>) is specifically annotated with the 'noreturn' attribute:</p>
-
-<pre class="code_example">
-void __assert_rtn(const char *, const char *, int, const char *) <span class="code_highlight">__attribute__((__noreturn__))</span>;
-</pre>
-
-<h4 id="attr_analyzer_noreturn">Attribute 'analyzer_noreturn' (Clang-specific)</h4>
-
-<p>The Clang-specific 'analyzer_noreturn' attribute is almost identical to
-'noreturn' except that it is ignored by the compiler for the purposes of code
-generation.</p>
-
-<p>This attribute is useful for annotating assertion handlers that actually
-<em>can</em> return, but for the purpose of using the analyzer we want to
-pretend that such functions do not return.</p>
-
-<p>Because this attribute is Clang-specific, its use should be conditioned with
-the use of preprocessor macros.</p>
-
-<p><b>Example</b>
-
-<pre class="code_example">
-#ifndef CLANG_ANALYZER_NORETURN
-#if __clang__
-<span class="code_highlight">#define CLANG_ANALYZER_NORETURN __attribute__((analyzer_noreturn))</span>
-#else
-#define CLANG_ANALYZER_NORETURN
-#endif
-
-void my_assert_rtn(const char *, const char *, int, const char *) <span class="code_highlight">CLANG_ANALYZER_NORETURN</span>;
-</pre>
-
-</div>
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/analyzer/available_checks.html b/contrib/llvm/tools/clang/www/analyzer/available_checks.html
deleted file mode 100644
index 7af0865..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/available_checks.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <title>Available Checks</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <script type="text/javascript" src="scripts/menu.js"></script>
-</head>
-<body>
-
-<div id="page">
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<h1>Available Checks</h1>
-
-<p>This page is slated to contain a list of the current checks the analyzer
-performs along with some self-contained code examples. In the meantime, please
-check out any of the following writeups about the analyzer that contain examples
-of some of the bugs that it finds:</p>
-
-<ul>
-<li><a href="http://www.mobileorchard.com/bug-finding-with-clang-5-resources-to-get-you-started/">Bug Finding With Clang: 5 Resources To Get You Started</a></li>
-<li><a href="http://fruitstandsoftware.com/blog/index.php/2008/08/finding-memory-leaks-with-the-llvmclang-static-analyzer/#comment-2">Finding Memory Leaks With The LLVM/Clang Static Analyzer</a></li>
-<li><a href="http://www.therareair.com/howto-static-analyze-your-objective-c-code-using-the-clang-static-analyzer-tool-gallery/">HOWTO: Static Analyze Your Objective-C Code Using the Clang Static Analyzer Tool Gallery</a></li>
-<li><a href="http://www.rogueamoeba.com/utm/2008/07/14/the-clang-static-analyzer/">Under the Microscope - The Clang Static Analyzer</a></li>
-<li><a href="http://www.mikeash.com/?page=pyblog/friday-qa-2009-03-06-using-the-clang-static-analyzer.html">Mike Ash - Using the Clang Static Analyzer</a></li>
-</ul>
-
-
-</div>
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/analyzer/content.css b/contrib/llvm/tools/clang/www/analyzer/content.css
deleted file mode 100644
index b22cca9..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/content.css
+++ /dev/null
@@ -1,79 +0,0 @@
-html { margin: 0px; } body { margin: 8px; }
-
-html, body {
- padding:0px;
- margin:0px;
- font-size:small; font-family:"Lucida Grande", "Lucida Sans Unicode", Arial, Verdana, Helvetica, sans-serif; background-color: #fff; color: #222;
- line-height:1.5;
- background-color: #808080;
-
-}
-
-h1, h2, h3, tt { color: #000 }
-
-h1 { padding-top:0px; margin-top:0px;}
-h2 { color:#333333; padding-top:0.5em; }
-h3 { padding-top: 0.5em; margin-bottom: -0.25em; color:#2d58b7 }
-h4 { color:#2d58b7 }
-li { padding-bottom: 0.5em }
-ul { padding-left:1.5em; }
-
-.command { font-weight:bold }
-.code_highlight { font-weight:bold; color:#2d58b7 }
-.code_example { border-width:1px; border-style:solid; border-color:#cccccc;
- background-color:#eeeeee; padding:10px }
-
-/* Slides */
-IMG.img_slide {
- display: block;
- margin-left: auto;
- margin-right: auto
-}
-
-#page { width:930px; text-align: left; margin: 0 auto; padding:0;
- background-color: white; height:100%;
- border-left: 1px solid #EBF0FA;
-}
-
-#content {
- clear: left;
- padding: 1em 2em 0 2em;
- background-color: #ffffff;
-}
-
-.itemTitle { color:#2d58b7 }
-
-
-/* Tables */
-tr { vertical-align:top }
-
-table.options thead {
- background-color:#eee; color:#666666;
- font-weight: bold; cursor: default;
- text-align:left;
- border-top: 2px solid #cccccc;
- border-bottom: 2px solid #cccccc;
- font-weight: bold; font-family: Verdana
-}
-table.options { border: 1px #cccccc solid }
-table.options { border-collapse: collapse; border-spacing: 0px }
-table.options { margin-left:0px; margin-top:20px; margin-bottom:20px }
-table.options td { border-bottom: 1px #cccccc dotted }
-table.options td { padding:5px; padding-left:8px; padding-right:8px }
-table.options td { text-align:left; font-size:9pt }
-
-/* Collapsing Trees: http://dbtree.megalingo.com/web/demo/simple-collapsible-tree.cfm */
-#collapsetree, #collapsetree a:link, #collapsetree li a:link, #collapsetree a:visited, #collapsetree li a:visited{color:#000;text-decoration:none}
-#collapsetree,#collapsetree ul{list-style-type:none; width:auto; margin:0; padding:0}
-#collapsetree ul{padding-left:20px;display:none;overflow:auto}
-#collapsetree li ul{margin:0 auto}
-#collapsetree li{display:block;width:100%;line-height:20px;white-space:nowrap}
-#collapsetree li a{display:block;padding-left:20px;color:#000;text-decoration:none;background:url(images/tree/bullet.gif) center left no-repeat;white-space:nowrap}
-#collapsetree li a:hover{text-decoration:underline;background-color:transparent;color:#000}
-#collapsetree li ul.click{display:block}
-#collapsetree li.click a{background:url(images/tree/bullet.gif) center left no-repeat}
-#collapsetree ul li.click a{background:url(images/tree/bullet.gif) center left no-repeat}
-#collapsetree li a.subMenu,#collapsetree ul li a.subMenu{background:url(images/tree/plus.gif) center left no-repeat}
-#collapsetree li a.click{background:url(images/tree/minus.gif) center left no-repeat}
-#collapsetree ul li a.click{background:url(images/tree/minus.gif) center left no-repeat}
-
diff --git a/contrib/llvm/tools/clang/www/analyzer/dev_cxx.html b/contrib/llvm/tools/clang/www/analyzer/dev_cxx.html
deleted file mode 100644
index b5ef2b1..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/dev_cxx.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <title>Analyzer Development: C++ Support</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <script type="text/javascript" src="scripts/menu.js"></script>
-</head>
-<body>
-
-<div id="page">
-<!--#include virtual="menu.html.incl"-->
-<div id="content">
-
-<h1>C++ Support</h1>
-
-<p>The Clang frontend
-now <a href="http://clang.llvm.org/cxx_status.html">supports the
-majority of C++</a>. Support in the frontend for C++ language
-features, however, does not automatically translate into support for
-those features in the static analyzer. Language features need to be
-specifically modeled in the static analyzer so their semantics can be
-properly analyzed. Support for analyzing C++ and Objective-C++ files
-is currently extremely limited, and we are only encouraging those who
-are interested in contributing to the development of the analyzer to
-try this functionality out at this time.</p>
-
-<p>Listed here are a set of open tasks that are prerequisites for
-decent analysis of C++. This list is also not complete; new tasks
-will be added as deemed necessary.</p>
-
-<ul>
- <li>Control-Flow Graph Enhancements:</li>
- <ul>
- <li>Model C++ destructors</li>
- <li>Model C++ initializers (in constructors)</li>
- </ul>
- <li>Path-Sensitive Analysis Engine (GRExprEngine):</li>
- <ul>
- <li>Model C++ casts</li>
- <li>Model C++ constructors</li>
- <li>Model C++ destructors</li>
- <li>Model <tt>new</tt> and <tt>delete</tt></li>
- </ul>
-</ul>
-
-</div>
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/analyzer/filing_bugs.html b/contrib/llvm/tools/clang/www/analyzer/filing_bugs.html
deleted file mode 100644
index 746f1cb..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/filing_bugs.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <title>Filing Bugs and Feature Requests</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <script type="text/javascript" src="scripts/menu.js"></script>
-</head>
-<body>
-
-<div id="page">
-<!--#include virtual="menu.html.incl"-->
-<div id="content">
-
-<h1>Filing Bugs and Feature Requests</h1>
-
-<p>We encourage users to file bug reports for any problems that they encounter.
-We also welcome feature requests. When filing a bug report, please do the
-following:</p>
-
-<ul>
-
-<li>Include the checker build (for prebuilt Mac OS X binaries) or the SVN
-revision number.</li>
-
-<li>Provide a self-contained, reduced test case that exhibits the issue you are
-experiencing.</li>
-
-<li>Test cases don't tell us everything. Please briefly describe the problem you
-are seeing, including what you thought should have been the expected behavior
-and why.</li>
-
-</ul>
-
-<h2>Outside of Apple</h2>
-
-<h3>Bugzilla</h3>
-
-<p>Please <a href="http://llvm.org/bugs/enter_bug.cgi?product=clang">file
-bugs</a> in LLVM's Bugzilla database against the Clang <b>Static Analyzer</b>
-component.</p>
-
-<h3>Bugreporter.apple.com</h3>
-
-<p>If you are using the analyzer to analyze code associated with an Apple NDA
-(e.g., preview versions of SDKs or seed releases of Mac OS X) please file bug
-reports to Apple's <a href="http://bugreporter.apple.com">Bug Reporter</a> web
-site.</p>
-
-<p>You are free to always file bugs through this website, but this option is less
-attractive than filing bug reports through Bugzilla as not everyone who works on
-the analyzer has access to that bug database.</p>
-
-<h2>Apple-internal Users</h2>
-
-<p>Please file bugs in Radar against the <b>llvm - checker</b> component.</p>
-</div>
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/analyzer_html.png b/contrib/llvm/tools/clang/www/analyzer/images/analyzer_html.png
deleted file mode 100644
index 607ea18..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/analyzer_html.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/analyzer_xcode.png b/contrib/llvm/tools/clang/www/analyzer/images/analyzer_xcode.png
deleted file mode 100644
index 84c6980..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/analyzer_xcode.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/example_attribute_nonnull.png b/contrib/llvm/tools/clang/www/analyzer/images/example_attribute_nonnull.png
deleted file mode 100644
index 919af61..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/example_attribute_nonnull.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/example_cf_returns_retained.png b/contrib/llvm/tools/clang/www/analyzer/images/example_cf_returns_retained.png
deleted file mode 100644
index 4bee499..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/example_cf_returns_retained.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/example_cf_returns_retained_gc.png b/contrib/llvm/tools/clang/www/analyzer/images/example_cf_returns_retained_gc.png
deleted file mode 100644
index 023f1a2..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/example_cf_returns_retained_gc.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/example_ns_returns_retained.png b/contrib/llvm/tools/clang/www/analyzer/images/example_ns_returns_retained.png
deleted file mode 100644
index 61316e1..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/example_ns_returns_retained.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/scan_build_cmd.png b/contrib/llvm/tools/clang/www/analyzer/images/scan_build_cmd.png
deleted file mode 100644
index 464fd4e..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/scan_build_cmd.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/tree/bullet.gif b/contrib/llvm/tools/clang/www/analyzer/images/tree/bullet.gif
deleted file mode 100644
index de15348..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/tree/bullet.gif
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/tree/minus.gif b/contrib/llvm/tools/clang/www/analyzer/images/tree/minus.gif
deleted file mode 100644
index 225f40d..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/tree/minus.gif
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/images/tree/plus.gif b/contrib/llvm/tools/clang/www/analyzer/images/tree/plus.gif
deleted file mode 100644
index 5398c80..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/images/tree/plus.gif
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/analyzer/index.html b/contrib/llvm/tools/clang/www/analyzer/index.html
deleted file mode 100644
index 082d35f..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/index.html
+++ /dev/null
@@ -1,227 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <title>Clang Static Analyzer</title>
- <link type="text/css" rel="stylesheet" href="content.css" />
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <script type="text/javascript" src="scripts/menu.js"></script>
-</head>
-<body>
-
-<div id="page">
-<!--#include virtual="menu.html.incl"-->
-<div id="content">
-
-
-<table style="margin-top:0px" width="100%" border="0" cellpadding="0px" cellspacing="0">
-<tr><td>
-
-<h1>Clang Static Analyzer</h1>
-
-<p>The Clang Static Analyzer is source code analysis tool that find bugs in C
-and Objective-C programs.</p>
-
-<p>Currently it can be run either as a <a href="/scan-build.html">standalone
-tool</a> or <a href="/xcode.html">within Xcode</a>. The standalone tool is
-invoked from the command-line, and is intended to be run in tandem with a build
-of a codebase.</p>
-
-<p>The analyzer is 100% open source and is part of the <a
-href="http://clang.llvm.org">Clang</a> project. Like the rest of Clang, the
-analyzer is implemented as a C++ library that can be used by other tools and
-applications.</p>
-
-<h2>Download</h2>
-
-<!-- Generated from: http://www.spiffycorners.com/index.php -->
-
-<style type="text/css">
-.spiffy{display:block}
-.spiffy *{
- display:block;
- height:1px;
- overflow:hidden;
- font-size:.01em;
- background:#EBF0FA}
-.spiffy1{
- margin-left:3px;
- margin-right:3px;
- padding-left:1px;
- padding-right:1px;
- border-left:1px solid #f6f8fc;
- border-right:1px solid #f6f8fc;
- background:#f0f3fb}
-.spiffy2{
- margin-left:1px;
- margin-right:1px;
- padding-right:1px;
- padding-left:1px;
- border-left:1px solid #fdfdfe;
- border-right:1px solid #fdfdfe;
- background:#eef2fa}
-.spiffy3{
- margin-left:1px;
- margin-right:1px;
- border-left:1px solid #eef2fa;
- border-right:1px solid #eef2fa;}
-.spiffy4{
- border-left:1px solid #f6f8fc;
- border-right:1px solid #f6f8fc}
-.spiffy5{
- border-left:1px solid #f0f3fb;
- border-right:1px solid #f0f3fb}
-.spiffyfg{
- background:#EBF0FA}
-
-.spiffyfg h2 {
- margin:0px; padding:10px;
-}
-</style>
-
-<style type="text/css">
- #left { float:left; }
- #left h2 { margin:1px; padding-top:0px; }
- #right { float:left; margin-left:20px; margin-right:20px; padding:0px ;}
- #right h2 { padding:0px; margin:0px; }
- #wrappedcontent { padding:15px;}
-</style>
-
-<div style="padding:0px; font-size: 90%">
- <b class="spiffy">
- <b class="spiffy1"><b></b></b>
- <b class="spiffy2"><b></b></b>
- <b class="spiffy3"></b>
- <b class="spiffy4"></b>
- <b class="spiffy5"></b></b>
- <div class="spiffyfg">
- <div style="padding:15px">
- <h3 style="margin:0px;padding:0px">Mac OS X</h3>
- <ul>
- <li>Latest build (Universal binary, 10.5+):<br>
- <!--#include virtual="latest_checker.html.incl"-->
- </li>
- <li>Can be used both from the command line and within Xcode</li>
- <li><a href="/installation.html">Installation</a> and <a
- href="/scan-build.html">usage</a></li>
- </ul>
- </div>
- </div>
- <b class="spiffy">
- <b class="spiffy5"></b>
- <b class="spiffy4"></b>
- <b class="spiffy3"></b>
- <b class="spiffy2"><b></b></b>
- <b class="spiffy1"><b></b></b></b>
-</div>
-
-<div style="padding:0; margin-top:10px; font-size: 90%">
- <b class="spiffy">
- <b class="spiffy1"><b></b></b>
- <b class="spiffy2"><b></b></b>
- <b class="spiffy3"></b>
- <b class="spiffy4"></b>
- <b class="spiffy5"></b></b>
- <div class="spiffyfg">
- <div style="padding:15px">
- <h3 style="margin:0px;padding:0px">Other Platforms</h3>
- <p>For other platforms, please follow the instructions for <a
- href="/installation#OtherPlatforms">building the analyzer</a> from
- source code.<p>
- </div>
- </div>
- <b class="spiffy">
- <b class="spiffy5"></b>
- <b class="spiffy4"></b>
- <b class="spiffy3"></b>
- <b class="spiffy2"><b></b></b>
- <b class="spiffy1"><b></b></b></b>
-</div>
-
-
-</td><td style="padding-left:10px">
-<a href="images/analyzer_xcode.png"><img src="images/analyzer_xcode.png" width="450x" border=0></a>
-<center><b>Viewing static analyzer results in Xcode 3.2</b></center>
-<a href="images/analyzer_html.png"><img src="images/analyzer_html.png" width="450px" border=0></a>
-<center><b>Viewing static analyzer results in a web browser</b></center>
-</td></tr></table>
-
-<h2 id="StaticAnalysis">What is Static Analysis?</h2>
-
-<p>The term &quot;static analysis&quot; is conflated, but here we use it to mean
-a collection of algorithms and techniques used to analyze source code in order
-to automatically find bugs. The idea is similar in spirit to compiler warnings
-(which can be useful for finding coding errors) but to take that idea a step
-further and find bugs that are traditionally found using run-time debugging
-techniques such as testing.</p>
-
-<p>Static analysis bug-finding tools have evolved over the last several decades
-from basic syntactic checkers to those that find deep bugs by reasoning about
-the semantics of code. The goal of the Clang Static Analyzer is to provide a
-industrial-quality static analysis framework for analyzing C and Objective-C
-programs that is freely available, extensible, and has a high quality of
-implementation.</p>
-
-<h3 id="Clang">Part of Clang and LLVM</h3>
-
-<p>As its name implies, the Clang Static Analyzer is built on top of <a
-href="http://clang.llvm.org">Clang</a> and <a href="http://llvm.org">LLVM</a>.
-Strictly speaking, the analyzer is part of Clang, as Clang consists of a set of
-reusable C++ libraries for building powerful source-level tools. The static
-analysis engine used by the Clang Static Analyzer is a Clang library, and has
-the capability to be reused in different contexts and by different clients.</p>
-
-<h2>Important Points to Consider</h2>
-
-<p>While we believe that the static analyzer is already very useful for finding
-bugs, we ask you to bear in mind a few points when using it.</p>
-
-<h3>Work-in-Progress</h3>
-
-<p>The analyzer is a continuous work-in-progress.
-There are many planned enhancements to improve both the precision and scope of
-its analysis algorithms as well as the kinds bugs it will find. While there are
-fundamental limitations to what static analysis can do, we have a long way to go
-before hitting that wall.</p>
-
-<h3>Slower than Compilation</h3>
-
-<p>Operationally, using static analysis to
-automatically find deep program bugs is about trading CPU time for the hardening
-of code. Because of the deep analysis performed by state-of-the-art static
-analysis tools, static analysis can be much slower than compilation.</p>
-
-<p>While the Clang Static Analyzer is being designed to be as fast and
-light-weight as possible, please do not expect it to be as fast as compiling a
-program (even with optimizations enabled). Some of the algorithms needed to find
-bugs require in the worst case exponential time.</p>
-
-<p>The Clang Static Analyzer runs in a reasonable amount of time by both
-bounding the amount of checking work it will do as well as using clever
-algorithms to reduce the amount of work it must do to find bugs.</p></li>
-
-<h3>False Positives</h3>
-
-<p>Static analysis is not perfect. It can falsely flag bugs in a program where
-the code behaves correctly. Because some code checks require more analysis
-precision than others, the frequency of false positives can vary widely between
-different checks. Our long-term goal is to have the analyzer have a low false
-positive rate for most code on all checks.</p>
-
-<p>Please help us in this endeavor by <a href="filing_bugs.html">reporting false
-positives</a>. False positives cannot be addressed unless we know about
-them.</p>
-
-<h3>More Checks</h3>
-
-<p>Static analysis is not magic; a static analyzer can only find bugs that it
-has been specifically engineered to find. If there are specific kinds of bugs
-you would like the Clang Static Analyzer to find, please feel free to
-file <a href="filing_bugs.html">feature requests</a> or contribute your own
-patches.</p>
-
-</div>
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/analyzer/installation.html b/contrib/llvm/tools/clang/www/analyzer/installation.html
deleted file mode 100644
index b84f263..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/installation.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <title>Obtaining the Static Analyzer</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <script type="text/javascript" src="scripts/menu.js"></script>
-</head>
-<body>
-
-<div id="page">
-<!--#include virtual="menu.html.incl"-->
-<div id="content">
-
-<h1>Obtaining the Static Analyzer</h1>
-
-<p>This page describes how to download and install the analyzer. Once
-the analyzer is installed, follow the <a
-href="/scan-build.html">instructions</a> on using <tt>scan-build</tt> to
-get started analyzing your code.</p>
-
-<h2>Packaged Builds (Mac OS X)</h2>
-
-<p>Semi-regular pre-built binaries of the analyzer are available on Mac
-OS X. These are built to run on Mac OS 10.5 and later.</p>
-
-<p>Builds are released frequently. Often the differences between build
-numbers being a few bug fixes or minor feature improvements. When using
-the analyzer, we recommend that you check back here occasionally for new
-builds, especially if the build you are using is more than a couple
-weeks old.</p>
-
-<p>The latest build is:
- <!--#include virtual="latest_checker.html.incl"-->
-</p>
-
-<p>Packaged builds for other platforms may eventually be provided, but
-we need volunteers who are willing to help provide such regular builds.
-If you wish to help contribute regular builds of the analyzer on other
-platforms, please email the <a
-href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">Clang
-Developers' mailing list</a>.</p>
-
-<h3>Using Packaged Builds</h3>
-
-<p>To use a package build, simply unpack it anywhere. If the build
-archive has the name <b><tt>checker-XXX.tar.bz2</tt></b> then the
-archive will expand to a directory called <b><tt>checker-XXX</tt></b>.
-You do not need to place this directory or the contents of this
-directory in any special place. Uninstalling the analyzer is as simple
-as deleting this directory.</p>
-
-<p>Most of the files in the <b><tt>checker-XXX</tt></b> directory will
-be supporting files for the analyzer that you can simply ignore. Most
-users will only care about two files, which are located at the top of
-the <b><tt>checker-XXX</tt></b> directory:</p>
-
-<ul>
-<li><b>scan-build</b>: <tt>scan-build</tt> is the high-level command line utility for running the analyzer</li>
-<li><b>scan-view</b>: <tt>scan-view</tt> a companion comannd line
-utility to <tt>scan-build</tt>, <tt>scan-view</tt> is used to view
-analysis results generated by <tt>scan-build</tt>. There is an option
-that one can pass to <tt>scan-build</tt> to cause <tt>scan-view</tt> to
-run as soon as it the analysis of a build completes</li>
-</ul>
-
-<h4>Running scan-build</h4>
-
-<p>For specific details on using <tt>scan-build</tt>, please see
-<tt>scan-build</tt>'s <a href="/scan-build">documentation</a>.</p>
-
-<p>To run <tt>scan-build</tt>, either add the
-<b><tt>checker-XXX</tt></b> directory to your path or specify a complete
-path for <tt>scan-build</tt> when running it. It is also possible to use
-a symbolic link to <tt>scan-build</tt>, such one located in a directory
-in your path. When <tt>scan-build</tt> runs it will automatically
-determine where to find its accompanying files.</p>
-
-<h2 id="OtherPlatforms">Other Platforms (Building the Analyzer from Source)</h2>
-
-<p>For other platforms, you must build Clang and LLVM manually. To do
-so, please follow the instructions for <a
-href="http://clang.llvm.org/get_started.html#build">building Clang from
-source code</a>.<p>
-
-<p>Once the Clang is built, you need to add the following to your path:</p>
-
-<ul>
-
-<li>The location of the <tt>clang</tt> binary.
-
-<p>For example, if you built a <em>Debug</em> build of LLVM/Clang, the
-resultant<tt>clang</tt> binary will be in $(OBJDIR)/Debug
-(where <tt>$(OBJDIR)</tt> is often the same as the root source directory). You
-can also do <tt>make install</tt> to install the LLVM/Clang libaries and
-binaries to the installation directory of your choice (specified when you run
-<tt>configure</tt>).</p></li>
-
-<li>The locations of the <tt>scan-build</tt> and <tt>scan-view</tt>
-programs.
-
-<p>Currently these are not installed using <tt>make install</tt>, and
-are located in <tt>$(SRCDIR)/tools/clang/tools/scan-build</tt> and
-<tt>$(SRCDIR)/tools/clang/tools/scan-view</tt> respectively (where
-<tt>$(SRCDIR)</tt> is the root LLVM source directory). These locations
-are subject to change.</p></li>
-
-</ul>
-</div>
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/analyzer/latest_checker.html.incl b/contrib/llvm/tools/clang/www/analyzer/latest_checker.html.incl
deleted file mode 100644
index ecc516a..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/latest_checker.html.incl
+++ /dev/null
@@ -1 +0,0 @@
-<b><a href="http://files.me.com/tkremenek/mt0ve6">checker-241.tar.bz2</a></b> (built May 26, 2010)
diff --git a/contrib/llvm/tools/clang/www/analyzer/menu.css b/contrib/llvm/tools/clang/www/analyzer/menu.css
deleted file mode 100644
index 05c1bbf..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/menu.css
+++ /dev/null
@@ -1,52 +0,0 @@
-/* From 'A list apart', 'dropdowns' */
-
-#nav {
- clear: left;
- margin:0;
- padding:0;
- font-weight: bold;
- width:100%;
- background-color: #EBF0FA;
- border-bottom: 1px solid;
- font-size: 80%;
-}
-#nav a {
- text-decoration: none;
-}
-#nav a:hover {
- text-decoration: underline;
-}
-.menubar ul {
- list-style: none inside;
-}
-.menubar li {
- margin: 0;
- padding: 5px;
- text-align: left;
- text-indent: 0px;
- list-style-position: inside;
- list-style:none;
- float: left;
- position: relative;
- width: 13em;
- cursor: default;
- background-color: #EBF0FA;
-}
-.menubar li ul /* second level lists */ {
- display: none;
- position: absolute;
- left: 0;
-}
-.menubar li>ul {
- border-left: 1px solid;
- border-right: 1px solid;
- border-bottom: 1px solid;
- padding: 0;
- margin: 5px 0;
- left:auto;
- font-weight: normal;
-}
-.menubar li:hover ul, li.over ul { /* lists nested under hovered list items */
- display: block;
-}
-
diff --git a/contrib/llvm/tools/clang/www/analyzer/menu.html.incl b/contrib/llvm/tools/clang/www/analyzer/menu.html.incl
deleted file mode 100644
index a06eb58..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/menu.html.incl
+++ /dev/null
@@ -1,40 +0,0 @@
-<table width="100%" id="nav" cellspacing=0 cellpadding=0>
-<tr><td>
-<ul style="margin:0; padding:0" class="menubar">
-<li style="padding-left:5em">
- <a href="/index.html">About</a>
- <ul class="menubar">
- <li><a href="/index.html">About the Analyzer</a></li>
- <li><a href="http://llvm.org/">LLVM Project</a></li>
- <li><a href="http://clang.llvm.org/">Clang Project</a></li>
- </ul>
-</li>
-<li>
- <a href="/filing_bugs.html">Filing Bugs</a>
-</li>
-<li>
- User Manual
- <ul>
- <li><a href="/installation.html">Obtaining the Analyzer</a></li>
- <li><a href="/scan-build.html">Command line usage</a></li>
- <li><a href="/xcode.html">Using within Xcode</a></li>
- <li><a href="/available_checks.html">Available Checks</a></li>
- <li><a href="/annotations.html">Source-level Annotations</a></li>
- </ul>
-</li>
-<li>
- Development
- <ul>
- <li><a href="/dev_cxx.html">Analysis support for C++</a></li>
- </ul>
-</li>
-<li>
- Mailing Lists
- <ul>
- <li><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev</a></li>
- <li><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commits</a></li>
- </ul>
-</li>
-</ul>
-</td></tr>
-</table>
diff --git a/contrib/llvm/tools/clang/www/analyzer/menu.js b/contrib/llvm/tools/clang/www/analyzer/menu.js
deleted file mode 100644
index 6b393c0..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/menu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-startList = function() {
- if (document.all&&document.getElementById) {
- navRoot = document.getElementById("nav");
- for (i=0; i<navRoot.childNodes.length; i++) {
- node = navRoot.childNodes[i];
- if (node.nodeName=="LI") {
- node.onmouseover=function() {
- this.className+=" over";
- }
- node.onmouseout=function() {
- this.className=this.className.replace(" over", "");
- }
- }
- }
- }
-}
-window.onload=startList;
diff --git a/contrib/llvm/tools/clang/www/analyzer/scan-build.html b/contrib/llvm/tools/clang/www/analyzer/scan-build.html
deleted file mode 100644
index 1db15fe..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/scan-build.html
+++ /dev/null
@@ -1,346 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <title>scan-build: running the analyzer from the command line</title>
- <link type="text/css" rel="stylesheet" href="content.css" />
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <script type="text/javascript" src="scripts/menu.js"></script>
- <script type="text/javascript" src="scripts/dbtree.js"></script>
-</head>
-<body>
-
-<div id="page">
-<!--#include virtual="menu.html.incl"-->
-<div id="content">
-
-<h1>scan-build: running the analyzer from the command line</h1>
-
-<table style="margin-top:0px" width="100%" border="0" cellpadding="0px" cellspacing="0">
-<tr><td>
-
-<h3>What is it?</h3>
-<p><b>scan-build</b> is a command line utility that enables a user to run the
-static analyzer over their codebase as part of performing a regular build (from
-the command line).</p>
-
-<h3>How does it work?</h3>
-<p>During a project build, as source files are compiled they are also analyzed
-in tandem by the static analyzer.</p>
-
-<p>Upon completion of the build, results are then presented to the user within a
-web browser.</p>
-
-<h3>Will it work with any build system?</h3>
-<p><b>scan-build</b> has little or no knowledge about how you build your code.
-It works by overriding the <tt>CC</tt> and <tt>CXX</tt> environment variables to
-(hopefully) change your build to use a &quot;fake&quot; compiler instead of the
-one that would normally build your project. By default, this fake compiler
-executes <tt>gcc</tt> to compile your code (assuming that <tt>gcc</tt> is your
-compiler) and then executes the static analyzer to analyze your code.</p>
-
-<p>This &quot;poor man's interposition&quot; works amazingly well in many cases
-and falls down in others. Please consult the information on this page on making
-the best use of <b>scan-build</b>, which includes getting it to work when the
-aforementioned hack fails to work.</p>
-
-</td>
-<td style="padding-left:10px">
-<center>
- <img src="images/scan_build_cmd.png" width="450px" border=0><br>
- <a href="images/analyzer_html.png"><img src="images/analyzer_html.png" width="450px" border=0></a>
-<br><b>Viewing static analyzer results in a web browser</b></center>
-</td></tr></table>
-
-<h2>Contents</h2>
-
-<ul id="collapsetree" class="dbtree onclick multiple">
-<li><a href="#scanbuild">Getting Started</a>
- <ul>
- <li><a href="#scanbuild_basicusage">Basic Usage</a></li>
- <li><a href="#scanbuild_otheroptions">Other Options</a></li>
- <li><a href="#scanbuild_output">Output of scan-build</a></li>
- </ul>
-</li>
-<li><a href="#recommendedguidelines">Recommended Usage Guidelines</a>
- <ul>
- <li><a href="#recommended_debug">Always Analyze a Project in its &quot;Debug&quot; Configuration</a></li>
- <li><a href="#recommended_verbose">Use Verbose Output when Debugging scan-build</a></li>
- <li><a href="#recommended_autoconf">Run './configure' through scan-build</a></li>
- </ul>
-</li>
-<li><a href="#iphone">Analyzing iPhone Projects</a></li>
-</ul>
-
-<h2 id="scanbuild">Getting Started</h2>
-
-<p>The <tt>scan-build</tt> command can be used to analyze an entire project by
-essentially interposing on a project's build process. This means that to run the
-analyzer using <tt>scan-build</tt>, you will use <tt>scan-build</tt> to analyze
-the source files compiled by <tt>gcc</tt> during a project build. This means
-that any files that are not compiled will also not be analyzed.</p>
-
-<h3 id="scanbuild_basicusage">Basic Usage</h3>
-
-<p>Basic usage of <tt>scan-build</tt> is designed to be simple: just place the
-word &quot;scan-build&quot; in front of your build command:</p>
-
-<pre class="code_example">
-$ <span class="code_highlight">scan-build</span> make
-$ <span class="code_highlight">scan-build</span> xcodebuild
-</pre>
-
-<p>In the first case <tt>scan-build</tt> analyzes the code of a project built
-with <tt>make</tt> and in the second case <tt>scan-build</tt> analyzes a project
-built using <tt>xcodebuild</tt>.<p>
-
-<p>Here is the general format for invoking <tt>scan-build</tt>:</p>
-
-<pre class="code_example">
-$ <span class="code_highlight">scan-build</span> <i>[scan-build options]</i> <span class="code_highlight">&lt;command&gt;</span> <i>[command options]</i>
-</pre>
-
-<p>Operationally, <tt>scan-build</tt> literally runs &lt;command&gt; with all of the
-subsequent options passed to it. For example, one can pass <nobr><tt>-j4</tt></nobr> to
-<tt>make</tt> get a parallel build over 4 cores:</p>
-
-<pre class="code_example">
-$ scan-build make <span class="code_highlight">-j4</span>
-</pre>
-
-<p>In almost all cases, <tt>scan-build</tt> makes no effort to interpret the
-options after the build command; it simply passes them through. In general,
-<tt>scan-build</tt> should support parallel builds, but <b>not distributed
-builds</b>.</p>
-
-<p>It is also possible to use <tt>scan-build</tt> to analyze specific
-files:</p>
-
-<pre class="code_example">
- $ scan-build gcc -c <span class="code_highlight">t1.c t2.c</span>
-</pre>
-
-<p>This example causes the files <tt>t1.c</tt> and <tt>t2.c</tt> to be analyzed.
-</p>
-
-<h3 id="scanbuild_otheroptions">Other Options</h3>
-
-<p>As mentioned above, extra options can be passed to <tt>scan-build</tt>. These
-options prefix the build command. For example:</p>
-
-<pre class="code_example">
- $ scan-build <span class="code_highlight">-k -V</span> make
- $ scan-build <span class="code_highlight">-k -V</span> xcodebuild
-</pre>
-
-<p>Here is a subset of useful options:</p>
-
-<table class="options">
-<thead><tr><td>Option</td><td>Description</td></tr></thead>
-
-<tr><td><b>-o</b></td><td>Target directory for HTML report files. Subdirectories
-will be created as needed to represent separate "runs" of the analyzer. If this
-option is not specified, a directory is created in <tt>/tmp</tt> to store the
-reports.</td><tr>
-
-<tr><td><b>-h</b><br><i><nobr>(or no arguments)</nobr></i></td><td>Display all
-<tt>scan-build</tt> options.</td></tr>
-
-<tr><td><b>-k</b><br><nobr><b>--keep-going</b></nobr></td><td>Add a "keep on
-going" option to the specified build command. <p>This option currently supports
-<tt>make</tt> and <tt>xcodebuild</tt>.</p> <p>This is a convenience option; one
-can specify this behavior directly using build options.</p></td></tr>
-
-<tr><td><b>-v<b></td><td>Verbose output from scan-build and the analyzer. <b>A
-second and third "-v" increases verbosity</b>, and is useful for filing bug
-reports against the analyzer.</td></tr>
-
-<tr><td><b>-V</b></td><td>View analysis results in a web browser when the build
-command completes.</td></tr> </table>
-
-<p>A complete list of options can be obtained by running <tt>scan-build</tt>
-with no arguments.</p>
-
-<h3 id="scanbuild_output">Output of scan-build</h3>
-
-<p>
-The output of scan-build is a set of HTML files, each one which represents a
-separate bug report. A single <tt>index.html</tt> file is generated for
-surveying all of the bugs. You can then just open <tt>index.html</tt> in a web
-browser to view the bug reports.
-</p>
-
-<p>
-Where the HTML files are generated is specified with a <b>-o</b> option to
-<tt>scan-build</tt>. If <b>-o</b> isn't specified, a directory in <tt>/tmp</tt>
-is created to store the files (<tt>scan-build</tt> will print a message telling
-you where they are). If you want to view the reports immediately after the build
-completes, pass <b>-V</b> to <tt>scan-build</tt>.
-</p>
-
-
-<h2 id="recommendedguidelines">Recommended Usage Guidelines</h2>
-
-<p>This section describes a few recommendations with running the analyzer.</p>
-
-<h3 id="recommended_debug">ALWAYS analyze a project in its &quot;debug&quot; configuration</h3>
-
-<p>Most projects can be built in a &quot;debug&quot; mode that enables assertions.
-Assertions are picked up by the static analyzer to prune infeasible paths, which
-in some cases can greatly reduce the number of false positives (bogus error
-reports) emitted by the tool.</p>
-
-<h3 id="recommend_verbose">Use verbose output when debugging scan-build</h3>
-
-<p><tt>scan-build</tt> takes a <b>-v</b> option to emit verbose output about
-what it's doing; two <b>-v</b> options emit more information. Redirecting the
-output of <tt>scan-build</tt> to a text file (make sure to redirect standard
-error) is useful for filing bug reports against <tt>scan-build</tt> or the
-analyzer, as we can see the exact options (and files) passed to the analyzer.
-For more comprehensible logs, don't perform a parallel build.</p>
-
-<h3 id="recommended_autoconf">Run './configure' through scan-build</h3>
-
-<p>If an analyzed project uses an autoconf generated <tt>configure</tt> script,
-you will probably need to run <tt>configure</tt> script through
-<tt>scan-build</tt> in order to analyze the project.</p>
-
-<p><b>Example</b></p>
-
-<pre class="code_example">
-$ scan-build ./configure
-$ scan-build make
-</pre>
-
-<p>The reason <tt>configure</tt> also needs to be run through
-<tt>scan-build</tt> is because <tt>scan-build</tt> scans your source files by
-<i>interposing</i> on the compiler. This interposition is currently done by
-<tt>scan-build</tt> temporarily setting the environment variable <tt>CC</tt> to
-<tt>ccc-analyzer</tt>. The program <tt>ccc-analyzer</tt> acts like a fake
-compiler, forwarding its command line arguments over to <tt>gcc</tt> to perform
-regular compilation and <tt>clang</tt> to perform static analysis.</p>
-
-<p>Running <tt>configure</tt> typically generates makefiles that have hardwired
-paths to the compiler, and by running <tt>configure</tt> through
-<tt>scan-build</tt> that path is set to <tt>ccc-analyzer</tt>.</p.>
-
-<!--
-<h2 id="Debugging">Debugging the Analyzer</h2>
-
-<p>This section provides information on debugging the analyzer, and troubleshooting
-it when you have problems analyzing a particular project.</p>
-
-<h3>How it Works</h3>
-
-<p>To analyze a project, <tt>scan-build</tt> simply sets the environment variable
-<tt>CC</tt> to the full path to <tt>ccc-analyzer</tt>. It also sets a few other
-environment variables to communicate to <tt>ccc-analyzer</tt> where to dump HTML
-report files.</p>
-
-<p>Some Makefiles (or equivalent project files) hardcode the compiler; for such
-projects simply overriding <tt>CC</tt> won't cause <tt>ccc-analyzer</tt> to be
-called. This will cause the compiled code <b>to not be analyzed.</b></p> If you
-find that your code isn't being analyzed, check to see if <tt>CC</tt> is
-hardcoded. If this is the case, you can hardcode it instead to the <b>full
-path</b> to <tt>ccc-analyzer</tt>.</p>
-
-<p>When applicable, you can also run <tt>./configure</tt> for a project through
-<tt>scan-build</tt> so that configure sets up the location of <tt>CC</tt> based
-on the environment passed in from <tt>scan-build</tt>:
-
-<pre>
- $ scan-build <b>./configure</b>
-</pre>
-
-<p><tt>scan-build</tt> has special knowledge about <tt>configure</tt>, so it in
-most cases will not actually analyze the configure tests run by
-<tt>configure</tt>.</p>
-
-<p>Under the hood, <tt>ccc-analyzer</tt> directly invokes <tt>gcc</tt> to
-compile the actual code in addition to running the analyzer (which occurs by it
-calling <tt>clang</tt>). <tt>ccc-analyzer</tt> tries to correctly forward all
-the arguments over to <tt>gcc</tt>, but this may not work perfectly (please
-report bugs of this kind).
- -->
-
-<h2 id="iphone">Analyzing iPhone Projects</h2>
-
-<p>Conceptually Xcode projects for iPhone applications are nearly the same as
-their cousins for desktop applications. <b>scan-build</b> can analyze these
-projects as well, but users often encounter problems with just building their
-iPhone projects from the command line because there are a few extra preparative
-steps they need to take (e.g., setup code signing).</p>
-
-<h3>Recommendation: use &quot;Build and Analyze&quot;</h3>
-
-<p>The absolute easiest way to analyze iPhone projects is to use the <a
-href="http://developer.apple.com/mac/library/featuredarticles/StaticAnalysis/index.html"><i>Build
-and Analyze</i> feature in Xcode 3.2</a> (which is based on the Clang Static
-Analyzer). There a user can analyze their project with the click of a button
-without most of the setup described later.</p>
-
-<p><a href="/xcode.html">Instructions are available</a> on this
-website on how to use open source builds of the analyzer as a replacement for
-the one bundled with Xcode.</p>
-
-<h3>Using scan-build directly</h3>
-
-<p>If you wish to use <b>scan-build</b> with your iPhone project, keep the
-following things in mind:</p>
-
-<ul>
- <li>Analyze your project in the <tt>Debug</tt> configuration, either by setting
-this as your configuration with Xcode or by passing <tt>-configuration
-Debug</tt> to <tt>xcodebuild</tt>.</li>
- <li>Analyze your project using the <tt>Simulator</tt> as your base SDK. It is
-possible to analyze your code when targetting the device, but this is much
-easier to do when using Xcode's <i>Build and Analyze</i> feature.</li>
- <li>Check that your code signing SDK is set to the simulator SDK as well, and make sure this option is set to <tt>Don't Code Sign</tt>.</li>
-</ul>
-
-<p>Note that you can most of this without actually modifying your project. For
-example, if your application targets iPhoneOS 2.2, you could run
-<b>scan-build</b> in the following manner from the command line:</p>
-
-<pre class="code_example">
-$ scan-build xcodebuild -configuration Debug -sdk iphonesimulator2.2
-</pre>
-
-Alternatively, if your application targets iPhoneOS 3.0:
-
-<pre class="code_example">
-$ scan-build xcodebuild -configuration Debug -sdk iphonesimulator3.0
-</pre>
-
-<h3>Gotcha: using the right compiler</h3>
-
-<p>Recall that <b>scan-build</b> analyzes your project by using <tt>gcc</tt> to
-compile the project and <tt>clang</tt> to analyze your project. When analyzing
-iPhone projects, <b>scan-build</b> may pick the wrong compiler than the one
-Xcode would use to build your project. This is because multiple versions of
-<tt>gcc</tt> may be installed on your system, especially if you are developing
-for the iPhone.</p>
-
-<p>Where this particularly might be a problem is if you are using Mac OS 10.5
-(Leopard) to develop for iPhone OS 3.0. The default desktop compiler on Leopard
-is gcc-4.0, while the compiler for iPhone OS 3.0 is gcc-4.2. When compiling your
-application to run on the simulator, it is important that <b>scan-build</b>
-finds the correct version of <tt>gcc</tt>. Otherwise, you may see strange build
-errors that only happen when you run <tt>scan-build</tt>.
-
-<p><b>scan-build</b> provides the <tt>--use-cc</tt> and <tt>--use-c++</tt>
-options to hardwire which compiler scan-build should use for building your code.
-Note that although you are chiefly interested in analyzing your project, keep in
-mind that running the analyzer is intimately tied to the build, and not being
-able to compile your code means it won't get fully analyzed (if at all).</p>
-
-<p>If you aren't certain which compiler Xcode uses to build your project, try
-just running <tt>xcodebuild</tt> (without <b>scan-build</b>). You should see the
-full path to the compiler that Xcode is using, and use that as an argument to
-<tt>--use-cc</tt>.</p>
-
-</div>
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/analyzer/scripts/dbtree.js b/contrib/llvm/tools/clang/www/analyzer/scripts/dbtree.js
deleted file mode 100644
index 5face5d..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/scripts/dbtree.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 5,r,Q,u;7 17=[];5=H;1i();9(!1Z.1j.20){1Z.1j.20=k(a){C[C.D]=a}}7 19=\'35+/\';k 36(a){7 b,R=\'\',i=0;I(;i<a.D;i+=4){b=(19.1k(a.1l(i))&1a)<<18|(19.1k(a.1l(i+1))&1a)<<12|(19.1k(a.1l(i+2))&1a)<<6|19.1k(a.1l(i+3))&1a;R+=37.38((b&39)>>16,(b&3a)>>8,b&1a)}9(a.21(i-2)==22)1m=R.23(0,R.D-2);s 9(a.21(i-1)==22)1m=R.23(0,R.D-1);s 1m=R;z 3b(1m)}7 A={24:k(){7 a=l.E(\'X\');I(7 i=0;i<a.D;i++){9(a[i].h.F(/\\1n\\b/)==-1)3c;7 b=a[i];9(b.h.F(/\\1E\\b/)!=-1){7 c=b.E(\'a\');I(7 j=0;j<c.D;j++){m.B(c[j],\'25\',1F,o);m.B(c[j],\'26\',1G,o);m.B(c[j],\'1o\',1b,o);c[j].Y=\'1H:1I(0)\'}}7 d=b.E(\'X\');I(7 j=0;j<d.D;j++){7 e=d[j].p;e.27=J;9(b.h.F(/\\3d\\b/)!=-1){m.B(e,\'w\',A.w,o);9(b.h.F(/\\3e\\b/)==-1){e.E(\'a\')[0].Y=\'1H:1I(0)\'}}s{7 t=b.h.3f(/1J(.*)1J/);t=t?t[1]:H;m.B(e,\'3g\',A.28(e,t),o);m.B(e,\'3h\',A.29(e),o)}e.E(\'a\')[0].h+=\' 2a\'}9(b.h.F(/\\3i\\b/)!=-1)A.2b(b.v)}},2b:k(a){7 b=l.G(a+\'3j\');9(b){A.1p(b);b=b.p;1c(!!b&&(b.v!=a)){9((!b.h)||(b.h==\'\')){b.h=\'w\'}s{b.h+=\' w\'}9(b.1d.K.L()==\'a\')b.1d.h+=\' w\';b=b.p}}},29:k(a){z k(){A.1p(a)}},28:k(a,b){z k(){A.2c(a,b)}},1p:k(a){7 b=a;3k(b.2d);I(7 i=0;i<b.S.D;i++){7 c=b.S[i];9(c.K.L()==\'X\'){b.E(\'a\')[0].h+=\' w\';b.h+=\' w\';c.h+=\' w\'}}},2c:k(a,b){7 c=a;c.2d=3l(k(){A.1q(c)},b)},1q:k(a){I(7 i=0;i<a.S.D;i++){7 b=a.S[i];9(b.K.L()==\'X\'){a.E(\'a\')[0].h=a.E(\'a\')[0].h.1K(/w/g,\'\');b.h=b.h.1K(/w/g,\'\');a.h=a.h.1K(/w/g,\'\')}}},w:k(e){9(M.T){M.T.1L=J}9(e&&e.1r){e.1r()}7 a=(M.T)?M.T.2e:(e)?e.1M:H;9(!a||!(a=A.1N(a,\'2f\')))z;9(a.E(\'a\')[0].h.F(/\\2g\\b/)==-1){7 b=1e(a);9(2h(b)){9(l.G(b).h.F(/\\3m\\b/)==-1){I(n=0;n<a.p.S.D;n++){N=a.p.S[n];9(N.K.L()==\'2f\'){9(N.h.F(/\\2g\\b/)!=-1)A.1q(a.p.S[n])}}}}A.1p(a)}s{A.1q(a)}9(2h(1e(a))){z J}s{z o}},1N:k(a,b){9(a.K.L()!=b&&a.K.L()!=\'U\'){z A.1N(a.p,b)}s 9(a.K.L()==\'U\'){z H}s{z a}}};k 1i(){3n{u=M.2i?O 2i():O 3o(\'3p.3q\')}3r(e){2j(\'2k 2l: 3s 3t 3u 3v 3w-3x!\')}}k 1O(a,x){a.1f.3y=x+\'2m\'}k 1P(a,y){a.1f.3z=y+\'2m\'}k 1e(a){1c(a.h.F(/\\1n\\b/)==-1){a=a.p}9((a.h.F(/\\1n\\b/)!=-1)&&(a.h.F(/\\1E\\b/)!=-1)){I(i=0;i<17.D;i++){9(a.v==17[i].q)z i}}z a.v}k 1G(a){a=O m(a);r=a.P.p.p.v;7 b=r.1s(\'Z\');r=b[1];5=17[1e(a.P)];7 c=l.G(5.q+\'10\').3A(J);7 d=l.G(5.q+\'10\');d.p.2n(d);c.v=5.q+\'10\';l.U.2o(c);1O(c,a.x);1P(c,a.y);c.1f.1Q=\'2p\';a.1t();m.B(l,\'1u\',1R,o);z o}k 1R(c){c=O m(c);7 e;7 a=c.P;7 b=a;1c((b!=H)&&(b.K.L()!=\'U\')){9(b.v==5.q+\'10\')1g;b=b.p}9((b!=H)&&(b.v==5.q+\'10\')){3B(a.p.h){1S\'3C\':a.Y=5.V+\'11=1T&N=\'+5.13;1g;1S\'1T\':a.Y=5.V+\'11=1T&N=\'+r;1g;1S\'2q\':a.Y=5.V+\'11=2q&N=\'+r;1g;3D:e=5.2r+\'?q=\'+5.q;e+=\'&13=\'+5.13;9(a.p.h==\'3E\'){e+=\'&11=2s&N=\'+r+\'&2t=\'+5.13}s{e+=\'&11=\'+a.p.h+\'&N=\'+r}7 d=O 2u();7 f=d.2v();e+=\'&2w=\'+f;e+=\'&1v=\'+5.1v;e+=\'&1w=\'+5.1w;e+=\'&1x=\'+5.1x;e+=\'&1y=\'+5.1y;e+=\'&1z=\'+5.1z;e+=\'&1A=\'+5.1A;e+=\'&v=\'+5.v;e+=\'&1B=\'+5.1B;e+=\'&1C=\'+5.1C;e+=\'&V=\'+5.V;u.2x=1U;u.1V(\'2y\',e,J);u.14(\'2z\',\'2A-2B\');u.14(\'2C-2D\',\'2E-2F\');u.14(\'2G-2H-2I\',l.2J);u.2K(H)}}7 g=l.G(5.q+\'10\');9(g){g.1f.1Q=\'3F\'};m.1h(l,\'1u\',1R,o)}k 1F(a){a=O m(a);r=a.P.p.p.v;7 b=r.1s(\'Z\');r=b[1];5=17[1e(a.P)];9(!l.G(5.q+\'15\')){7 c=(!l.G(5.q+\'15\'))?l.3G(\'3H\'):l.G(5.q+\'15\');c.v=5.q+\'15\';c.2L=a.P.1d.3I;l.U.2o(c)}m.B(l,\'2M\',1W,o);m.B(l,\'1u\',1X,o);m.B(l,\'1o\',1b,o);a.1t();z o}k 1b(a){9(!a&&M.T)a=M.T;9(a!=H){9(3J(a.1Y)==\'k\')a.1Y();s a.2N=o}z o}k 1W(a){a=O m(a);7 b=l.G(5.q+\'15\');1O(b,a.x);1P(b,a.y);b.1f.1Q=\'2p\';a.1t();z o}k 1X(a){a=O m(a);7 b=a.P.p;9(b.K.L()==\'a\'){r=5.q+\'Z\'+r;9(r!=b.p.v){7 c=J;7 d=b.p;1c(!!d&&(d.v!=5.q)){9(d.v==r){c=o;1g}s{d=d.p}}9(c==J){7 e=r.1s(\'Z\');r=e[1];Q=b.p.v;7 f=Q.1s(\'Z\');Q=f[1];2O(a)}}}7 g=l.G(5.q+\'15\');9(g){g.p.2n(g)};m.1h(l,\'2M\',1W,o);m.1h(l,\'1u\',1X,o);m.1h(l,\'1o\',1b,o)}k 2O(a){7 d=O 2u();7 b=d.2v();7 c;c=5.2r+\'?q=\'+5.q+\'&11=2s&13=\'+5.13+\'&N=\'+r+\'&2t=\'+Q+\'&2w=\'+b;c+=\'&1v=\'+5.1v;c+=\'&1w=\'+5.1w;c+=\'&1x=\'+5.1x;c+=\'&1y=\'+5.1y;c+=\'&1z=\'+5.1z;c+=\'&1A=\'+5.1A;c+=\'&v=\'+5.v;c+=\'&1B=\'+5.1B;c+=\'&1C=\'+5.1C;c+=\'&V=\'+5.V;u.2x=1U;u.1V(\'2y\',c,J);u.14(\'2z\',\'2A-2B\');u.14(\'2C-2D\',\'2E-2F\');u.14(\'2G-2H-2I\',l.2J);u.2K(H)}k 2P(){7 a=(!!Q)?Q:r;a=5.q+\'Z\'+a;a=l.G(a);9(a){a=a.E(\'X\')[0];1c(!!a&&(a.h.F(/\\1n\\b/)==-1)&&(a.h.F(/\\1E\\b/)==-1)){9((!a.h)||(a.h==\'\')){a.h=\'w\'}s{a.h+=\' w\'}9(a.1d.K.L()==\'a\')a.1d.h+=\' w\';a=a.p}}}k 3K(a,b){9(a!=\'3L\'){3M(a+".3N=\'"+b.2Q[b.2R].2S+"\'")}s{M.1V(b.2Q[b.2R].2S)}}k 2T(a){7 b=l.G(a);7 c=b.E(\'X\');I(7 j=0;j<c.D;j++){7 d=c[j].p;d.27=J;m.B(d,\'w\',A.w,o);d.E(\'a\')[0].h+=\' 2a\'}7 e=b.E(\'a\');I(7 j=0;j<e.D;j++){m.B(e[j],\'25\',1F,o);m.B(e[j],\'26\',1G,o);m.B(e[j],\'1o\',1b,o);e[j].Y=\'1H:1I(0)\'}}k 1U(){9(u.3O==4){9(u.3P==3Q){l.G(5.q+\'3R\').2L=u.3S;2T(5.q);2P();1i()}s{2j(\'2k 2l: 3T, 3U 3V 1J 3W a 3X 3Y 3Z 40:\\n\'+u.41);1i()}}}k m(a){C.W=a?a:M.T;C.P=a.1M?a.1M:a.2e;C.x=a.2U?(a.2U):(a.42+2V.2W(l.U.2X,l.2Y.2X));C.y=a.2Z?(a.2Z):(a.43+2V.2W(l.U.30,l.2Y.30))}m.1j.44=k(){z\'m [ x = \'+C.x+\', y = \'+C.y+\' ]\'};m.1j.1t=k(){9(C.W.1r){C.W.1r();C.W.1Y()}s 9(C.W.1L){C.W.1L=J;C.W.2N=o}};m.B=k(a,b,c,d){9(l.31){a.31(b,c,d)}s 9(l.32){a.32(\'1D\'+b,c,d)}s{a[\'1D\'+b]=c}};m.1h=k(a,b,c,d){9(l.33){a.33(b,c,d)}s 9(l.34){a.34(\'1D\'+b,c,d)}s{a[\'1D\'+b]=H}};m.B(M,\'45\',A.24,o);',62,254,'|||||instance||var||if||||||||className|||function|document|Evt||false|parentNode|instanceName|nid|else||client|id|click|||return|dbTree|addEvent|this|length|getElementsByTagName|search|getElementById|null|for|true|nodeName|toLowerCase|window|node|new|source|nto|decOut|childNodes|event|body|editpage|evt|ul|href|_|_options|action||rootnode|setRequestHeader|_tip||dbtreeObj||b64s|0xff|PreventDefault|while|firstChild|getObj|style|break|removeEvent|createClient|prototype|indexOf|charAt|undecOut|bdbtree|selectstart|mOver|mOut|stopPropagation|split|consume|mouseup|type|query|datasource|username|password|table|parent|contentfield|on|bedit|dragPress|contextMenu|javascript|void|to|replace|cancelBubble|target|getTarget|setX|setY|display|contextAction|case|add|callback|open|dragMove|dragRelease|preventDefault|Array|push|charCodeAt|61|substring|init|mousedown|contextmenu|hasSubMenu|getMoutFor|getMoverFor|subMenu|mExp|mTimeout|timeout|srcElement|li|bclick|isNaN|XMLHttpRequest|alert|DBTree|Error|px|removeChild|appendChild|block|edit|tagpath|move|nodeto|Date|getTime|time|onreadystatechange|get|Pragma|no|cache|Cache|Control|must|revalidate|If|Modified|Since|lastModified|send|innerHTML|mousemove|returnValue|dragBoxDropped|expandtree|options|selectedIndex|value|reinit|pageX|Math|max|scrollLeft|documentElement|pageY|scrollTop|addEventListener|attachEvent|removeEventListener|detachEvent|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|decode|String|fromCharCode|0xff0000|0xff00|unescape|continue|bonclick|blinkparent|match|mouseout|mouseover|bexpand|_active|clearTimeout|setTimeout|bmultiple|try|ActiveXObject|Microsoft|XMLHTTP|catch|Your|browser|is|not|Ajax|enabled|left|top|cloneNode|switch|addroot|default|moveroot|none|createElement|div|nodeValue|typeof|jumpTo|blank|eval|location|readyState|status|200|_edit|responseText|Sorry|there|seems|be|problem|retrieving|the|response|statusText|clientX|clientY|toString|load'.split('|'),0,{}))
diff --git a/contrib/llvm/tools/clang/www/analyzer/scripts/menu.js b/contrib/llvm/tools/clang/www/analyzer/scripts/menu.js
deleted file mode 100644
index 6b393c0..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/scripts/menu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-startList = function() {
- if (document.all&&document.getElementById) {
- navRoot = document.getElementById("nav");
- for (i=0; i<navRoot.childNodes.length; i++) {
- node = navRoot.childNodes[i];
- if (node.nodeName=="LI") {
- node.onmouseover=function() {
- this.className+=" over";
- }
- node.onmouseout=function() {
- this.className=this.className.replace(" over", "");
- }
- }
- }
- }
-}
-window.onload=startList;
diff --git a/contrib/llvm/tools/clang/www/analyzer/xcode.html b/contrib/llvm/tools/clang/www/analyzer/xcode.html
deleted file mode 100644
index 474156e..0000000
--- a/contrib/llvm/tools/clang/www/analyzer/xcode.html
+++ /dev/null
@@ -1,136 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <title>Build and Analyze: running the analyzer within Xcode</title>
- <link type="text/css" rel="stylesheet" href="content.css" />
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <script type="text/javascript" src="scripts/menu.js"></script>
- <script type="text/javascript" src="scripts/dbtree.js"></script>
-</head>
-<body>
-
-<div id="page">
-<!--#include virtual="menu.html.incl"-->
-<div id="content">
-
-<h1>Build and Analyze: running the analyzer within Xcode</h1>
-
-<table style="margin-top:0px" width="100%" border="0" cellpadding="0px" cellspacing="0">
-<tr><td>
-
-<h3>What is it?</h3>
-<p><i>Build and Analyze</i> is an Xcode feature (introduced in Xcode 3.2) that
-allows users to run the Clang Static Analyzer <a
-href="http://developer.apple.com/mac/library/featuredarticles/StaticAnalysis/index.html">directly
-within Xcode</a>.</p>
-
-<p>It integrates directly with the Xcode build system and
-presents analysis results directly within Xcode's editor.</p>
-
-<h3>Can I use the open source analyzer builds with Xcode?</h3>
-
-<p><b>Yes</b>. Instructions are included below.</p>
-
-</td>
-<td style="padding-left:10px">
-<center>
- <a href="images/analyzer_xcode.png"><img src="images/analyzer_xcode.png" width="620px" border=0></a>
-<br><b>Viewing static analyzer results in Xcode</b></center>
-</td></tr></table>
-
-<h3>Key features:</h3>
-<ul>
- <li><b>Integrated workflow:</b> Results are integrated within Xcode. There is
- no experience of using a separate tool, and activating the analyzer requires a
- single keystroke or mouse click.</li>
- <li><b>Transparency:</b> Works effortlessly with Xcode projects (including iPhone projects).
- <li><b>Cons:</b> Doesn't work well with non-Xcode projects. For those,
- consider using <a href="/scan-build.html"><b>scan-build</b></a>.
-</ul>
-
-
-<h2>Getting Started</h2>
-
-<p>Xcode 3.2 is available as a free download from Apple, with <a
-href="http://developer.apple.com/mac/library/featuredarticles/StaticAnalysis/index.html">instructions available</a>
-for using <i>Build and Analyze</i>.</p>
-
-<h2>Using open source analyzer builds with <i>Build and Analyze</i></h2>
-
-<p>By default, Xcode uses the version of <tt>clang</tt> that came bundled with
-it to provide the results for <i>Build and Analyze</i>. It is possible to change
-Xcode's behavior to use an alternate version of <tt>clang</tt> for this purpose
-while continuing to use the <tt>clang</tt> that came with Xcode for compiling
-projects.</p>
-
-<h3>Why try open source builds?</h3>
-
-<p>The advantage of using open source analyzer builds (provided on this website)
-is that they are often newer than the analyzer provided with Xcode, and thus can
-contain bug fixes, new checks, or simply better analysis.</p>
-
-<p>On the other hand, new checks can be experimental, with results of variable
-quality. Users are encouraged to <a href="filing_bugs.html">file bug reports</a>
-(for any version of the analyzer) where they encounter false positives or other
-issues.</p>
-
-<h3>set-xcode-analyzer</h3>
-
-<p>Starting with analyzer build checker-234, analyzer builds contain a command
-line utility called <tt>set-xcode-analyzer</tt> that allows users to change what
-copy of <tt>clang</tt> that Xcode uses for <i>Build and Analyze</i>:</p>
-
-<pre class="code_example">
-$ <b>set-xcode-analyzer -h</b>
-Usage: set-xcode-analyzer [options]
-
-Options:
- -h, --help show this help message and exit
- --use-checker-build=PATH
- Use the Clang located at the provided absolute path,
- e.g. /Users/foo/checker-1
- --use-xcode-clang Use the Clang bundled with Xcode
-</pre>
-
-<p>Operationally, <b>set-xcode-analyzer</b> edits Xcode's configuration files
-(in <tt>/Developer</tt>) to point it to use the version of <tt>clang</tt> you
-specify for static analysis. Within this model it provides you two basic modes:</p>
-
-<ul>
- <li><b>--use-xcode-clang</b>: Switch Xcode (back) to using the <tt>clang</tt> that came bundled with it for static analysis.</li>
- <li><b>--use-checker-build</b>: Switch Xcode to using the <tt>clang</tt> provided by the specified analyzer build.</li>
-</ul>
-
-<h4>Examples</h4>
-
-<p><b>Example 1</b>: Telling Xcode to use checker-235 for <i>Build and Analyze</i>:</p>
-
-<pre class="code_example">
-$ pwd
-/tmp
-$ tar xjf checker-235.tar.bz2
-$ checker-235/set-xcode-analyzer --use-checker-build=/tmp/checker-235
-</pre>
-
-<p>Note that you typically won't install an analyzer build in <tt>/tmp</tt>, but
-the point of this example is that <tt>set-xcode-analyzer</tt> just wants a full
-path to an untarred analyzer build.</p>
-
-<p><b>Example 2</b>: Telling Xcode to use a very specific version of <tt>clang</tt>:</p>
-
-<pre class="code_example">
-$ set-xcode-analyzer --use-checker-build=~/mycrazyclangbuild/bin/clang
-</pre>
-
-<p><b>Example 3</b>: Resetting Xcode to its default behavior:</p>
-
-<pre class="code_example">
-$ set-xcode-analyzer --use-xcode-clang
-</pre>
-
-</div>
-</div>
-</body>
-</html>
-
diff --git a/contrib/llvm/tools/clang/www/carbon-compile.png b/contrib/llvm/tools/clang/www/carbon-compile.png
deleted file mode 100644
index e8516c7..0000000
--- a/contrib/llvm/tools/clang/www/carbon-compile.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/clang-tutorial.html b/contrib/llvm/tools/clang/www/clang-tutorial.html
deleted file mode 100644
index 0e17046..0000000
--- a/contrib/llvm/tools/clang/www/clang-tutorial.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Quick Tutorial</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<h1>Tutorial</h1>
-
- <p>Invoking the BoostCon tool:</p>
- <pre>
-$ clang -cc1 -boostcon t.cpp
-</pre>
-
- <p>Teach the BoostCon action to identify and print C++ classes:</p>
- <pre>
-bool VisitCXXRecordDecl(CXXRecordDecl *D) {
- std::cout &lt;&lt; D-&gt;getNameAsString()
- &lt;&lt; '\n';
- return false;
-}
-</pre>
-
- <p>Walk and print base classes of a class:</p>
- <pre>
-for(CXXRecordDecl::base_class_iterator
- B = D-&gt;bases_begin(), BEnd = D-&gt;bases_end();
- B != BEnd; ++B) {
- QualType BaseType = B-&gt;getType();
- std::cout &lt;&lt; " " &lt;&lt; BaseType.getAsString()
- &lt;&lt; '\n';
-}
-</pre>
-
- <p>Retrieve the C++ class declaration from a base type:</p>
- <pre>
-if (const RecordType *RTy
- = BaseType-&gt;getAs&lt;RecordType&gt;()) {
- RecordDecl *Base = RTy-&gt;getDecl();
- if (CXXRecordDecl *BaseCXX
- = dyn_cast&lt;CXXRecordDecl&gt;(Base)) {
-
- }
-}
-</pre>
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/clang_video-05-25-2007.html b/contrib/llvm/tools/clang/www/clang_video-05-25-2007.html
deleted file mode 100644
index a85cadc..0000000
--- a/contrib/llvm/tools/clang/www/clang_video-05-25-2007.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>2007 LLVM Developer's Meeting</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
- <!--#include virtual="menu.html.incl"-->
- <div id="content">
- <h1>2007 LLVM Developer's Meeting</h1>
- Discussion about Clang at the <a href="http://llvm.org/devmtg/2007-05/">2007 LLVM Developer's Meeting</a>.
- <h2>About:</h2>
- <p>In this video, Steve Naroff introduces the Clang project and talks about some of the goals and motivations for starting the project.
- <br><br>
- <p><b>Details:</b> New LLVM C Front-end - This talk describes a new from-scratch C frontend (which is aiming to support Objective C and C++ someday) for LLVM, built as a native part of the LLVM system and in the LLVM design style.
- <h2>The Presentation:</h2>
- <p>You can download a copy of the presentation in mov format. However, due to the picture quality, it is recommended that you also download the lecture slides for viewing while you watch the video.
- <ul>
- <li><a href="http://llvm.org/devmtg/2007-05/09-Naroff-CFE.mov">Video (mov file)</a>
- <li><a href="http://llvm.org/devmtg/2007-05/09-Naroff-CFE.pdf">Lecture slides (PDF)</a>
- </ul>
- </div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/clang_video-07-25-2007.html b/contrib/llvm/tools/clang/www/clang_video-07-25-2007.html
deleted file mode 100644
index 179e499..0000000
--- a/contrib/llvm/tools/clang/www/clang_video-07-25-2007.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>LLVM 2.0 and Beyond!</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
- <!--#include virtual="menu.html.incl"-->
- <div id="content">
- <h1>LLVM 2.0 and Beyond!</h1>
- A Google Techtalk by <a href="http://www.nondot.org/sabre/">Chris Lattner</a>
- <h2>About:</h2>
- <p>In this video, Chris Lattner talks about some of the features of Clang, especially in regards to performance.
- <br><br>
- <p><b>Details:</b> The LLVM 2.0 release brings a number of new features and capabilities to the LLVM toolset. This talk briefly describes those features, then moves on to talk about what is next: llvm 2.1, llvm-gcc 4.2, and puts a special emphasis on the 'clang' C front-end. This describes how the 'clang' preprocessor can be used to improve the scalability of distcc by up to 4.4x.
- <h2>The Presentation:</h2>
- <p>You can view the presentation through google video. In addition, the slides from the presentation are also available, if you wish to retain a copy.
- <ul>
- <li><a href="http://video.google.com/videoplay?docid=1921156852099786640">Google Tech Talk Video (19:00-)</a> (Note: the Clang lecture starts at 19 minutes into the video.)
- <li><a href="http://llvm.org/pubs/2007-07-25-LLVM-2.0-and-Beyond.pdf">LLVM 2.0 and Beyond! slides (PDF)</a>
- </ul>
- <h2>Publishing Information:</h2>
- "LLVM 2.0 and Beyond!", Chris Lattner,<br>
- <i>Google Tech Talk</i>, Mountain View, CA, July 2007.
- </div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/comparison.html b/contrib/llvm/tools/clang/www/comparison.html
deleted file mode 100644
index dcf6220..0000000
--- a/contrib/llvm/tools/clang/www/comparison.html
+++ /dev/null
@@ -1,191 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Comparing clang to other open source compilers</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
- <!--#include virtual="menu.html.incl"-->
- <div id="content">
- <h1>Clang vs Other Open Source Compilers</h1>
-
- <p>Building an entirely new compiler front-end is a big task, and it isn't
- always clear to people why we decided to do this. Here we compare clang
- and its goals to other open source compiler front-ends that are
- available. We restrict the discussion to very specific objective points
- to avoid controversy where possible. Also, software is infinitely
- mutable, so we don't talk about little details that can be fixed with
- a reasonable amount of effort: we'll talk about issues that are
- difficult to fix for architectural or political reasons.</p>
-
- <p>The goal of this list is to describe how differences in goals lead to
- different strengths and weaknesses, not to make some compiler look bad.
- This will hopefully help you to evaluate whether using clang is a good
- idea for your personal goals. Because we don't know specifically what
- <em>you</em> want to do, we describe the features of these compilers in
- terms of <em>our</em> goals: if you are only interested in static
- analysis, you may not care that something lacks codegen support, for
- example.</p>
-
- <p>Please email cfe-dev if you think we should add another compiler to this
- list or if you think some characterization is unfair here.</p>
-
- <ul>
- <li><a href="#gcc">Clang vs GCC</a> (GNU Compiler Collection)</li>
- <li><a href="#elsa">Clang vs Elsa</a> (Elkhound-based C++ Parser)</li>
- <li><a href="#pcc">Clang vs PCC</a> (Portable C Compiler)</li>
- </ul>
-
-
- <!--=====================================================================-->
- <h2><a name="gcc">Clang vs GCC (GNU Compiler Collection)</a></h2>
- <!--=====================================================================-->
-
- <p>Pro's of GCC vs clang:</p>
-
- <ul>
- <li>GCC supports languages that clang does not aim to, such as Java, Ada,
- FORTRAN, etc.</li>
- <li><a href="cxx_status.html">Clang support for C++</a> is more compliant
- than GCC's in many ways, but is not as mature as GCC's. GCC has several
- C++'0x features that Clang does not yet support (e.g. variadic
- templates).</li>
- <li>GCC supports more targets than LLVM.</li>
- <li>GCC is popular and widely adopted.</li>
- <li>GCC does not require a C++ compiler to build it.</li>
- </ul>
-
- <p>Pro's of clang vs GCC:</p>
-
- <ul>
- <li>The Clang ASTs and design are intended to be <a
- href="features.html#simplecode">easily understandable</a> by
- anyone who is familiar with the languages involved and who has a basic
- understanding of how a compiler works. GCC has a very old codebase
- which presents a steep learning curve to new developers.</li>
- <li>Clang is designed as an API from its inception, allowing it to be reused
- by source analysis tools, refactoring, IDEs (etc) as well as for code
- generation. GCC is built as a monolithic static compiler, which makes
- it extremely difficult to use as an API and integrate into other tools.
- Further, its historic design and <a
- href="http://gcc.gnu.org/ml/gcc/2007-11/msg00460.html">current</a>
- <a href="http://gcc.gnu.org/ml/gcc/2004-12/msg00888.html">policy</a>
- makes it difficult to decouple the front-end from the rest of the
- compiler. </li>
- <li>Various GCC design decisions make it very difficult to reuse: its build
- system is difficult to modify, you can't link multiple targets into one
- binary, you can't link multiple front-ends into one binary, it uses a
- custom garbage collector, uses global variables extensively, is not
- reentrant or multi-threadable, etc. Clang has none of these problems.
- </li>
- <li>For every token, clang tracks information about where it was written and
- where it was ultimately expanded into if it was involved in a macro.
- GCC does not track information about macro instantiations when parsing
- source code. This makes it very difficult for source rewriting tools
- (e.g. for refactoring) to work in the presence of (even simple)
- macros.</li>
- <li>Clang does not implicitly simplify code as it parses it like GCC does.
- Doing so causes many problems for source analysis tools: as one simple
- example, if you write "x-x" in your source code, the GCC AST will
- contain "0", with no mention of 'x'. This is extremely bad for a
- refactoring tool that wants to rename 'x'.</li>
- <li>Clang can serialize its AST out to disk and read it back into another
- program, which is useful for whole program analysis. GCC does not have
- this. GCC's PCH mechanism (which is just a dump of the compiler
- memory image) is related, but is architecturally only
- able to read the dump back into the exact same executable as the one
- that produced it (it is not a structured format).</li>
- <li>Clang is <a href="features.html#performance">much faster and uses far
- less memory</a> than GCC.</li>
- <li>Clang aims to provide extremely clear and concise diagnostics (error and
- warning messages), and includes support for <a
- href="diagnostics.html">expressive diagnostics</a>. GCC's warnings are
- sometimes acceptable, but are often confusing and it does not support
- expressive diagnostics. Clang also preserves typedefs in diagnostics
- consistently, showing macro expansions and many other features.</li>
- <li>GCC is licensed under the GPL license. clang uses a BSD license, which
- allows it to be used by projects that do not themselves want to be
- GPL.</li>
- <li>Clang inherits a number of features from its use of LLVM as a backend,
- including support for a bytecode representation for intermediate code,
- pluggable optimizers, link-time optimization support, Just-In-Time
- compilation, ability to link in multiple code generators, etc.</li>
- </ul>
-
- <!--=====================================================================-->
- <h2><a name="elsa">Clang vs Elsa (Elkhound-based C++ Parser)</a></h2>
- <!--=====================================================================-->
-
- <p>Pro's of Elsa vs clang:</p>
-
- <ul>
- <li>Elsa's parser and AST is designed to be easily extensible by adding
- grammar rules. Clang has a very simple and easily hackable parser,
- but requires you to write C++ code to do it.</li>
- </ul>
-
- <p>Pro's of clang vs Elsa:</p>
-
- <ul>
- <li>The Elsa community is extremely small and major development work seems
- to have ceased in 2005. Work continued to be used by other small
- projects (e.g. Oink), but Oink is apparently dead now too. Clang has a
- vibrant community including developers that
- are paid to work on it full time. In practice this means that you can
- file bugs against Clang and they will often be fixed for you. If you
- use Elsa, you are (mostly) on your own for bug fixes and feature
- enhancements.</li>
- <li>Elsa is not built as a stack of reusable libraries like clang is. It is
- very difficult to use part of Elsa without the whole front-end. For
- example, you cannot use Elsa to parse C/ObjC code without building an
- AST. You can do this in Clang and it is much faster than building an
- AST.</li>
- <li>Elsa does not have an integrated preprocessor, which makes it extremely
- difficult to accurately map from a source location in the AST back to
- its original position before preprocessing. Like GCC, it does not keep
- track of macro expansions.</li>
- <li>Elsa is even slower and uses more memory than GCC, which itself requires
- far more space and time than clang.</li>
- <li>Elsa only does partial semantic analysis. It is intended to work on
- code that is already validated by GCC, so it does not do many semantic
- checks required by the languages it implements.</li>
- <li>Elsa does not support Objective-C.</li>
- <li>Elsa does not support native code generation.</li>
- </ul>
-
- <p>Note that there is a fork of Elsa known as "Pork". It addresses some of
- these shortcomings by loosely integrating a preprocessor. This allows it
- to map from a source location in the AST to the original position before
- preprocessing, providing it better support for static analysis and
- refactoring. Note that Pork is in stasis now too.</p>
-
-
- <!--=====================================================================-->
- <h2><a name="pcc">Clang vs PCC (Portable C Compiler)</a></h2>
- <!--=====================================================================-->
-
- <p>Pro's of PCC vs clang:</p>
-
- <ul>
- <li>The PCC source base is very small and builds quickly with just a C
- compiler.</li>
- </ul>
-
- <p>Pro's of clang vs PCC:</p>
-
- <ul>
- <li>PCC dates from the 1970's and has been dormant for most of that time.
- The clang + llvm communities are very active.</li>
- <li>PCC doesn't support Objective-C or C++ and doesn't aim to support
- C++.</li>
- <li>PCC's code generation is very limited compared to LLVM. It produces very
- inefficient code and does not support many important targets.</li>
- <li>Like Elsa, PCC's does not have an integrated preprocessor, making it
- extremely difficult to use it for source analysis tools.</li>
- </div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/content.css b/contrib/llvm/tools/clang/www/content.css
deleted file mode 100644
index dca6a32..0000000
--- a/contrib/llvm/tools/clang/www/content.css
+++ /dev/null
@@ -1,27 +0,0 @@
-html { margin: 0px; } body { margin: 8px; }
-
-html, body {
- padding:0px;
- font-size:small; font-family:"Lucida Grande", "Lucida Sans Unicode", Arial, Verdana, Helvetica, sans-serif; background-color: #fff; color: #222;
- line-height:1.5;
-}
-
-h1, h2, h3, tt { color: #000 }
-
-h1 { padding-top:0px; margin-top:0px;}
-h2 { color:#333333; padding-top:0.5em; }
-h3 { padding-top: 0.5em; margin-bottom: -0.25em; color:#2d58b7}
-li { padding-bottom: 0.5em; }
-ul { padding-left:1.5em; }
-
-/* Slides */
-IMG.img_slide {
- display: block;
- margin-left: auto;
- margin-right: auto
-}
-
-.itemTitle { color:#2d58b7 }
-
-/* Tables */
-tr { vertical-align:top }
diff --git a/contrib/llvm/tools/clang/www/cxx_compatibility.html b/contrib/llvm/tools/clang/www/cxx_compatibility.html
deleted file mode 100644
index fe03240..0000000
--- a/contrib/llvm/tools/clang/www/cxx_compatibility.html
+++ /dev/null
@@ -1,303 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - C++ Compatibility</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <style type="text/css">
-</style>
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<!-- ======================================================================= -->
-<h1>Clang's C++ Compatibility</h1>
-<!-- ======================================================================= -->
-
-<ul>
-<li><a href="#intro">Introduction</a></li>
-<li><a href="#vla">Variable-length arrays</a></li>
-<li><a href="#init_static_const">Initialization of non-integral static const data members within a class definition</a></li>
-<li><a href="#dep_lookup">Unqualified lookup in templates</a></li>
-<li><a href="#dep_lookup_bases">Unqualified lookup into dependent bases of class templates</a></li>
-<li><a href="#bad_templates">Templates with no valid instantiations</a></li>
-<li><a href="#default_init_const">Default initialization of const variable of a class type requires user-defined default constructor</a></li>
-</ul>
-
-<!-- ======================================================================= -->
-<h2 id="intro">Introduction</h2>
-<!-- ======================================================================= -->
-
-<p>Clang strives to strictly conform to the C++ standard. That means
-it will reject invalid C++ code that another compiler may accept.
-This page helps you decide whether a Clang error message means a
-C++-conformance bug in your code and how you can fix it.</p>
-
-<!-- ======================================================================= -->
-<h2 id="vla">Variable-length arrays</h2>
-<!-- ======================================================================= -->
-
-<p>GCC and C99 allow an array's size to be determined at run
-time. This extension is not permitted in standard C++. However, Clang
-supports such variable length arrays in very limited circumstances for
-compatibility with GNU C and C99 programs:</p>
-
-<ul>
- <li>The element type of a variable length array must be a POD
- ("plain old data") type, which means that it cannot have any
- user-declared constructors or destructors, base classes, or any
- members if non-POD type. All C types are POD types.</li>
-
- <li>Variable length arrays cannot be used as the type of a non-type
-template parameter.</li> </ul>
-
-<p>If your code uses variable length arrays in a manner that Clang doesn't support, there are several ways to fix your code:
-
-<ol>
-<li>replace the variable length array with a fixed-size array if you can
- determine a
- reasonable upper bound at compile time; sometimes this is as
- simple as changing <tt>int size = ...;</tt> to <tt>const int size
- = ...;</tt> (if the definition of <tt>size</tt> is a compile-time
- integral constant);</li>
-<li>use an <tt>std::string</tt> instead of a <tt>char []</tt>;</li>
-<li>use <tt>std::vector</tt> or some other suitable container type;
- or</li>
-<li>allocate the array on the heap instead using <tt>new Type[]</tt> -
- just remember to <tt>delete[]</tt> it.</li>
-</ol>
-
-<!-- ======================================================================= -->
-<h2 id="init_static_const">Initialization of non-integral static const data members within a class definition</h2>
-<!-- ======================================================================= -->
-
-The following code is ill-formed in C++'03:
-
-<pre>
-class SomeClass {
- public:
- static const double SomeConstant = 0.5;
-};
-
-const double SomeClass::SomeConstant;
-</pre>
-
-Clang errors with something similar to:
-
-<pre>
-.../your_file.h:42:42: error: 'SomeConstant' can only be initialized if it is a static const integral data member
- static const double SomeConstant = 0.5;
- ^ ~~~
-</pre>
-
-Only <i>integral</i> constant expressions are allowed as initializers
-within the class definition. See C++'03 [class.static.data] p4 for the
-details of this restriction. The fix here is straightforward: move
-the initializer to the definition of the static data member, which
-must exist outside of the class definition:
-
-<pre>
-class SomeClass {
- public:
- static const double SomeConstant;
-};
-
-const double SomeClass::SomeConstant<b> = 0.5</b>;
-</pre>
-
-Note that the forthcoming C++0x standard will allow this.
-
-<!-- ======================================================================= -->
-<h2 id="dep_lookup">Unqualified lookup in templates</h2>
-<!-- ======================================================================= -->
-
-Some versions of GCC accept the following invalid code:
-
-<pre>
-template &lt;typename T&gt; struct Foo {
- void Work(T x) {
- func(x);
- }
-};
-...
-void func(int x);
-...
-template struct Foo&lt;int&gt;; // or anything else that instantiates Foo&lt;int&gt;::Work
-</pre>
-
-The standard says that unqualified names like <tt>func</tt> are looked up
-when the template is defined, not when it's instantiated. Since
-<tt>void func(int)</tt> was not declared yet when <tt>Foo</tt> was
-defined, it's not considered. The fix is usually to
-declare <tt>func</tt> before <tt>Foo</tt>.
-
-<p>This is complicated by <i>argument-dependent lookup</i> (ADL),
-which is done when unqualified names are called as functions,
-like <tt>func(x)</tt> above. The standard says that ADL is performed
-in both places if any of the arguments are type-dependent, like
-<tt>x</tt> is in this example. However, ADL does nothing for builtin
-types like <tt>int</tt>, so the example is still invalid. See
-[basic.lookup.argdep] for more information.
-
-<!-- ======================================================================= -->
-<h2 id="dep_lookup_bases">Unqualified lookup into dependent bases of class templates</h2>
-<!-- ======================================================================= -->
-
-Some versions of GCC accept the following invalid code:
-
-<pre>
-template &lt;typename T&gt; struct Base {
- void DoThis(T x) {}
- static void DoThat(T x) {}
-};
-
-template &lt;typename T&gt; struct Derived : public Base&lt;T&gt; {
- void Work(T x) {
- DoThis(x); // Invalid!
- DoThat(x); // Invalid!
- }
-};
-</pre>
-
-Clang correctly rejects it with the following errors
-(when <tt>Derived</tt> is eventually instantiated):
-
-<pre>
-my_file.cpp:8:5: error: use of undeclared identifier 'DoThis'
- DoThis(x);
- ^
- this-&gt;
-my_file.cpp:2:8: note: must qualify identifier to find this declaration in dependent base class
- void DoThis(T x) {}
- ^
-my_file.cpp:9:5: error: use of undeclared identifier 'DoThat'
- DoThat(x);
- ^
- this-&gt;
-my_file.cpp:3:15: note: must qualify identifier to find this declaration in dependent base class
- static void DoThat(T x) {}
-</pre>
-
-Like we said <a href="#dep_lookup">above</a>, unqualified names like
-<tt>DoThis</tt> and <tt>DoThat</tt> are looked up when the template
-<tt>Derived</tt> is defined, not when it's instantiated. When we look
-up a name used in a class, we usually look into the base classes.
-However, we can't look into the base class <tt>Base&lt;T&gt;</tt>
-because its type depends on the template argument <tt>T</tt>, so the
-standard says we should just ignore it. See [temp.dep]p3 for details.
-
-<p>The fix, as Clang tells you, is to tell the compiler that we want a
-class member by prefixing the calls with <tt>this-&gt;</tt>:
-
-<pre>
- void Work(T x) {
- <b>this-&gt;</b>DoThis(x);
- <b>this-&gt;</b>DoThat(x);
- }
-</pre>
-
-Alternatively, you can tell the compiler exactly where to look:
-
-<pre>
- void Work(T x) {
- <b>Base&lt;T&gt;</b>::DoThis(x);
- <b>Base&lt;T&gt;</b>::DoThat(x);
- }
-</pre>
-
-This works whether the methods are static or not, but be careful:
-if <tt>DoThis</tt> is virtual, calling it this way will bypass virtual
-dispatch!
-
-<!-- ======================================================================= -->
-<h2 id="bad_templates">Templates with no valid instantiations</h2>
-<!-- ======================================================================= -->
-
-The following code contains a typo: the programmer
-meant <tt>init()</tt> but wrote <tt>innit()</tt> instead.
-
-<pre>
- template &lt;class T&gt; class Processor {
- ...
- void init();
- ...
- };
- ...
- template &lt;class T&gt; void process() {
- Processor&lt;T&gt; processor;
- processor.innit(); // <-- should be 'init()'
- ...
- }
-</pre>
-
-Unfortunately, we can't flag this mistake as soon as we see it: inside
-a template, we're not allowed to make assumptions about "dependent
-types" like <tt>Processor&lt;T&gt;</tt>. Suppose that later on in
-this file the programmer adds an explicit specialization
-of <tt>Processor</tt>, like so:
-
-<pre>
- template &lt;&gt; class Processor&lt;char*&gt; {
- void innit();
- };
-</pre>
-
-Now the program will work &mdash; as long as the programmer only ever
-instantiates <tt>process()</tt> with <tt>T = char*</tt>! This is why
-it's hard, and sometimes impossible, to diagnose mistakes in a
-template definition before it's instantiated.
-
-<p>The standard says that a template with no valid instantiations is
-ill-formed. Clang tries to do as much checking as possible at
-definition-time instead of instantiation-time: not only does this
-produce clearer diagnostics, but it also substantially improves
-compile times when using pre-compiled headers. The downside to this
-philosophy is that Clang sometimes fails to process files because they
-contain broken templates that are no longer used. The solution is
-simple: since the code is unused, just remove it.
-
-<!-- ======================================================================= -->
-<h2 id="default_init_const">Default initialization of const variable of a class type requires user-defined default constructor</h2>
-<!-- ======================================================================= -->
-
-If a <tt>class</tt> or <tt>struct</tt> has no user-defined default
-constructor, C++ doesn't allow you to default construct a <tt>const</tt>
-instance of it like this ([dcl.init], p9):
-
-<pre>
-class Foo {
- public:
- // The compiler-supplied default constructor works fine, so we
- // don't bother with defining one.
- ...
-};
-
-void Bar() {
- const Foo foo; // Error!
- ...
-}
-</pre>
-
-To fix this, you can define a default constructor for the class:
-
-<pre>
-class Foo {
- public:
- Foo() {}
- ...
-};
-
-void Bar() {
- const Foo foo; // Now the compiler is happy.
- ...
-}
-</pre>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/cxx_status.html b/contrib/llvm/tools/clang/www/cxx_status.html
deleted file mode 100644
index 8fccc2a..0000000
--- a/contrib/llvm/tools/clang/www/cxx_status.html
+++ /dev/null
@@ -1,234 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>Clang - C++ and C++'0x Status</title>
- <link type="text/css" rel="stylesheet" href="menu.css">
- <link type="text/css" rel="stylesheet" href="content.css">
- <style type="text/css">
- .na { background-color: #C0C0C0; text-align: center; }
- .broken { background-color: #C11B17 }
- .basic { background-color: #F88017 }
- .medium { background-color: #FDD017 }
- .advanced { background-color: #347C17 }
- .complete { background-color: #00FF00 }
- </style>
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<!--*************************************************************************-->
-<h1>C++ and C++'0x Support in Clang</h1>
-<!--*************************************************************************-->
-<p>Last updated: $Date: 2010-05-21 23:16:21 +0200 (Fri, 21 May 2010) $</p>
-
- <ul>
- <li><a href="#projects">Projects Building with Clang</a></li>
- <li><a href="#specification">Implementation Status by Section</a></li>
- <li><a href="#cxx0x">C++0x Status</a></li>
- </ul>
-
-<p>Clang currently implements all of the ISO C++ 1998 standard (including
- the defects addressed in the ISO C++ 2003 standard) except for 'export'
- (which has been removed from the C++'0x draft).
- However, the implementation of Clang C++ is still somewhat immature, with
- remaining bugs that may cause compiler crashes, erroneous errors and warnings,
- or miscompiled code. The <a href="http://llvm.org/bugs/">LLVM bug tracker</a>
- contains a Clang C++ component that tracks known Clang C++ bugs.</p>
-
- <h2 id="projects">Projects Building with Clang</h2>
-
- <p>Clang is now capable of compiling large C++ projects, and the following
- table describes various projects that we have attempted to compile with
- Clang++.</p>
-
-<table width="689" border="1" cellspacing="0">
- <tr>
- <th>Project</th>
- <th>Status</th>
- <th>Last Tested</th>
- <th>Tracking Bug</th>
- </tr>
- <tr>
- <td><a href="http://clang.llvm.org">Clang</a> and <a href="http://llvm.org">LLVM</a></td>
- <td>Successful self-hosting achieved</td>
- <td>Continually</td>
- <td></td>
- </tr>
- <tr>
- <td><a href="http://www.cmake.org">CMake</a></td>
- <td>Compiles, passes regression tests (debug build)</td>
- <td>February 9, 2010</td>
- <td></td>
- </tr>
- <tr>
- <td><a href="http://www.boost.org">Boost</a></td>
- <td><a href="http://blog.llvm.org/2010/05/clang-builds-boost.html">Compiles
- and passes regression tests</a> on Darwin/X86-64.</td>
- <td>May 20, 2010</td>
- <td><a href="http://llvm.org/bugs/show_bug.cgi?id=6023">PR6023</a></td>
- </tr>
- <tr>
- <td><a href="http://qt.nokia.com">Qt</a></td>
- <td>Partially compiles; miscompilation of uic prevents complete compilation, qmake works, some small examples also.</td>
- <td>February 9, 2010</td>
- <td><a href="http://llvm.org/bugs/show_bug.cgi?id=5881">PR5881</a></td>
- </tr>
-</table>
-
-<h2 id="cxx0x">C++0x Implementation status</h2>
-
-<p>Clang's development effort is focused primarily on fixing bugs in the current
-ISO C++ standard (1998/2003). This section tracks the status of various C++0x
-features.</p>
-
-
-<h2 id="specification">Implementation Status by Feature</h2>
-
-
-<!-- Within this table: The colors we're using to color-code our level
-of support for a given section:
-
- White (no background): not considered/tested.
- #C11B17: Broken.
- #F88017: Some useful examples work
- #FDD017: Many examples work
- #347C17: Nearly everything works
- #00FF00 + check mark: Implementation complete!
- -->
-
-<p>The following table is used to help track our implementation
- progress toward implementing the complete C++'0x standard. We use a
- simple, somewhat arbitrary color-coding scheme to describe the
- relative completeness of features:</p>
-
-<table width="689" border="1" cellspacing="0">
- <tr>
- <th>Not started/not evaluated</th>
- <th>Not Applicable</th>
- <th>Broken</th>
- <th>Some examples work</th>
- <th>Many examples work</th>
- <th>Nearly everything works</th>
- <th>Complete</th>
- <th>Complete (with tests for each paragraph)</th>
- </tr>
- <tr>
- <td></td>
- <td class="na">N/A</td>
- <td class="broken"></td>
- <td class="basic"></td>
- <td class="medium"></td>
- <td class="advanced"></td>
- <td class="complete"></td>
- <td class="complete" align="center">&#x2713;</td>
- </tr>
-</table>
-
-<p>A feature is "complete" when the appropriate Clang component (Parse, AST,
-Sema, CodeGen) implements the behavior described in all of the
-paragraphs in the relevant C++'0x draft standard. The major
-components are:</p>
-
-<dl>
- <dt>Parse</dt>
- <dd>Clang is able to parse the grammar of this feature (or the grammar
- described by this section), but does not necessarily do anything with the
- parsed result. Use Clang's <code>-fsyntax-only</code> option to parse C++
- programs.</dd>
-
- <dt>AST</dt>
- <dd>Clang builds an abstract syntax tree (AST) for the feature, but does not
- necessarily perform any type-checking. Use Clang's <code>-ast-print</code>
- option to print the resulting ASTs.</dd>
-
- <dt>Sema</dt>
- <dd>Clang parses and type-checks this feature and provides a well-formed AST
- annotated with types. Use Clang's <code>-fsyntax-only</code> to type-check
- code.</dd>
-
- <dt>CodeGen</dt>
- <dd>Clang parses, type-checks, and generates code for this feature, allowing
- one to compile and execute programs.</dd>
-</dl>
-
-<p>Updates to this table are welcome! Tests for the various features are also
-welcome!</p>
-
-<table width="689" border="1" cellspacing="0">
-<tr><td colspan="6" align="center" bgcolor="#ffffcc">C++0x Features</td>
-</tr>
- <tr>
- <th>Feature</th>
- <th>Parse</th>
- <th>AST</th>
- <th>Sema</th>
- <th>CodeGen</th>
- <th>Notes</th>
- </tr>
-
-<tr>
- <td>Explicit conversion operators (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf">N2437</a>)</td>
- <td class="complete" align="center"></td>
- <td class="medium" align="center"></td>
- <td class="advanced" align="center"></td>
- <td class="broken"></td>
- <td>No name mangling; ASTs don't contain calls to conversion operators</td>
-</tr>
-<tr>
- <td>Static assertions (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.pdf">N1720</a>)</td>
- <td class="complete" align="center"></td>
- <td class="complete" align="center"></td>
- <td class="complete" align="center"></td>
- <td class="na">N/A</td>
- <td></td>
-</tr>
-<tr>
- <td>Deleted functions (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm">N2346</a>)</td>
- <td class="complete" align="center"></td>
- <td class="complete" align="center"></td>
- <td class="complete" align="center"></td>
- <td class="na">N/A</td>
- <td></td>
-</tr>
-<tr>
- <td>Rvalue references (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html">N2118</a> + <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2831.html">N2831</a>)</td>
- <td class="complete" align="center"></td>
- <td class="complete" align="center"></td>
- <td class="complete" align="center"></td>
- <td class="broken"></td>
- <td></td>
-</tr>
-<tr>
- <td>nullptr (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf">N2431</a>)</td>
- <td class="complete" align="center"></td>
- <td class="complete" align="center"></td>
- <td class="complete" align="center"></td>
- <td class="broken"></td>
- <td></td>
-</tr>
-<tr>
- <td>Right angle brackets (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html">N1757</a>)</td>
- <td class="complete" align="center"></td>
- <td class="na" align="center">N/A</td>
- <td class="na" align="center">N/A</td>
- <td class="na">N/A</td>
- <td></td>
-</tr>
-<tr>
- <td>Decltype (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf">N2343</a>)</td>
- <td class="complete" align="center">&#x2713;</td>
- <td class="complete" align="center">&#x2713;</td>
- <td class="complete" align="center">&#x2713;</td>
- <td class="na">N/A</td>
- <td></td>
-</tr>
-</table>
-<br />
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/demo/DemoInfo.html b/contrib/llvm/tools/clang/www/demo/DemoInfo.html
deleted file mode 100644
index 54a5afa..0000000
--- a/contrib/llvm/tools/clang/www/demo/DemoInfo.html
+++ /dev/null
@@ -1,83 +0,0 @@
-
-<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>
-
diff --git a/contrib/llvm/tools/clang/www/demo/cathead.png b/contrib/llvm/tools/clang/www/demo/cathead.png
deleted file mode 100644
index 3bf1a45..0000000
--- a/contrib/llvm/tools/clang/www/demo/cathead.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/demo/index.cgi b/contrib/llvm/tools/clang/www/demo/index.cgi
deleted file mode 100644
index b29efb6..0000000
--- a/contrib/llvm/tools/clang/www/demo/index.cgi
+++ /dev/null
@@ -1,461 +0,0 @@
-#!/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;
diff --git a/contrib/llvm/tools/clang/www/demo/syntax.css b/contrib/llvm/tools/clang/www/demo/syntax.css
deleted file mode 100644
index 90daf5f..0000000
--- a/contrib/llvm/tools/clang/www/demo/syntax.css
+++ /dev/null
@@ -1,4 +0,0 @@
-/* LLVM syntax highlighting for the Web */
-
-.llvm_type { font-style: oblique; color: green }
-.llvm_keyword { font-weight: bold; color: blue }
diff --git a/contrib/llvm/tools/clang/www/demo/what is this directory.txt b/contrib/llvm/tools/clang/www/demo/what is this directory.txt
deleted file mode 100644
index a1306ac..0000000
--- a/contrib/llvm/tools/clang/www/demo/what is this directory.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-This is for the LLVM+Clang browser based demo.
-It is supposed to work like the LLVM+GCC demo here: http://llvm.org/demo/ but for the BSD licensed Clang instead.
-
-Perhaps it could also be used for getting crash information and details on errors.... I'm not sure if this would require some major changes or not to report this info. Maybe also adding ways that people can use it to test for errors and a way to report such errors would also be good.
-
-Status:
-Anyways, right now, these file a basically just a copy of the LLVM+GCC demo (no changes have been made). The files don't even work right in this location on the server. As such, someone will need to edit the file or rewrite it.
-
-If nobody in the LLVM community has the skills, one suggestion would be to post a request on a friendly Perl forum and see if anybody might be interested in taking on the challenge.
-
-Alternatively, you could try a PHP, Python, Ruby, or Lisp mailing list and see if there are any takers who would be interested (and willing to do a rewrite to their language of choice).
-
---
-BTW, once this feature was working, my intention was to link to it from the index.html page in the section entitled:
-Try Clang \ No newline at end of file
diff --git a/contrib/llvm/tools/clang/www/diagnostics.html b/contrib/llvm/tools/clang/www/diagnostics.html
deleted file mode 100644
index 4f7d025..0000000
--- a/contrib/llvm/tools/clang/www/diagnostics.html
+++ /dev/null
@@ -1,349 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Expressive Diagnostics</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <style type="text/css">
-</style>
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-
-<!--=======================================================================-->
-<h1>Expressive Diagnostics</h1>
-<!--=======================================================================-->
-
-<p>In addition to being fast and functional, we aim to make Clang extremely user
-friendly. As far as a command-line compiler goes, this basically boils down to
-making the diagnostics (error and warning messages) generated by the compiler
-be as useful as possible. There are several ways that we do this. This section
-talks about the experience provided by the command line compiler, contrasting
-Clang output to GCC 4.2's output in several examples.
-<!--
-Other clients
-that embed Clang and extract equivalent information through internal APIs.-->
-</p>
-
-<h2>Column Numbers and Caret Diagnostics</h2>
-
-<p>First, all diagnostics produced by clang include full column number
-information, and use this to print "caret diagnostics". This is a feature
-provided by many commercial compilers, but is generally missing from open source
-compilers. This is nice because it makes it very easy to understand exactly
-what is wrong in a particular piece of code, an example is:</p>
-
-<pre>
- $ <b>gcc-4.2 -fsyntax-only -Wformat format-strings.c</b>
- format-strings.c:91: warning: too few arguments for format
- $ <b>clang -fsyntax-only format-strings.c</b>
- format-strings.c:91:13: <font color="magenta">warning:</font> '.*' specified field precision is missing a matching 'int' argument
- <font color="darkgreen"> printf("%.*d");</font>
- <font color="blue"> ^</font>
-</pre>
-
-<p>The caret (the blue "^" character) exactly shows where the problem is, even
-inside of the string. This makes it really easy to jump to the problem and
-helps when multiple instances of the same character occur on a line. We'll
-revisit this more in following examples.</p>
-
-<h2>Range Highlighting for Related Text</h2>
-
-<p>Clang captures and accurately tracks range information for expressions,
-statements, and other constructs in your program and uses this to make
-diagnostics highlight related information. For example, here's a somewhat
-nonsensical example to illustrate this:</p>
-
-<pre>
- $ <b>gcc-4.2 -fsyntax-only t.c</b>
- t.c:7: error: invalid operands to binary + (have 'int' and 'struct A')
- $ <b>clang -fsyntax-only t.c</b>
- t.c:7:39: <font color="red">error:</font> invalid operands to binary expression ('int' and 'struct A')
- <font color="darkgreen"> return y + func(y ? ((SomeA.X + 40) + SomeA) / 42 + SomeA.X : SomeA.X);</font>
- <font color="blue"> ~~~~~~~~~~~~~~ ^ ~~~~~</font>
-</pre>
-
-<p>Here you can see that you don't even need to see the original source code to
-understand what is wrong based on the Clang error: Because clang prints a
-caret, you know exactly <em>which</em> plus it is complaining about. The range
-information highlights the left and right side of the plus which makes it
-immediately obvious what the compiler is talking about, which is very useful for
-cases involving precedence issues and many other cases.</p>
-
-<h2>Precision in Wording</h2>
-
-<p>A detail is that we have tried really hard to make the diagnostics that come
-out of clang contain exactly the pertinent information about what is wrong and
-why. In the example above, we tell you what the inferred types are for
-the left and right hand sides, and we don't repeat what is obvious from the
-caret (that this is a "binary +"). Many other examples abound, here is a simple
-one:</p>
-
-<pre>
- $ <b>gcc-4.2 -fsyntax-only t.c</b>
- t.c:5: error: invalid type argument of 'unary *'
- $ <b>clang -fsyntax-only t.c</b>
- t.c:5:11: <font color="red">error:</font> indirection requires pointer operand ('int' invalid)
- <font color="darkgreen"> int y = *SomeA.X;</font>
- <font color="blue"> ^~~~~~~~</font>
-</pre>
-
-<p>In this example, not only do we tell you that there is a problem with the *
-and point to it, we say exactly why and tell you what the type is (in case it is
-a complicated subexpression, such as a call to an overloaded function). This
-sort of attention to detail makes it much easier to understand and fix problems
-quickly.</p>
-
-<h2>No Pretty Printing of Expressions in Diagnostics</h2>
-
-<p>Since Clang has range highlighting, it never needs to pretty print your code
-back out to you. This is particularly bad in G++ (which often emits errors
-containing lowered vtable references), but even GCC can produce
-inscrutible error messages in some cases when it tries to do this. In this
-example P and Q have type "int*":</p>
-
-<pre>
- $ <b>gcc-4.2 -fsyntax-only t.c</b>
- #'exact_div_expr' not supported by pp_c_expression#'t.c:12: error: called object is not a function
- $ <b>clang -fsyntax-only t.c</b>
- t.c:12:8: <font color="red">error:</font> called object type 'int' is not a function or function pointer
- <font color="darkgreen"> (P-Q)();</font>
- <font color="blue"> ~~~~~^</font>
-</pre>
-
-
-<h2>Typedef Preservation and Selective Unwrapping</h2>
-
-<p>Many programmers use high-level user defined types, typedefs, and other
-syntactic sugar to refer to types in their program. This is useful because they
-can abbreviate otherwise very long types and it is useful to preserve the
-typename in diagnostics. However, sometimes very simple typedefs can wrap
-trivial types and it is important to strip off the typedef to understand what
-is going on. Clang aims to handle both cases well.<p>
-
-<p>For example, here is an example that shows where it is important to preserve
-a typedef in C:</p>
-
-<pre>
- $ <b>gcc-4.2 -fsyntax-only t.c</b>
- t.c:15: error: invalid operands to binary / (have 'float __vector__' and 'const int *')
- $ <b>clang -fsyntax-only t.c</b>
- t.c:15:11: <font color="red">error:</font> can't convert between vector values of different size ('__m128' and 'int const *')
- <font color="darkgreen"> myvec[1]/P;</font>
- <font color="blue"> ~~~~~~~~^~</font>
-</pre>
-
-<p>Here the type printed by GCC isn't even valid, but if the error were about a
-very long and complicated type (as often happens in C++) the error message would
-be ugly just because it was long and hard to read. Here's an example where it
-is useful for the compiler to expose underlying details of a typedef:</p>
-
-<pre>
- $ <b>gcc-4.2 -fsyntax-only t.c</b>
- t.c:13: error: request for member 'x' in something not a structure or union
- $ <b>clang -fsyntax-only t.c</b>
- t.c:13:9: <font color="red">error:</font> member reference base type 'pid_t' (aka 'int') is not a structure or union
- <font color="darkgreen"> myvar = myvar.x;</font>
- <font color="blue"> ~~~~~ ^</font>
-</pre>
-
-<p>If the user was somehow confused about how the system "pid_t" typedef is
-defined, Clang helpfully displays it with "aka".</p>
-
-<p>In C++, type preservation includes retaining any qualification written into type names. For example, if we take a small snippet of code such as:
-
-<blockquote>
-<pre>
-namespace services {
- struct WebService { };
-}
-namespace myapp {
- namespace servers {
- struct Server { };
- }
-}
-
-using namespace myapp;
-void addHTTPService(servers::Server const &server, ::services::WebService const *http) {
- server += http;
-}
-</pre>
-</blockquote>
-
-<p>and then compile it, we see that Clang is both providing more accurate information and is retaining the types as written by the user (e.g., "servers::Server", "::services::WebService"):
-
-<pre>
- $ <b>g++-4.2 -fsyntax-only t.cpp</b>
- t.cpp:9: error: no match for 'operator+=' in 'server += http'
- $ <b>clang -fsyntax-only t.cpp</b>
- t.cpp:9:10: <font color="red">error:</font> invalid operands to binary expression ('servers::Server const' and '::services::WebService const *')
- <font color="darkgreen">server += http;</font>
- <font color="blue">~~~~~~ ^ ~~~~</font>
-</pre>
-
-<p>Naturally, type preservation extends to uses of templates, and Clang retains information about how a particular template specialization (like <code>std::vector&lt;Real&gt;</code>) was spelled within the source code. For example:</p>
-
-<pre>
- $ <b>g++-4.2 -fsyntax-only t.cpp</b>
- t.cpp:12: error: no match for 'operator=' in 'str = vec'
- $ <b>clang -fsyntax-only t.cpp</b>
- t.cpp:12:7: <font color="red">error:</font> incompatible type assigning 'vector&lt;Real&gt;', expected 'std::string' (aka 'class std::basic_string&lt;char&gt;')
- <font color="darkgreen">str = vec</font>;
- <font color="blue">^ ~~~</font>
-</pre>
-
-<h2>Fix-it Hints</h2>
-
-<p>"Fix-it" hints provide advice for fixing small, localized problems
-in source code. When Clang produces a diagnostic about a particular
-problem that it can work around (e.g., non-standard or redundant
-syntax, missing keywords, common mistakes, etc.), it may also provide
-specific guidance in the form of a code transformation to correct the
-problem. For example, here Clang warns about the use of a GCC
-extension that has been considered obsolete since 1993:</p>
-
-<pre>
- $ <b>clang t.c</b>
- t.c:5:28: <font color="magenta">warning:</font> use of GNU old-style field designator extension
- <font color="darkgreen">struct point origin = { x: 0.0, y: 0.0 };</font>
- <font color="red">~~</font> <font color="blue">^</font>
- <font color="darkgreen">.x = </font>
- t.c:5:36: <font color="magenta">warning:</font> use of GNU old-style field designator extension
- <font color="darkgreen">struct point origin = { x: 0.0, y: 0.0 };</font>
- <font color="red">~~</font> <font color="blue">^</font>
- <font color="darkgreen">.y = </font>
-</pre>
-
-<p>The underlined code should be removed, then replaced with the code below the
-caret line (".x =" or ".y =", respectively). "Fix-it" hints are most useful for
-working around common user errors and misconceptions. For example, C++ users
-commonly forget the syntax for explicit specialization of class templates,
-as in the following error:</p>
-
-<pre>
- $ <b>clang t.cpp</b>
- t.cpp:9:3: <font color="red">error:</font> template specialization requires 'template&lt;&gt;'
- struct iterator_traits&lt;file_iterator&gt; {
- <font color="blue">^</font>
- <font color="darkgreen">template&lt;&gt; </font>
-</pre>
-
-<p>Again, after describing the problem, Clang provides the fix--add <code>template&lt;&gt;</code>--as part of the diagnostic.<p>
-
-<h2>Automatic Macro Expansion</h2>
-
-<p>Many errors happen in macros that are sometimes deeply nested. With
-traditional compilers, you need to dig deep into the definition of the macro to
-understand how you got into trouble. Here's a simple example that shows how
-Clang helps you out:</p>
-
-<pre>
- $ <b>gcc-4.2 -fsyntax-only t.c</b>
- t.c: In function 'test':
- t.c:80: error: invalid operands to binary &lt; (have 'struct mystruct' and 'float')
- $ <b>clang -fsyntax-only t.c</b>
- t.c:80:3: <font color="red">error:</font> invalid operands to binary expression ('typeof(P)' (aka 'struct mystruct') and 'typeof(F)' (aka 'float'))
- <font color="darkgreen"> X = MYMAX(P, F);</font>
- <font color="blue"> ^~~~~~~~~~~</font>
- t.c:76:94: note: instantiated from:
- <font color="darkgreen">#define MYMAX(A,B) __extension__ ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a &lt; __b ? __b : __a; })</font>
- <font color="blue"> ~~~ ^ ~~~</font>
-</pre>
-
-<p>This shows how clang automatically prints instantiation information and
-nested range information for diagnostics as they are instantiated through macros
-and also shows how some of the other pieces work in a bigger example. Here's
-another real world warning that occurs in the "window" Unix package (which
-implements the "wwopen" class of APIs):</p>
-
-<pre>
- $ <b>clang -fsyntax-only t.c</b>
- t.c:22:2: <font color="magenta">warning:</font> type specifier missing, defaults to 'int'
- <font color="darkgreen"> ILPAD();</font>
- <font color="blue"> ^</font>
- t.c:17:17: note: instantiated from:
- <font color="darkgreen">#define ILPAD() PAD((NROW - tt.tt_row) * 10) /* 1 ms per char */</font>
- <font color="blue"> ^</font>
- t.c:14:2: note: instantiated from:
- <font color="darkgreen"> register i; \</font>
- <font color="blue"> ^</font>
-</pre>
-
-<p>In practice, we've found that this is actually more useful in multiply nested
-macros that in simple ones.</p>
-
-<h2>Quality of Implementation and Attention to Detail</h2>
-
-<p>Finally, we have put a lot of work polishing the little things, because
-little things add up over time and contribute to a great user experience. Three
-examples are:</p>
-
-<pre>
- $ <b>gcc-4.2 t.c</b>
- t.c: In function 'foo':
- t.c:5: error: expected ';' before '}' token
- $ <b>clang t.c</b>
- t.c:4:8: <font color="red">error:</font> expected ';' after expression
- <font color="darkgreen"> bar()</font>
- <font color="blue"> ^</font>
- <font color="blue"> ;</font>
-</pre>
-
-<p>This shows a trivial little tweak, where we tell you to put the semicolon at
-the end of the line that is missing it (line 4) instead of at the beginning of
-the following line (line 5). This is particularly important with fixit hints
-and caret diagnostics, because otherwise you don't get the important context.
-</p>
-
-<pre>
- $ <b>gcc-4.2 t.c</b>
- t.c:3: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
- $ <b>clang t.c</b>
- t.c:3:1: <font color="red">error:</font> unknown type name 'foo_t'
- <font color="darkgreen">foo_t *P = 0;</font>
- <font color="blue">^</font>
-</pre>
-
-<p>This shows an example of much better error recovery. The message coming out
-of GCC is completely useless for diagnosing the problem, Clang tries much harder
-and produces a much more useful diagnosis of the problem.</p>
-
-<pre>
- $ <b>cat t.cc</b>
- template&lt;class T&gt;
- class a {}
- class temp {};
- a&lt;temp&gt; b;
- struct b {
- }
- $ <b>gcc-4.2 t.cc</b>
- t.cc:3: error: multiple types in one declaration
- t.cc:4: error: non-template type 'a' used as a template
- t.cc:4: error: invalid type in declaration before ';' token
- t.cc:6: error: expected unqualified-id at end of input
- $ <b>clang t.cc</b>
- t.cc:2:11: <font color="red">error:</font> expected ';' after class
- <font color="darkgreen">class a {}</font>
- <font color="blue"> ^</font>
- <font color="blue"> ;</font>
- t.cc:6:2: <font color="red">error:</font> expected ';' after struct
- <font color="darkgreen">}</font>
- <font color="blue"> ^</font>
- <font color="blue"> ;</font>
-</pre>
-
-<p>This shows that we recover from the simple case of forgetting a ; after
-a struct definition much better than GCC.</p>
-
-<p>While each of these details is minor, we feel that they all add up to provide
-a much more polished experience.</p>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/distclang_status.html b/contrib/llvm/tools/clang/www/distclang_status.html
deleted file mode 100644
index 26ba314..0000000
--- a/contrib/llvm/tools/clang/www/distclang_status.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Distributed Compilation Support</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <style type="text/css">
-</style>
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<!--*************************************************************************-->
-<h1>Distributed Compilation Support in Clang</h1>
-<!--*************************************************************************-->
-
-<p>
-This page tracks the status of Distributed Compilation support in Clang.<br>
-Currently some basic features are working but the code is under heavy
-development. </p>
-
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/feature-compile1.png b/contrib/llvm/tools/clang/www/feature-compile1.png
deleted file mode 100644
index cec7c48..0000000
--- a/contrib/llvm/tools/clang/www/feature-compile1.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/feature-compile2.png b/contrib/llvm/tools/clang/www/feature-compile2.png
deleted file mode 100644
index 0eb9300..0000000
--- a/contrib/llvm/tools/clang/www/feature-compile2.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/feature-memory1.png b/contrib/llvm/tools/clang/www/feature-memory1.png
deleted file mode 100644
index 29368aa..0000000
--- a/contrib/llvm/tools/clang/www/feature-memory1.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/features.html b/contrib/llvm/tools/clang/www/features.html
deleted file mode 100644
index 6034ae7..0000000
--- a/contrib/llvm/tools/clang/www/features.html
+++ /dev/null
@@ -1,424 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Features and Goals</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <style type="text/css">
-</style>
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<!--*************************************************************************-->
-<h1>Clang - Features and Goals</h1>
-<!--*************************************************************************-->
-
-<p>
-This page describes the <a href="index.html#goals">features and goals</a> of
-Clang in more detail and gives a more broad explanation about what we mean.
-These features are:
-</p>
-
-<p>End-User Features:</p>
-
-<ul>
-<li><a href="#performance">Fast compiles and low memory use</a></li>
-<li><a href="#expressivediags">Expressive diagnostics</a></li>
-<li><a href="#gcccompat">GCC compatibility</a></li>
-</ul>
-
-<p>Utility and Applications:</p>
-
-<ul>
-<li><a href="#libraryarch">Library based architecture</a></li>
-<li><a href="#diverseclients">Support diverse clients</a></li>
-<li><a href="#ideintegration">Integration with IDEs</a></li>
-<li><a href="#license">Use the LLVM 'BSD' License</a></li>
-</ul>
-
-<p>Internal Design and Implementation:</p>
-
-<ul>
-<li><a href="#real">A real-world, production quality compiler</a></li>
-<li><a href="#simplecode">A simple and hackable code base</a></li>
-<li><a href="#unifiedparser">A single unified parser for C, Objective C, C++,
- and Objective C++</a></li>
-<li><a href="#conformance">Conformance with C/C++/ObjC and their
- variants</a></li>
-</ul>
-
-<!--*************************************************************************-->
-<h2><a name="enduser">End-User Features</a></h2>
-<!--*************************************************************************-->
-
-
-<!--=======================================================================-->
-<h3><a name="performance">Fast compiles and Low Memory Use</a></h3>
-<!--=======================================================================-->
-
-<p>A major focus of our work on clang is to make it fast, light and scalable.
-The library-based architecture of clang makes it straight-forward to time and
-profile the cost of each layer of the stack, and the driver has a number of
-options for performance analysis.</p>
-
-<p>While there is still much that can be done, we find that the clang front-end
-is significantly quicker than gcc and uses less memory For example, when
-compiling "Carbon.h" on Mac OS/X, we see that clang is 2.5x faster than GCC:</p>
-
-<img class="img_slide" src="feature-compile1.png" width="400" height="300" />
-
-<p>Carbon.h is a monster: it transitively includes 558 files, 12.3M of code,
-declares 10000 functions, has 2000 struct definitions, 8000 fields, 20000 enum
-constants, etc (see slide 25+ of the <a href="clang_video-07-25-2007.html">clang
-talk</a> for more information). It is also #include'd into almost every C file
-in a GUI app on the Mac, so its compile time is very important.</p>
-
-<p>From the slide above, you can see that we can measure the time to preprocess
-the file independently from the time to parse it, and independently from the
-time to build the ASTs for the code. GCC doesn't provide a way to measure the
-parser without AST building (it only provides -fsyntax-only). In our
-measurements, we find that clang's preprocessor is consistently 40% faster than
-GCCs, and the parser + AST builder is ~4x faster than GCC's. If you have
-sources that do not depend as heavily on the preprocessor (or if you
-use Precompiled Headers) you may see a much bigger speedup from clang.
-</p>
-
-<p>Compile time performance is important, but when using clang as an API, often
-memory use is even moreso: the less memory the code takes the more code you can
-fit into memory at a time (useful for whole program analysis tools, for
-example).</p>
-
-<img class="img_slide" src="feature-memory1.png" width="400" height="300" />
-
-<p>Here we see a huge advantage of clang: its ASTs take <b>5x less memory</b>
-than GCC's syntax trees, despite the fact that clang's ASTs capture far more
-source-level information than GCC's trees do. This feat is accomplished through
-the use of carefully designed APIs and efficient representations.</p>
-
-<p>In addition to being efficient when pitted head-to-head against GCC in batch
-mode, clang is built with a <a href="#libraryarch">library based
-architecture</a> that makes it relatively easy to adapt it and build new tools
-with it. This means that it is often possible to apply out-of-the-box thinking
-and novel techniques to improve compilation in various ways.</p>
-
-<img class="img_slide" src="feature-compile2.png" width="400" height="300" />
-
-<p>This slide shows how the clang preprocessor can be used to make "distcc"
-parallelization <b>3x</b> more scalable than when using the GCC preprocessor.
-"distcc" quickly bottlenecks on the preprocessor running on the central driver
-machine, so a fast preprocessor is very useful. Comparing the first two bars
-of each group shows how a ~40% faster preprocessor can reduce preprocessing time
-of these large C++ apps by about 40% (shocking!).</p>
-
-<p>The third bar on the slide is the interesting part: it shows how trivial
-caching of file system accesses across invocations of the preprocessor allows
-clang to reduce time spent in the kernel by 10x, making distcc over 3x more
-scalable. This is obviously just one simple hack, doing more interesting things
-(like caching tokens across preprocessed files) would yield another substantial
-speedup.</p>
-
-<p>The clean framework-based design of clang means that many things are possible
-that would be very difficult in other systems, for example incremental
-compilation, multithreading, intelligent caching, etc. We are only starting
-to tap the full potential of the clang design.</p>
-
-
-<!--=======================================================================-->
-<h3><a name="expressivediags">Expressive Diagnostics</a></h3>
-<!--=======================================================================-->
-
-<p>In addition to being fast and functional, we aim to make Clang extremely user
-friendly. As far as a command-line compiler goes, this basically boils down to
-making the diagnostics (error and warning messages) generated by the compiler
-be as useful as possible. There are several ways that we do this, but the
-most important are pinpointing exactly what is wrong in the program,
-highlighting related information so that it is easy to understand at a glance,
-and making the wording as clear as possible.</p>
-
-<p>Here is one simple example that illustrates the difference between a typical
-GCC and Clang diagnostic:</p>
-
-<pre>
- $ <b>gcc-4.2 -fsyntax-only t.c</b>
- t.c:7: error: invalid operands to binary + (have 'int' and 'struct A')
- $ <b>clang -fsyntax-only t.c</b>
- t.c:7:39: error: invalid operands to binary expression ('int' and 'struct A')
- <font color="darkgreen"> return y + func(y ? ((SomeA.X + 40) + SomeA) / 42 + SomeA.X : SomeA.X);</font>
- <font color="blue"> ~~~~~~~~~~~~~~ ^ ~~~~~</font>
-</pre>
-
-<p>Here you can see that you don't even need to see the original source code to
-understand what is wrong based on the Clang error: Because clang prints a
-caret, you know exactly <em>which</em> plus it is complaining about. The range
-information highlights the left and right side of the plus which makes it
-immediately obvious what the compiler is talking about, which is very useful for
-cases involving precedence issues and many other situations.</p>
-
-<p>Clang diagnostics are very polished and have many features. For more
-information and examples, please see the <a href="diagnostics.html">Expressive
-Diagnostics</a> page.</p>
-
-<!--=======================================================================-->
-<h3><a name="gcccompat">GCC Compatibility</a></h3>
-<!--=======================================================================-->
-
-<p>GCC is currently the defacto-standard open source compiler today, and it
-routinely compiles a huge volume of code. GCC supports a huge number of
-extensions and features (many of which are undocumented) and a lot of
-code and header files depend on these features in order to build.</p>
-
-<p>While it would be nice to be able to ignore these extensions and focus on
-implementing the language standards to the letter, pragmatics force us to
-support the GCC extensions that see the most use. Many users just want their
-code to compile, they don't care to argue about whether it is pedantically C99
-or not.</p>
-
-<p>As mentioned above, all
-extensions are explicitly recognized as such and marked with extension
-diagnostics, which can be mapped to warnings, errors, or just ignored.
-</p>
-
-
-<!--*************************************************************************-->
-<h2><a name="applications">Utility and Applications</a></h2>
-<!--*************************************************************************-->
-
-<!--=======================================================================-->
-<h3><a name="libraryarch">Library Based Architecture</a></h3>
-<!--=======================================================================-->
-
-<p>A major design concept for clang is its use of a library-based
-architecture. In this design, various parts of the front-end can be cleanly
-divided into separate libraries which can then be mixed up for different needs
-and uses. In addition, the library-based approach encourages good interfaces
-and makes it easier for new developers to get involved (because they only need
-to understand small pieces of the big picture).</p>
-
-<blockquote>
-"The world needs better compiler tools, tools which are built as libraries.
-This design point allows reuse of the tools in new and novel ways. However,
-building the tools as libraries isn't enough: they must have clean APIs, be as
-decoupled from each other as possible, and be easy to modify/extend. This
-requires clean layering, decent design, and keeping the libraries independent of
-any specific client."</blockquote>
-
-<p>
-Currently, clang is divided into the following libraries and tool:
-</p>
-
-<ul>
-<li><b>libsupport</b> - Basic support library, from LLVM.</li>
-<li><b>libsystem</b> - System abstraction library, from LLVM.</li>
-<li><b>libbasic</b> - Diagnostics, SourceLocations, SourceBuffer abstraction,
- file system caching for input source files.</li>
-<li><b>libast</b> - Provides classes to represent the C AST, the C type system,
- builtin functions, and various helpers for analyzing and manipulating the
- AST (visitors, pretty printers, etc).</li>
-<li><b>liblex</b> - Lexing and preprocessing, identifier hash table, pragma
- handling, tokens, and macro expansion.</li>
-<li><b>libparse</b> - Parsing. This library invokes coarse-grained 'Actions'
- provided by the client (e.g. libsema builds ASTs) but knows nothing about
- ASTs or other client-specific data structures.</li>
-<li><b>libsema</b> - Semantic Analysis. This provides a set of parser actions
- to build a standardized AST for programs.</li>
-<li><b>libcodegen</b> - Lower the AST to LLVM IR for optimization &amp; code
- generation.</li>
-<li><b>librewrite</b> - Editing of text buffers (important for code rewriting
- transformation, like refactoring).</li>
-<li><b>libanalysis</b> - Static analysis support.</li>
-<li><b><a href="docs/libIndex.html">libindex</a></b> - Cross-translation-unit infrastructure and indexing support.</li>
-<li><b>clang</b> - A driver program, client of the libraries at various
- levels.</li>
-</ul>
-
-<p>As an example of the power of this library based design.... If you wanted to
-build a preprocessor, you would take the Basic and Lexer libraries. If you want
-an indexer, you would take the previous two and add the Parser library and
-some actions for indexing. If you want a refactoring, static analysis, or
-source-to-source compiler tool, you would then add the AST building and
-semantic analyzer libraries.</p>
-
-<p>For more information about the low-level implementation details of the
-various clang libraries, please see the <a href="docs/InternalsManual.html">
-clang Internals Manual</a>.</p>
-
-<!--=======================================================================-->
-<h3><a name="diverseclients">Support Diverse Clients</a></h3>
-<!--=======================================================================-->
-
-<p>Clang is designed and built with many grand plans for how we can use it. The
-driving force is the fact that we use C and C++ daily, and have to suffer due to
-a lack of good tools available for it. We believe that the C and C++ tools
-ecosystem has been significantly limited by how difficult it is to parse and
-represent the source code for these languages, and we aim to rectify this
-problem in clang.</p>
-
-<p>The problem with this goal is that different clients have very different
-requirements. Consider code generation, for example: a simple front-end that
-parses for code generation must analyze the code for validity and emit code
-in some intermediate form to pass off to a optimizer or backend. Because
-validity analysis and code generation can largely be done on the fly, there is
-not hard requirement that the front-end actually build up a full AST for all
-the expressions and statements in the code. TCC and GCC are examples of
-compilers that either build no real AST (in the former case) or build a stripped
-down and simplified AST (in the later case) because they focus primarily on
-codegen.</p>
-
-<p>On the opposite side of the spectrum, some clients (like refactoring) want
-highly detailed information about the original source code and want a complete
-AST to describe it with. Refactoring wants to have information about macro
-expansions, the location of every paren expression '(((x)))' vs 'x', full
-position information, and much more. Further, refactoring wants to look
-<em>across the whole program</em> to ensure that it is making transformations
-that are safe. Making this efficient and getting this right requires a
-significant amount of engineering and algorithmic work that simply are
-unnecessary for a simple static compiler.</p>
-
-<p>The beauty of the clang approach is that it does not restrict how you use it.
-In particular, it is possible to use the clang preprocessor and parser to build
-an extremely quick and light-weight on-the-fly code generator (similar to TCC)
-that does not build an AST at all. As an intermediate step, clang supports
-using the current AST generation and semantic analysis code and having a code
-generation client free the AST for each function after code generation. Finally,
-clang provides support for building and retaining fully-fledged ASTs, and even
-supports writing them out to disk.</p>
-
-<p>Designing the libraries with clean and simple APIs allows these high-level
-policy decisions to be determined in the client, instead of forcing "one true
-way" in the implementation of any of these libraries. Getting this right is
-hard, and we don't always get it right the first time, but we fix any problems
-when we realize we made a mistake.</p>
-
-<!--=======================================================================-->
-<h3><a name="ideintegration">Integration with IDEs</h3>
-<!--=======================================================================-->
-
-<p>
-We believe that Integrated Development Environments (IDE's) are a great way
-to pull together various pieces of the development puzzle, and aim to make clang
-work well in such an environment. The chief advantage of an IDE is that they
-typically have visibility across your entire project and are long-lived
-processes, whereas stand-alone compiler tools are typically invoked on each
-individual file in the project, and thus have limited scope.</p>
-
-<p>There are many implications of this difference, but a significant one has to
-do with efficiency and caching: sharing an address space across different files
-in a project, means that you can use intelligent caching and other techniques to
-dramatically reduce analysis/compilation time.</p>
-
-<p>A further difference between IDEs and batch compiler is that they often
-impose very different requirements on the front-end: they depend on high
-performance in order to provide a "snappy" experience, and thus really want
-techniques like "incremental compilation", "fuzzy parsing", etc. Finally, IDEs
-often have very different requirements than code generation, often requiring
-information that a codegen-only frontend can throw away. Clang is
-specifically designed and built to capture this information.
-</p>
-
-
-<!--=======================================================================-->
-<h3><a name="license">Use the LLVM 'BSD' License</a></h3>
-<!--=======================================================================-->
-
-<p>We actively indend for clang (and a LLVM as a whole) to be used for
-commercial projects, and the BSD license is the simplest way to allow this. We
-feel that the license encourages contributors to pick up the source and work
-with it, and believe that those individuals and organizations will contribute
-back their work if they do not want to have to maintain a fork forever (which is
-time consuming and expensive when merges are involved). Further, nobody makes
-money on compilers these days, but many people need them to get bigger goals
-accomplished: it makes sense for everyone to work together.</p>
-
-<p>For more information about the LLVM/clang license, please see the <a
-href="http://llvm.org/docs/DeveloperPolicy.html#license">LLVM License
-Description</a> for more information.</p>
-
-
-
-<!--*************************************************************************-->
-<h2><a name="design">Internal Design and Implementation</a></h2>
-<!--*************************************************************************-->
-
-<!--=======================================================================-->
-<h3><a name="real">A real-world, production quality compiler</a></h3>
-<!--=======================================================================-->
-
-<p>
-Clang is designed and built by experienced compiler developers who
-are increasingly frustrated with the problems that <a
-href="comparison.html">existing open source compilers</a> have. Clang is
-carefully and thoughtfully designed and built to provide the foundation of a
-whole new generation of C/C++/Objective C development tools, and we intend for
-it to be production quality.</p>
-
-<p>Being a production quality compiler means many things: it means being high
-performance, being solid and (relatively) bug free, and it means eventually
-being used and depended on by a broad range of people. While we are still in
-the early development stages, we strongly believe that this will become a
-reality.</p>
-
-<!--=======================================================================-->
-<h3><a name="simplecode">A simple and hackable code base</a></h3>
-<!--=======================================================================-->
-
-<p>Our goal is to make it possible for anyone with a basic understanding
-of compilers and working knowledge of the C/C++/ObjC languages to understand and
-extend the clang source base. A large part of this falls out of our decision to
-make the AST mirror the languages as closely as possible: you have your friendly
-if statement, for statement, parenthesis expression, structs, unions, etc, all
-represented in a simple and explicit way.</p>
-
-<p>In addition to a simple design, we work to make the source base approachable
-by commenting it well, including citations of the language standards where
-appropriate, and designing the code for simplicity. Beyond that, clang offers
-a set of AST dumpers, printers, and visualizers that make it easy to put code in
-and see how it is represented.</p>
-
-<!--=======================================================================-->
-<h3><a name="unifiedparser">A single unified parser for C, Objective C, C++,
-and Objective C++</a></h3>
-<!--=======================================================================-->
-
-<p>Clang is the "C Language Family Front-end", which means we intend to support
-the most popular members of the C family. We are convinced that the right
-parsing technology for this class of languages is a hand-built recursive-descent
-parser. Because it is plain C++ code, recursive descent makes it very easy for
-new developers to understand the code, it easily supports ad-hoc rules and other
-strange hacks required by C/C++, and makes it straight-forward to implement
-excellent diagnostics and error recovery.</p>
-
-<p>We believe that implementing C/C++/ObjC in a single unified parser makes the
-end result easier to maintain and evolve than maintaining a separate C and C++
-parser which must be bugfixed and maintained independently of each other.</p>
-
-<!--=======================================================================-->
-<h3><a name="conformance">Conformance with C/C++/ObjC and their
- variants</a></h3>
-<!--=======================================================================-->
-
-<p>When you start work on implementing a language, you find out that there is a
-huge gap between how the language works and how most people understand it to
-work. This gap is the difference between a normal programmer and a (scary?
-super-natural?) "language lawyer", who knows the ins and outs of the language
-and can grok standardese with ease.</p>
-
-<p>In practice, being conformant with the languages means that we aim to support
-the full language, including the dark and dusty corners (like trigraphs,
-preprocessor arcana, C99 VLAs, etc). Where we support extensions above and
-beyond what the standard officially allows, we make an effort to explicitly call
-this out in the code and emit warnings about it (which are disabled by default,
-but can optionally be mapped to either warnings or errors), allowing you to use
-clang in "strict" mode if you desire.</p>
-
-<p>We also intend to support "dialects" of these languages, such as C89, K&amp;R
-C, C++'03, Objective-C 2, etc.</p>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/get_involved.html b/contrib/llvm/tools/clang/www/get_involved.html
deleted file mode 100644
index a383d70..0000000
--- a/contrib/llvm/tools/clang/www/get_involved.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Get Involved</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<h1>Getting Involved with the Clang Project</h1>
-
-<p>Once you have <a href="get_started.html">checked out and built</a> clang and
-played around with it, you might be wondering what you can do to make it better
-and contribute to its development. Alternatively, maybe you just want to follow
-the development of the project to see it progress.
-</p>
-
-<h2>Follow what's going on</h2>
-
-<p>Clang is a subproject of the <a href="http://llvm.org">LLVM Project</a>, but
-has its own mailing lists because the communities have people with different
-interests. The two clang lists are:</p>
-
-<ul>
-<li><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commits
-</a> - This list is for patch submission/discussion.</li>
-
-<li><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev</a> -
-This list is for everything else clang related (questions and answers, bug
-reports, etc).</li>
-
-</ul>
-
-<p>If you are interested in clang only, these two lists should be all
-you need. If you are interested in the LLVM optimizer and code generator,
-please consider signing up for <a
-href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">llvmdev</a> and <a
-href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">llvm-commits</a>
-as well.</p>
-
-
-<p>The best way to talk with other developers on the project is through the <a
-href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev mailing
-list</a>. The clang mailing list is a very friendly place and we welcome
-newcomers. In addition to the cfe-dev list, a significant amount of design
-discussion takes place on the <a
-href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commits mailing
-list</a>. All of these lists have archives, so you can browse through previous
-discussions or follow the list development on the web if you prefer.</p>
-
-<p>If you're looking for something to work on, check out our <a href="OpenProjects.html">Open Projects</a> page or go look through the <a href="http://llvm.org/bugs/">Bugzilla bug database.</p>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/get_started.html b/contrib/llvm/tools/clang/www/get_started.html
deleted file mode 100644
index 96979af..0000000
--- a/contrib/llvm/tools/clang/www/get_started.html
+++ /dev/null
@@ -1,275 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Getting Started</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<h1>Getting Started: Building and Running Clang</h1>
-
-<p>This page gives you the shortest path to checking out Clang and demos a few
-options. This should get you up and running with the minimum of muss and fuss.
-If you like what you see, please consider <a href="get_involved.html">getting
-involved</a> with the Clang community. If you run into problems, please file
-bugs in <a href="http://llvm.org/bugs/">LLVM Bugzilla</a> or bring up the issue
-on the
-<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">Clang development
-mailing list</a>.</p>
-
-<h2 id="build">Building Clang and Working with the Code</h2>
-
-<h3 id="buildNix">On Unix-like Systems</h3>
-
-<p>If you would like to check out and build Clang, the current procedure is as
-follows:</p>
-
-<ol>
- <li>Get the required tools.
- <ul>
- <li>See
- <a href="http://llvm.org/docs/GettingStarted.html#requirements">
- Getting Started with the LLVM System - Requirements</a>.</li>
- <li>Note also that Python is needed for running the test suite.
- Get it at: <a href="http://www.python.org/download">
- http://www.python.org/download</a></li>
- </ul>
-
- <li>Checkout LLVM:</li>
- <ul>
- <li>Change directory to where you want the llvm directory placed.</li>
- <li><tt>svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm</tt></li>
- </ul>
- <li>Checkout Clang:</li>
- <ul>
- <li><tt>cd llvm/tools</tt>
- <li><tt>svn co http://llvm.org/svn/llvm-project/cfe/trunk clang</tt></li>
- </ul>
- <li>Build LLVM and Clang:</li>
- <ul>
- <li><tt>cd ..</tt> (back to llvm)</li>
- <li><tt>./configure</tt></li>
- <li><tt>make</tt></li>
- <li>This builds both LLVM and Clang for debug mode.</li>
- <li>Note: For subsequent Clang development, you can just do make at the
- clang directory level.</li>
- </ul>
-
- <p>It is also possible to use CMake instead of the makefiles. With CMake it
- is also possible to generate project files for several IDEs: Eclipse CDT4,
- CodeBlocks, Qt-Creator (use the CodeBlocks generator), KDevelop3.</p>
-
- <li>If you intend to work on Clang C++ support, you may need to tell it how
- to find your C++ standard library headers. If Clang cannot find your
- system libstdc++ headers, please follow these instructions:</li>
- <ul>
- <li>'<tt>gcc -v -x c++ /dev/null -fsyntax-only</tt>' to get the
- path.</li>
- <li>Look for the comment "FIXME: temporary hack:
- hard-coded paths" in <tt>clang/lib/Frontend/InitHeaderSearch.cpp</tt> and
- change the lines below to include that path.</li>
- </ul>
- <li>Try it out (assuming you add llvm/Debug/bin to your path):</li>
- <ul>
- <li><tt>clang --help</tt></li>
- <li><tt>clang file.c -fsyntax-only</tt> (check for correctness)</li>
- <li><tt>clang file.c -S -emit-llvm -o -</tt> (print out unoptimized llvm code)</li>
- <li><tt>clang file.c -S -emit-llvm -o - -O3</tt></li>
- <li><tt>clang file.c -S -O3 -o -</tt> (output native machine code)</li>
- </ul>
-</ol>
-
-<p>Note that the C front-end uses LLVM, but does not depend on llvm-gcc. If you
-encounter problems with building Clang, make sure you have the latest SVN
-version of LLVM. LLVM contains support libraries for Clang that will be updated
-as well as development on Clang progresses.</p>
-
-<h3>Simultaneously Building Clang and LLVM:</h3>
-
-<p>Once you have checked out Clang into the llvm source tree it will build along
-with the rest of <tt>llvm</tt>. To build all of LLVM and Clang together all at
-once simply run <tt>make</tt> from the root LLVM directory.</p>
-
-<p><em>Note:</em> Observe that Clang is technically part of a separate
-Subversion repository. As mentioned above, the latest Clang sources are tied to
-the latest sources in the LLVM tree. You can update your toplevel LLVM project
-and all (possibly unrelated) projects inside it with <tt><b>make
-update</b></tt>. This will run <tt>svn update</tt> on all subdirectories related
-to subversion. </p>
-
-<h3 id="buildWindows">Using Visual Studio</h3>
-
-<p>The following details setting up for and building Clang on Windows using
-Visual Studio:</p>
-
-<ol>
- <li>Get the required tools:</li>
- <ul>
- <li><b>Subversion</b>. Source code control program. Get it from:
- <a href="http://subversion.tigris.org/getting.html">
- http://subversion.tigris.org/getting.html</a></li>
- <li><b>cmake</b>. This is used for generating Visual Studio solution and
- project files. Get it from:
- <a href="http://www.cmake.org/cmake/resources/software.html">
- http://www.cmake.org/cmake/resources/software.html</a></li>
- <li><b>Visual Studio 2005 or 2008</b></li>
- <li><b>Python</b>. This is needed only if you will be running the tests
- (which is essential, if you will be developing for clang).
- Get it from:
- <a href="http://www.python.org/download">
- http://www.python.org/download</a></li>
- <li><b>GnuWin32 tools</b>
- These are also necessary for running the tests.
- (Note that the grep from MSYS or Cygwin doesn't work with the tests
- because of embedded double-quotes in the search strings. The GNU
- grep does work in this case.)
- Get them from <a href="http://getgnuwin32.sourceforge.net">
- http://getgnuwin32.sourceforge.net</a>.</li>
- </ul>
-
- <li>Checkout LLVM:</li>
- <ul>
- <li><tt>svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm</tt></li>
- </ul>
- <li>Checkout Clang:</li>
- <ul>
- <li><tt>cd llvm\tools</tt>
- <li><tt>svn co http://llvm.org/svn/llvm-project/cfe/trunk clang</tt></li>
- </ul>
- <li>Run cmake to generate the Visual Studio solution and project files:</li>
- <ul>
- <li><tt>cd ..</tt> (Change directory back to the llvm top.)</li>
- <li>If you are using Visual Studio 2005: <tt>cmake .</tt></li>
- <li>Or if you are using Visual Studio 2008: <tt>cmake -G "Visual Studio 9 2008" .</tt></li>
- <li>The above, if successful, will have created an LLVM.sln file in the
- llvm directory.
- </ul>
- <li>Build Clang:</li>
- <ul>
- <li>Open LLVM.sln in Visual Studio.</li>
- <li>Build the "clang" project for just the compiler driver and front end, or
- the "ALL_BUILD" project to build everything, including tools.</li>
- </ul>
- <li>Try it out (assuming you added llvm/debug/bin to your path). (See the
- running examples from above.)</li>
- <li>See <a href="hacking.html#testingWindows">
- Hacking on clang - Testing using Visual Studio on Windows</a> for information
- on running regression tests on Windows.</li>
-</ol>
-
-<p>Note that once you have checked out both llvm and clang, to synchronize
-to the latest code base, use the <tt>svn update</tt> command in both the
-llvm and llvm\tools\clang directories, as they are separate repositories.</p>
-
-<a name="driver"><h2>Clang Compiler Driver (Drop-in Substitute for GCC)</h2></a>
-
-<p>The <tt>clang</tt> tool is the compiler driver and front-end, which is
-designed to be a drop-in replacement for the <tt>gcc</tt> command. Here are
-some examples of how to use the high-level driver:
-</p>
-
-<pre class="code">
-$ <b>cat t.c</b>
-#include &lt;stdio.h&gt;
-int main(int argc, char **argv) { printf("hello world\n"); }
-$ <b>clang t.c</b>
-$ <b>./a.out</b>
-hello world
-</pre>
-
-<p>The 'clang' driver is designed to work as closely to GCC as possible to
- maximize portability. The only major difference between the two is that
- Clang defaults to gnu99 mode while GCC defaults to gnu89 mode. If you see
- weird link-time errors relating to inline functions, try passing -std=gnu89
- to clang.</p>
-
-<h2>Examples of using Clang</h2>
-
-<!-- Thanks to
- http://shiflett.org/blog/2006/oct/formatting-and-highlighting-php-code-listings
-Site suggested using pre in CSS, but doesn't work in IE, so went for the <pre>
-tag. -->
-
-<pre class="code">
-$ <b>cat ~/t.c</b>
-typedef float V __attribute__((vector_size(16)));
-V foo(V a, V b) { return a+b*a; }
-</pre>
-
-
-<h3>Preprocessing:</h3>
-
-<pre class="code">
-$ <b>clang ~/t.c -E</b>
-# 1 "/Users/sabre/t.c" 1
-
-typedef float V __attribute__((vector_size(16)));
-
-V foo(V a, V b) { return a+b*a; }
-</pre>
-
-
-<h3>Type checking:</h3>
-
-<pre class="code">
-$ <b>clang -fsyntax-only ~/t.c</b>
-</pre>
-
-
-<h3>GCC options:</h3>
-
-<pre class="code">
-$ <b>clang -fsyntax-only ~/t.c -pedantic</b>
-/Users/sabre/t.c:2:17: warning: extension used
-typedef float V __attribute__((vector_size(16)));
- ^
-1 diagnostic generated.
-</pre>
-
-
-<h3>Pretty printing from the AST:</h3>
-
-<p>Note, the <tt>-cc1</tt> argument indicates the the compiler front-end, and
-not the driver, should be run. The compiler front-end has several additional
-Clang specific features which are not exposed through the GCC compatible driver
-interface.</p>
-
-<pre class="code">
-$ <b>clang -cc1 ~/t.c -ast-print</b>
-typedef float V __attribute__(( vector_size(16) ));
-V foo(V a, V b) {
- return a + b * a;
-}
-</pre>
-
-
-<h3>Code generation with LLVM:</h3>
-
-<pre class="code">
-$ <b>clang ~/t.c -S -emit-llvm -o -</b>
-define &lt;4 x float&gt; @foo(&lt;4 x float&gt; %a, &lt;4 x float&gt; %b) {
-entry:
- %mul = mul &lt;4 x float&gt; %b, %a
- %add = add &lt;4 x float&gt; %mul, %a
- ret &lt;4 x float&gt; %add
-}
-$ <b>clang -fomit-frame-pointer -O3 -S -o - t.c</b> <i># On x86_64</i>
-...
-_foo:
-Leh_func_begin1:
- mulps %xmm0, %xmm1
- addps %xmm1, %xmm0
- ret
-Leh_func_end1:
-</pre>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/hacking.html b/contrib/llvm/tools/clang/www/hacking.html
deleted file mode 100644
index 3bbc0ea..0000000
--- a/contrib/llvm/tools/clang/www/hacking.html
+++ /dev/null
@@ -1,270 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Hacking on clang</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
-</head>
-<body>
-<!--#include virtual="menu.html.incl"-->
-<div id="content">
- <!--*********************************************************************-->
- <h1>Hacking on Clang</h1>
- <!--*********************************************************************-->
-
- <p>This document provides some hints for how to get started hacking
- on Clang for developers who are new to the Clang and/or LLVM
- codebases.</p>
- <ul>
- <li><a href="#style">Coding Standards</a></li>
- <li><a href="#docs">Developer Documentation</a></li>
- <li><a href="#debugging">Debugging</a></li>
- <li><a href="#testing">Testing</a></li>
- <ul>
- <li><a href="#testingNonWindows">Testing on Unix-like Systems</a></li>
- <li><a href="#testingWindows">Testing using Visual Studio on Windows</a></li>
- </ul>
- <li><a href="#patches">Creating Patch Files</a></li>
- <li><a href="#irgen">LLVM IR Generation</a></li>
- </ul>
-
- <!--=====================================================================-->
- <h2 id="docs">Coding Standards</h2>
- <!--=====================================================================-->
-
- <p>Clang follows the
- LLVM <a href="http://llvm.org/docs/CodingStandards.html">Coding
- Standards</a>. When submitting patches, please take care to follow these standards
- and to match the style of the code to that present in Clang (for example, in
- terms of indentation, bracing, and statement spacing).</p>
-
- <p>Clang has a few additional coding standards:</p>
- <ul>
- <li><i>cstdio is forbidden</i>: library code should not output diagnostics
- or other information using <tt>cstdio</tt>; debugging routines should
- use <tt>llvm::errs()</tt>. Other uses of <tt>cstdio</tt> impose behavior
- upon clients and block integrating Clang as a library. Libraries should
- support <tt>raw_ostream</tt> based interfaces for textual
- output. See <a href="http://llvm.org/docs/CodingStandards.html#ll_raw_ostream">Coding
- Standards</a>.</li>
- </ul>
-
- <!--=====================================================================-->
- <h2 id="docs">Developer Documentation</h2>
- <!--=====================================================================-->
-
- <p>Both Clang and LLVM use doxygen to provide API documentation. Their
- respective web pages (generated nightly) are here:</p>
- <ul>
- <li><a href="http://clang.llvm.org/doxygen">Clang</a></li>
- <li><a href="http://llvm.org/doxygen">LLVM</a></li>
- </ul>
-
- <p>For work on the LLVM IR generation, the LLVM assembly language
- <a href="http://llvm.org/docs/LangRef.html">reference manual</a> is
- also useful.</p>
-
- <!--=====================================================================-->
- <h2 id="debugging">Debugging</h2>
- <!--=====================================================================-->
-
- <p>Inspecting data structures in a debugger:</p>
- <ul>
- <li>Many LLVM and Clang data structures provide
- a <tt>dump()</tt> method which will print a description of the
- data structure to <tt>stderr</tt>.</li>
- <li>The <a href="docs/InternalsManual.html#QualType"><tt>QualType</tt></a>
- structure is used pervasively. This is a simple value class for
- wrapping types with qualifiers; you can use
- the <tt>isConstQualified()</tt>, for example, to get one of the
- qualifiers, and the <tt>getTypePtr()</tt> method to get the
- wrapped <tt>Type*</tt> which you can then dump.</li>
- </ul>
-
- <!--=====================================================================-->
- <h2 id="testing">Testing</h2>
- <!--=====================================================================-->
-
- <p><i>[Note: The test running mechanism is currently under revision, so the
- following might change shortly.]</i></p>
-
- <!--=====================================================================-->
- <h3 id="testingNonWindows">Testing on Unix-like Systems</h3>
- <!--=====================================================================-->
-
- <p>Clang includes a basic regression suite in the tree which can be
- run with <tt>make test</tt> from the top-level clang directory, or
- just <tt>make</tt> in the <em>test</em> sub-directory.
- <tt>make VERBOSE=1</tt> can be used to show more detail
- about what is being run.</p>
-
- <p>The tests primarily consist of a test runner script running the compiler
- under test on individual test files grouped in the directories under the
- test directory. The individual test files include comments at the
- beginning indicating the Clang compile options to use, to be read
- by the test runner. Embedded comments also can do things like telling
- the test runner that an error is expected at the current line.
- Any output files produced by the test will be placed under
- a created Output directory.</p>
-
- <p>During the run of <tt>make test</tt>, the terminal output will
- display a line similar to the following:</p>
-
- <ul><tt>--- Running clang tests for i686-pc-linux-gnu ---</tt></ul>
-
- <p>followed by a line continually overwritten with the current test
- file being compiled, and an overall completion percentage.</p>
-
- <p>After the <tt>make test</tt> run completes, the absence of any
- <tt>Failing Tests (count):</tt> message indicates that no tests
- failed unexpectedly. If any tests did fail, the
- <tt>Failing Tests (count):</tt> message will be followed by a list
- of the test source file paths that failed. For example:</p>
-
- <tt><pre>
- Failing Tests (3):
- /home/john/llvm/tools/clang/test/SemaCXX/member-name-lookup.cpp
- /home/john/llvm/tools/clang/test/SemaCXX/namespace-alias.cpp
- /home/john/llvm/tools/clang/test/SemaCXX/using-directive.cpp
- </pre></tt>
-
- <p>If you used the <tt>make VERBOSE=1</tt> option, the terminal
- output will reflect the error messages from the compiler and
- test runner.</p>
-
- <p>The regression suite can also be run with Valgrind by running
- <tt>make test VG=1</tt> in the top-level clang directory.</p>
-
- <p>For more intensive changes, running
- the <a href="http://llvm.org/docs/TestingGuide.html#testsuiterun">LLVM
- Test Suite</a> with clang is recommended. Currently the best way to
- override LLVMGCC, as in: <tt>make LLVMGCC="clang -std=gnu89"
- TEST=nightly report</tt> (make sure <tt>clang</tt> is in your PATH or use the
- full path).</p>
-
- <!--=====================================================================-->
- <h3 id="testingWindows">Testing using Visual Studio on Windows</h3>
- <!--=====================================================================-->
-
- <p>The Clang test suite can be run from either Visual Studio or
- the command line.</p>
-
- <p>Note that the test runner is based on
- Python, which must be installed. Find Python at:
- <a href="http://www.python.org/download">http://www.python.org/download</a>.
- Download the latest stable version (2.6.2 at the time of this writing).</p>
-
- <p>The GnuWin32 tools are also necessary for running the tests.
- (Note that the grep from MSYS or Cygwin doesn't work with the tests
- because of embedded double-quotes in the search strings. The GNU
- grep does work in this case.)
- Get them from <a href="http://getgnuwin32.sourceforge.net">
- http://getgnuwin32.sourceforge.net</a>.</p>
-
- <p>The cmake build tool is set up to create Visual Studio project files
- for running the tests, "clang-test" being the root. Therefore, to
- run the test from Visual Studio, right-click the clang-test project
- and select "Build".</p>
-
- <p>To run all the tests from the command line, execute a command like
- the following:</p>
-
- <tt>
- python (path to llvm)/llvm/utils/lit/lit.py -sv --no-progress-bar
- (path to llvm)/llvm/tools/clang/test
- </tt>
-
- <p>To run a single test:</p>
-
- <tt>
- python (path to llvm)/llvm/utils/lit/lit.py -sv --no-progress-bar
- (path to llvm)/llvm/tools/clang/test/(dir)/(test)
- </tt>
-
- <p>For example:</p>
-
- <tt>
- python C:/Tools/llvm/utils/lit/lit.py -sv --no-progress-bar
- C:/Tools/llvm/tools/clang/test/Sema/wchar.c
- </tt>
-
- <p>The -sv option above tells the runner to show the test output if
- any tests failed, to help you determine the cause of failure.</p>
-
- <p>Note that a few tests currently fail on Windows. We are working to
- correct this. Therefore your output might look something like this:</p>
-
-<tt><pre>lit.py: lit.cfg:152: note: using clang: 'C:/Tools/llvm/bin/Debug\\clang.EXE'
--- Testing: 1723 tests, 2 threads --
-FAIL: Clang::(test path) (659 of 1723)
-******************** TEST 'Clang::(test path)' FAILED ********************
-Script:
- (commands run)
-Command Output (stdout):
- (output here)
-Command Output (stderr):
- (output here)
-********************
-Testing Time: 83.66s
-********************
-Failing Tests (1):
- Clang::(test path)
- Expected Passes : 1704
- Expected Failures : 18
- Unexpected Failures: 1
-</pre></tt>
-
- <p>The last statistic, "Unexpected Failures", is the important one.</p>
-
- <!--=====================================================================-->
- <h2 id="patches">Creating Patch Files</h2>
- <!--=====================================================================-->
-
- <p>To return changes to the Clang team, unless you have checkin
- privileges, the prefered way is to send patch files to the
- cfe-commits mailing list, with an explanation of what the patch is for.
- Or, if you have questions, or want to have a wider discussion of what
- you are doing, such as if you are new to Clang development, you can use
- the cfe-dev mailing list also.
- </p>
-
- <p>To create these patch files, change directory
- to the llvm/tools/clang root and run:</p>
-
- <ul><tt>svn diff (relative path) >(patch file name)</tt></ul>
-
- <p>For example, for getting the diffs of all of clang:</p>
-
- <ul><tt>svn diff . >~/mypatchfile.patch</tt></ul>
-
- <p>For example, for getting the diffs of a single file:</p>
-
- <ul><tt>svn diff lib/Parse/ParseDeclCXX.cpp >~/ParseDeclCXX.patch</tt></ul>
-
- <p>Note that the paths embedded in the patch depend on where you run it,
- so changing directory to the llvm/tools/clang directory is recommended.</p>
-
- <!--=====================================================================-->
- <h2 id="irgen">LLVM IR Generation</h2>
- <!--=====================================================================-->
-
- <p>The LLVM IR generation part of clang handles conversion of the
- AST nodes output by the Sema module to the LLVM Intermediate
- Representation (IR). Historically, this was referred to as
- "codegen", and the Clang code for this lives
- in <tt>lib/CodeGen</tt>.</p>
-
- <p>The output is most easily inspected using the <tt>-emit-llvm</tt>
- option to clang (possibly in conjunction with <tt>-o -</tt>). You
- can also use <tt>-emit-llvm-bc</tt> to write an LLVM bitcode file
- which can be processed by the suite of LLVM tools
- like <tt>llvm-dis</tt>, <tt>llvm-nm</tt>, etc. See the LLVM
- <a href="http://llvm.org/docs/CommandGuide/">Command Guide</a>
- for more information.</p>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/index.html b/contrib/llvm/tools/clang/www/index.html
deleted file mode 100644
index 9adf640..0000000
--- a/contrib/llvm/tools/clang/www/index.html
+++ /dev/null
@@ -1,119 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>"clang" C Language Family Frontend for LLVM</title>
- <link type="text/css" rel="stylesheet" href="menu.css">
- <link type="text/css" rel="stylesheet" href="content.css">
-</head>
-<body>
-<!--#include virtual="menu.html.incl"-->
-<div id="content">
- <!--*********************************************************************-->
- <h1>clang: a C language family frontend for LLVM</h1>
- <!--*********************************************************************-->
-
- <p>The goal of the Clang project is to create a new C, C++, Objective C and
- Objective C++ front-end for the <a href="http://www.llvm.org/">LLVM</a>
- compiler. You can <a href="get_started.html">get and build</a> the source
- today.</p>
-
- <!--=====================================================================-->
- <h2 id="goals">Features and Goals</h2>
- <!--=====================================================================-->
-
- <p>Some of the goals for the project include the following:</p>
-
- <p><b><a href="features.html#enduser">End-User Features</a></b>:</p>
-
- <ul>
- <li>Fast compiles and low memory use</li>
- <li>Expressive diagnostics (<a href="diagnostics.html">examples</a>)</li>
- <li>GCC compatibility</li>
- </ul>
-
- <p><b><a href="features.html#applications">Utility and
- Applications</a></b>:</p>
-
- <ul>
- <li>Modular library based architecture</li>
- <li>Support diverse clients (refactoring, static analysis, code generation,
- etc)</li>
- <li>Allow tight integration with IDEs</li>
- <li>Use the LLVM 'BSD' License</li>
- </ul>
-
- <p><b><a href="features.html#design">Internal Design and
- Implementation</a></b>:</p>
-
- <ul>
- <li>A real-world, production quality compiler</li>
- <li>A simple and hackable code base</li>
- <li>A single unified parser for C, Objective C, C++, and Objective C++</li>
- <li>Conformance with C/C++/ObjC and their variants</li>
- </ul>
-
- <p>Of course this is only a rough outline of the goals and features of
- Clang. To get a true sense of what it is all about, see the <a
- href="features.html">Features</a> section, which breaks
- each of these down and explains them in more detail.</p>
-
-
- <!--=====================================================================-->
- <h2>Why?</h2>
- <!--=====================================================================-->
-
- <p>The development of a new front-end was started out of a need -- a need
- for a compiler that allows better diagnostics, better integration with
- IDEs, a license that is compatible with commercial products, and a
- nimble compiler that is easy to develop and maintain. All of these were
- motivations for starting work on a new front-end that could
- meet these needs.</p>
-
- <p>A good (but quite dated) introduction to Clang can be found in the
- following video lectures:</p>
-
- <ul>
- <li><a href="clang_video-05-25-2007.html">Clang Introduction</a>
- (May 2007)</li>
- <li><a href="clang_video-07-25-2007.html">Features and Performance of
- Clang</a> (July 2007)</li>
- </ul>
-
- <p>For a more detailed comparison between Clang and other compilers, please
- see the <a href="comparison.html">clang comparison page</a>.</p>
-
- <!--=====================================================================-->
- <h2>Current Status</h2>
- <!--=====================================================================-->
-
- <p>Clang is still under heavy development. Clang is considered to
- be a production quality C and Objective-C compiler when targetting
- X86-32 and X86-64 (other targets may have caveats, but are usually
- easy to fix). If you are looking for source analysis or
- source-to-source transformation tools, clang is probably a great
- solution for you. Clang's C++ support is currently alpha quality
- at best, but is evolving rapidly: see the <a
- href="cxx_status.html">C++ status</a> page for more
- information.</p>
-
- <!--=====================================================================-->
- <h2>Get it and get involved!</h2>
- <!--=====================================================================-->
-
- <p>Start by <a href="get_started.html">getting the code, building it, and
- playing with it</a>. This will show you the sorts of things we can do
- today and will let you have the "clang experience" first hand: hopefully
- it will "resonate" with you. :)</p>
-
- <p>Once you've done that, please consider <a href="get_involved.html">getting
- involved in the clang community</a>. The clang developers include numerous
- volunteer contributors with a variety of backgrounds. If you're
- interested in
- following the development of clang, signing up for a mailing list is a good
- way to learn about how the project works.</p>
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/menu.css b/contrib/llvm/tools/clang/www/menu.css
deleted file mode 100644
index 4a887b1..0000000
--- a/contrib/llvm/tools/clang/www/menu.css
+++ /dev/null
@@ -1,39 +0,0 @@
-/***************/
-/* page layout */
-/***************/
-
-[id=menu] {
- position:fixed;
- width:25ex;
-}
-[id=content] {
- /* ***** EDIT THIS VALUE IF CONTENT OVERLAPS MENU ***** */
- position:absolute;
- left:29ex;
- padding-right:4ex;
-}
-
-/**************/
-/* menu style */
-/**************/
-
-#menu .submenu {
- padding-top:1em;
- display:block;
-}
-
-#menu label {
- display:block;
- font-weight: bold;
- text-align: center;
- background-color: rgb(192,192,192);
-}
-#menu a {
- padding:0 .2em;
- display:block;
- text-align: center;
- background-color: rgb(235,235,235);
-}
-#menu a:visited {
- color:rgb(100,50,100);
-}
diff --git a/contrib/llvm/tools/clang/www/menu.html.incl b/contrib/llvm/tools/clang/www/menu.html.incl
deleted file mode 100644
index 29ed3a3..0000000
--- a/contrib/llvm/tools/clang/www/menu.html.incl
+++ /dev/null
@@ -1,58 +0,0 @@
-<div id="menu">
- <div>
- <a href="http://llvm.org/">LLVM Home</a>
- </div>
-
- <div class="submenu">
- <label>Clang Info</label>
- <a href="/index.html">About</a>
- <a href="/features.html">Features</a>
- <a href="/comparison.html">Comparisons</a>
- <a href="/docs/UsersManual.html">Users Manual</a>
- <a href="/docs/LanguageExtensions.html">Language&nbsp;Extensions</a>
- <a href="/cxx_status.html">C++ Status</a>
- </div>
-
- <div class="submenu">
- <label>Clang Development</label>
- <a href="/get_started.html">Get&nbsp;Started</a>
- <a href="/get_involved.html">Get&nbsp;Involved</a>
- <a href="/OpenProjects.html">Open&nbsp;Projects</a>
- <a href="/docs/InternalsManual.html">Clang&nbsp;Internals</a>
- <a href="/hacking.html">Hacking on Clang</a>
- <a href="/performance.html">Performance</a>
- </div>
-
- <div class="submenu">
- <label>Clang Tools</label>
- <a href="http://clang-analyzer.llvm.org">Automatic Bug-Finding</a>
- </div>
-
- <div class="submenu">
- <label>Communication</label>
- <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev List</a>
- <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commit List</a>
- <a href="irc://irc.oftc.net/llvm">IRC: irc.oftc.net#llvm</a>
- <a href="http://llvm.org/bugs/">Bug Reports</a>
- </div>
-
- <div class="submenu">
- <label>The Code</label>
- <a href="/get_started.html#build">Check Out SVN</a>
- <a href="http://llvm.org/svn/llvm-project/cfe/trunk/">Browse SVN</a>
- <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/">Browse ViewVC</a>
- <a href="http://clang.llvm.org/doxygen/">doxygen</a>
- </div>
-
- <div class="submenu">
- <label>Quick Links</label>
- <a href="http://t1.minormatter.com/~ddunbar/clang-cov/">Testing Coverage</a>
- <a href="http://t1.minormatter.com/~ddunbar/references.html">Spec. References</a>
- </div>
-
- <div class="submenu">
- <label>Events</label>
- <a href="http://llvm.org/devmtg/2009-10/">October 2, 2009 - LLVM/Clang Developer Meeting</a>
- </div>
-
-</div>
diff --git a/contrib/llvm/tools/clang/www/performance-2008-10-31.html b/contrib/llvm/tools/clang/www/performance-2008-10-31.html
deleted file mode 100644
index 5246ac3..0000000
--- a/contrib/llvm/tools/clang/www/performance-2008-10-31.html
+++ /dev/null
@@ -1,134 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Performance</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <style type="text/css">
-</style>
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<!--*************************************************************************-->
-<h1>Clang - Performance</h1>
-<!--*************************************************************************-->
-
-<p>This page tracks the compile time performance of Clang on two
-interesting benchmarks:
-<ul>
- <li><i>Sketch</i>: The Objective-C example application shipped on
- Mac OS X as part of Xcode. <i>Sketch</i> is indicative of a
- "typical" Objective-C app. The source itself has a relatively
- small amount of code (~7,500 lines of source code), but it relies
- on the extensive Cocoa APIs to build its functionality. Like many
- Objective-C applications, it includes
- <tt>Cocoa/Cocoa.h</tt> in all of its source files, which represents a
- significant stress test of the front-end's performance on lexing,
- preprocessing, parsing, and syntax analysis.</li>
- <li><i>176.gcc</i>: This is the gcc-2.7.2.2 code base as present in
- SPECINT 2000. In contrast to Sketch, <i>176.gcc</i> consists of a
- large amount of C source code (~220,000 lines) with few system
- dependencies. This stresses the back-end's performance on generating
- assembly code and debug information.</li>
-</ul>
-</p>
-
-<!--*************************************************************************-->
-<h2><a name="enduser">Experiments</a></h2>
-<!--*************************************************************************-->
-
-<p>Measurements are done by serially processing each file in the
-respective benchmark, using Clang, gcc, and llvm-gcc as compilers. In
-order to track the performance of various subsystems the timings have
-been broken down into separate stages where possible:
-
-<ul>
- <li><tt>-Eonly</tt>: This option runs the preprocessor but does not
- perform any output. For gcc and llvm-gcc, the -MM option is used
- as a rough equivalent to this step.</li>
- <li><tt>-parse-noop</tt>: This option runs the parser on the input,
- but without semantic analysis or any output. gcc and llvm-gcc have
- no equivalent for this option.</li>
- <li><tt>-fsyntax-only</tt>: This option runs the parser with semantic
- analysis.</li>
- <li><tt>-emit-llvm -O0</tt>: For Clang and llvm-gcc, this option
- converts to the LLVM intermediate representation but doesn't
- generate native code.</li>
- <li><tt>-S -O0</tt>: Perform actual code generation to produce a
- native assembler file.</li>
- <li><tt>-S -O0 -g</tt>: This adds emission of debug information to
- the assembly output.</li>
-</ul>
-</p>
-
-<p>This set of stages is chosen to be approximately additive, that is
-each subsequent stage simply adds some additional processing. The
-timings measure the delta of the given stage from the previous
-one. For example, the timings for <tt>-fsyntax-only</tt> below show
-the difference of running with <tt>-fsyntax-only</tt> versus running
-with <tt>-parse-noop</tt> (for clang) or <tt>-MM</tt> with gcc and
-llvm-gcc. This amounts to a fairly accurate measure of only the time
-to perform semantic analysis (and parsing, in the case of gcc and llvm-gcc).</p>
-
-<p>These timings are chosen to break down the compilation process for
-clang as much as possible. The graphs below show these numbers
-combined so that it is easy to see how the time for a particular task
-is divided among various components. For example, <tt>-S -O0</tt>
-includes the time of <tt>-fsyntax-only</tt> and <tt>-emit-llvm -O0</tt>.</p>
-
-<p>Note that we already know that the LLVM optimizers are substantially (30-40%)
-faster than the GCC optimizers at a given -O level, so we only focus on -O0
-compile time here.</p>
-
-<!--*************************************************************************-->
-<h2><a name="enduser">Timing Results</a></h2>
-<!--*************************************************************************-->
-
-<!--=======================================================================-->
-<h3><a name="2008-10-31">2008-10-31</a></h3>
-<!--=======================================================================-->
-
-<center><h4>Sketch</h4></center>
-<img class="img_slide"
- src="timing-data/2008-10-31/sketch.png" alt="Sketch Timings"/>
-
-<p>This shows Clang's substantial performance improvements in
-preprocessing and semantic analysis; over 90% faster on
--fsyntax-only. As expected, time spent in code generation for this
-benchmark is relatively small. One caveat, Clang's debug information
-generation for Objective-C is very incomplete; this means the <tt>-S
--O0 -g</tt> numbers are unfair since Clang is generating substantially
-less output.</p>
-
-<p>This chart also shows the effect of using precompiled headers (PCH)
-on compiler time. gcc and llvm-gcc see a large performance improvement
-with PCH; about 4x in wall time. Unfortunately, Clang does not yet
-have an implementation of PCH-style optimizations, but we are actively
-working to address this.</p>
-
-<center><h4>176.gcc</h4></center>
-<img class="img_slide"
- src="timing-data/2008-10-31/176.gcc.png" alt="176.gcc Timings"/>
-
-<p>Unlike the <i>Sketch</i> timings, compilation of <i>176.gcc</i>
-involves a large amount of code generation. The time spent in Clang's
-LLVM IR generation and code generation is on par with gcc's code
-generation time but the improved parsing & semantic analysis
-performance means Clang still comes in at ~29% faster versus gcc
-on <tt>-S -O0 -g</tt> and ~20% faster versus llvm-gcc.</p>
-
-<p>These numbers indicate that Clang still has room for improvement in
-several areas, notably our LLVM IR generation is significantly slower
-than that of llvm-gcc, and both Clang and llvm-gcc incur a
-significantly higher cost for adding debugging information compared to
-gcc.</p>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/performance-2009-03-02.html b/contrib/llvm/tools/clang/www/performance-2009-03-02.html
deleted file mode 100644
index f76fc7a..0000000
--- a/contrib/llvm/tools/clang/www/performance-2009-03-02.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Performance</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <style type="text/css">
-</style>
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<!--*************************************************************************-->
-<h1>Clang - Performance</h1>
-<!--*************************************************************************-->
-
-<p>This page shows the compile time performance of Clang on two
-interesting benchmarks:
-<ul>
- <li><i>Sketch</i>: The Objective-C example application shipped on
- Mac OS X as part of Xcode. <i>Sketch</i> is indicative of a
- "typical" Objective-C app. The source itself has a relatively
- small amount of code (~7,500 lines of source code), but it relies
- on the extensive Cocoa APIs to build its functionality. Like many
- Objective-C applications, it includes <tt>Cocoa/Cocoa.h</tt> in
- all of its source files, which represents a significant stress
- test of the front-end's performance on lexing, preprocessing,
- parsing, and syntax analysis.</li>
- <li><i>176.gcc</i>: This is the gcc-2.7.2.2 code base as present in
- SPECINT 2000. In contrast to Sketch, <i>176.gcc</i> consists of a
- large amount of C source code (~200,000 lines) with few system
- dependencies. This stresses the back-end's performance on generating
- assembly code and debug information.</li>
-</ul>
-</p>
-
-<p>
-For previous performance numbers, please
-go <a href="performance-2008-10-31.html">here</a>.
-</p>
-
-<!--*************************************************************************-->
-<h2><a name="experiments">Experiments</a></h2>
-<!--*************************************************************************-->
-
-<p>Measurements are done by running a full build (using xcodebuild or
-make for Sketch and 176.gcc respectively) using Clang and gcc 4.2 as
-compilers; gcc is run both with and without the new clang driver (ccc)
-in order to evaluate the overhead of the driver itself.</p>
-
-<p>In order to track the performance of various subsystems the timings
-have been broken down into separate stages where possible. This is
-done by over-riding the CC environment variable used during the build
-to point to one of a few simple shell scripts which may skip part of
-the build.
-
-<ul>
- <li><tt>non-compiler</tt>: The overhead of the build system itself;
- for Sketch this also includes the time to build/copy various
- non-source code resource files.</li>
- <li><tt>+ driver</tt>: Add execution of the driver, but do not execute any
- commands (by using the -### driver option).</li>
- <li><tt>+ pch gen</tt>: Add generation of PCH files.</li>
- <li><tt>+ cpp</tt>: Add preprocessing of source files (this time is
- include in syntax for gcc).</li>
- <li><tt>+ parse</tt>: Add parsing of source files (this time is
- include in syntax for gcc).</li>
- <li><tt>+ syntax</tt>: Add semantic checking of source files (for
- gcc, this includes preprocessing and parsing as well).</li>
- <li><tt>+ IRgen</tt>: Add generation of LLVM IR (gcc has no
- corresponding phase).</li>
- <li><tt>+ codegen</tt>: Add generation of assembler files.</li>
- <li><tt>+ assembler</tt>: Add assembler time to generate .o files.</li>
- <li><tt>+ linker</tt>: Add linker time.</li>
-</ul>
-</p>
-
-<p>This set of stages is chosen to be approximately additive, that is
-each subsequent stage simply adds some additional processing. The
-timings measure the delta of the given stage from the previous
-one. For example, the timings for <tt>+ syntax</tt> below show the
-difference of running with <tt>+ syntax</tt> versus running with <tt>+
-parse</tt> (for clang) or <tt>+ driver</tt> with gcc. This amounts to
-a fairly accurate measure of only the time to perform semantic
-analysis (and preprocessing/parsing, in the case of gcc).</p>
-
-<!--*************************************************************************-->
-<h2><a name="timings">Timing Results</a></h2>
-<!--*************************************************************************-->
-
-<!--=======================================================================-->
-<h3><a name="2009-03-02">2009-03-02</a></h3>
-<!--=======================================================================-->
-
-<a href="timing-data/2009-03-02/sketch.pdf">
-<img class="img_slide"
- src="timing-data/2009-03-02/sketch.png" alt="Sketch Timings"/>
-</a>
-
-<a href="timing-data/2009-03-02/176.gcc.pdf">
-<img class="img_slide"
- src="timing-data/2009-03-02/176.gcc.png" alt="176.gcc Timings"/>
-</a>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/performance.html b/contrib/llvm/tools/clang/www/performance.html
deleted file mode 100644
index 2bb8fe2..0000000
--- a/contrib/llvm/tools/clang/www/performance.html
+++ /dev/null
@@ -1,106 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
- <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
- <title>Clang - Performance</title>
- <link type="text/css" rel="stylesheet" href="menu.css" />
- <link type="text/css" rel="stylesheet" href="content.css" />
- <style type="text/css">
-</style>
-</head>
-<body>
-
-<!--#include virtual="menu.html.incl"-->
-
-<div id="content">
-
-<!--*************************************************************************-->
-<h1>Clang - Performance</h1>
-<!--*************************************************************************-->
-
-<p>This page shows the compile time performance of Clang on two
-interesting benchmarks:
-<ul>
- <li><i>Sketch</i>: The Objective-C example application shipped on
- Mac OS X as part of Xcode. <i>Sketch</i> is indicative of a
- "typical" Objective-C app. The source itself has a relatively
- small amount of code (~7,500 lines of source code), but it relies
- on the extensive Cocoa APIs to build its functionality. Like many
- Objective-C applications, it includes <tt>Cocoa/Cocoa.h</tt> in
- all of its source files, which represents a significant stress
- test of the front-end's performance on lexing, preprocessing,
- parsing, and syntax analysis.</li>
- <li><i>176.gcc</i>: This is the gcc-2.7.2.2 code base as present in
- SPECINT 2000. In contrast to Sketch, <i>176.gcc</i> consists of a
- large amount of C source code (~200,000 lines) with few system
- dependencies. This stresses the back-end's performance on generating
- assembly code and debug information.</li>
-</ul>
-</p>
-
-<p>
-For previous performance numbers, please
-go <a href="performance-2009-03-02.html">here</a>.
-</p>
-
-<!--*************************************************************************-->
-<h2><a name="experiments">Experiments</a></h2>
-<!--*************************************************************************-->
-
-<p>Measurements are done by running a full build (using xcodebuild or
-make for Sketch and 176.gcc respectively) using Clang and gcc 4.2 as
-compilers.</p>
-
-<p>In order to track the performance of various subsystems the timings
-have been broken down into separate stages where possible. This is
-done by over-riding the CC environment variable used during the build
-to point to one of a few simple shell scripts which may skip part of
-the build.
-
-<ul>
- <li><tt>non-compiler</tt>: The overhead of the build system itself;
- for Sketch this also includes the time to build/copy various
- non-source code resource files.</li>
- <li><tt>+ driver</tt>: Add execution of the driver, but do not execute any
- commands (by using the -### driver option).</li>
- <li><tt>+ pch gen</tt>: Add generation of PCH files (if used).</li>
- <li><tt>+ syntax</tt>: Add preprocessing, parsing, and semantic checking of
- source files.</li>
- <li><tt>+ IRgen</tt>: Add generation of LLVM IR (gcc has no
- corresponding phase).</li>
- <li><tt>+ codegen</tt>: Add generation of assembler files.</li>
- <li><tt>+ assembler</tt>: Add assembler time to generate .o files.</li>
- <li><tt>+ linker</tt>: Add linker time.</li>
-</ul>
-</p>
-
-<p>This set of stages is chosen to be approximately additive, that is each
-subsequent stage simply adds some additional processing. The timings measure the
-delta of the given stage from the previous one. For example, the timings
-for <tt>+ syntax</tt> below show the difference of running with <tt>+
-syntax</tt> versus the times for <tt>+ pch gen</tt>. This amounts to a fairly
-accurate measure of only the time to perform preprocessing, parsing, and
-semantic analysis after PCH generation is done.</p>
-
-<!--*************************************************************************-->
-<h2><a name="timings">Timing Results</a></h2>
-<!--*************************************************************************-->
-
-<!--=======================================================================-->
-<h3><a name="2009-06-26">2009-06-26</a></h3>
-<!--=======================================================================-->
-
-<a href="timing-data/2009-06-26/sketch.pdf">
-<img class="img_slide"
- src="timing-data/2009-06-26/sketch.png" alt="Sketch Timings"/>
-</a>
-
-<a href="timing-data/2009-06-26/176.gcc.pdf">
-<img class="img_slide"
- src="timing-data/2009-06-26/176.gcc.png" alt="176.gcc Timings"/>
-</a>
-
-</div>
-</body>
-</html>
diff --git a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc-01.txt b/contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc-01.txt
deleted file mode 100644
index 3809e0d..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc-01.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-Title: 176.gcc Timings
-Timestamp: 2008-10-31_17-10
-Uname: Darwin lordcrumb.apple.com 10.0.0d3 Darwin Kernel Version 10.0.0d3: Fri Oct 24 02:12:11 PDT 2008; root:xnu-1353~2/RELEASE_I386 i386
-Path: /Users/ddunbar/nightlytest/176.gcc
-Runs: 3
-
-LLVM SVN Rev.: 58536
-
-clang: /Users/ddunbar/llvm/Release-Asserts/bin//clang
-gcc: /usr/bin/gcc-4.2
-llvm-gcc: /Users/ddunbar/llvm-gcc/install/bin/llvm-gcc
-
-Mode: Eonly Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 0.8321 0.8274 0.8274 0.8435 0.0080 2.4964
- sys 0.4209 0.4140 0.4140 0.4307 0.0071 1.2626
-wall 1.2965 1.2829 1.2829 1.3176 0.0152 3.8894
-
-Mode: Eonly Compiler: gcc PCH: 0 Flags:
-name avg min med max SD total
-user 0.8534 0.8465 0.8563 0.8575 0.0050 2.5603
- sys 0.5327 0.5200 0.5291 0.5490 0.0121 1.5980
-wall 1.4336 1.4104 1.4330 1.4575 0.0192 4.3009
-
-Mode: Eonly Compiler: llvm-gcc PCH: 0 Flags:
-name avg min med max SD total
-user 1.1313 1.1277 1.1304 1.1359 0.0034 3.3940
- sys 0.5579 0.5530 0.5539 0.5669 0.0063 1.6738
-wall 1.7860 1.7669 1.7890 1.8020 0.0145 5.3580
-
-
-Mode: parse-noop Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 0.9276 0.9267 0.9269 0.9292 0.0011 2.7827
- sys 0.4284 0.4244 0.4255 0.4353 0.0049 1.2852
-wall 1.3994 1.3941 1.3954 1.4086 0.0066 4.1981
-
-
-Mode: disable-free Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 1.2716 1.2497 1.2713 1.2937 0.0180 3.8147
- sys 0.4835 0.4815 0.4738 0.4953 0.0089 1.4506
-wall 1.8149 1.7838 1.8137 1.8471 0.0259 5.4446
-
-
-Mode: syntax Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 1.4042 1.4031 1.4044 1.4044 0.0009 4.2127
- sys 0.4818 0.4802 0.4838 0.4838 0.0015 1.4454
-wall 1.9359 1.9333 1.9376 1.9376 0.0019 5.8077
-
-Mode: syntax Compiler: gcc PCH: 0 Flags:
-name avg min med max SD total
-user 3.9188 3.8766 3.8846 3.9951 0.0541 11.7563
- sys 1.0207 1.0195 1.0141 1.0285 0.0059 3.0622
-wall 5.0500 5.0023 5.0092 5.1386 0.0627 15.1500
-
-Mode: syntax Compiler: llvm-gcc PCH: 0 Flags:
-name avg min med max SD total
-user 3.8854 3.8647 3.8868 3.9048 0.0164 11.6563
- sys 0.8548 0.8436 0.8455 0.8753 0.0145 2.5644
-wall 4.8695 4.8369 4.8614 4.9103 0.0305 14.6086
-
-
-Mode: llvm Compiler: clang PCH: 0 Flags: -O0
-name avg min med max SD total
-user 2.7903 2.7606 2.8026 2.8079 0.0211 8.3710
- sys 0.6645 0.6509 0.6759 0.6667 0.0104 1.9935
-wall 3.5577 3.4894 3.5650 3.6186 0.0530 10.6730
-
-Mode: llvm Compiler: llvm-gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 4.1711 4.1389 4.1729 4.2015 0.0256 12.5133
- sys 0.9335 0.9339 0.9218 0.9448 0.0094 2.8004
-wall 5.2380 5.1985 5.2417 5.2738 0.0309 15.7140
-
-
-Mode: asm Compiler: clang PCH: 0 Flags: -O0
-name avg min med max SD total
-user 5.2797 5.1709 5.2643 5.4040 0.0958 15.8392
- sys 0.7739 0.7547 0.7726 0.7944 0.0162 2.3217
-wall 6.1807 6.1082 6.1174 6.3165 0.0961 18.5421
- Asm Lines: 735931
-
-Mode: asm Compiler: gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 8.2410 8.1034 8.2230 8.3965 0.1203 24.7230
- sys 1.1924 1.1576 1.2112 1.2082 0.0246 3.5771
-wall 9.6010 9.3792 9.6800 9.7438 0.1590 28.8030
- Asm Lines: 514962
-
-Mode: asm Compiler: llvm-gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 6.3978 6.3894 6.3894 6.4726 0.0579 19.1935
- sys 1.0638 1.0562 1.0562 1.0861 0.0160 3.1914
-wall 7.6185 7.5807 7.5807 7.6876 0.0489 22.8555
- Asm Lines: 597193
-
-
-Mode: llvm Compiler: clang PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 3.9798 3.9728 3.9752 3.9914 0.0083 11.9393
- sys 0.7313 0.7260 0.7326 0.7353 0.0039 2.1938
-wall 4.7915 4.7799 4.7878 4.8066 0.0112 14.3744
-
-Mode: llvm Compiler: llvm-gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 5.4838 5.4701 5.4701 5.5172 0.0238 16.4513
- sys 1.0527 1.0401 1.0401 1.0757 0.0163 3.1581
-wall 6.7059 6.6768 6.6768 6.7254 0.0210 20.1177
-
-
-Mode: asm Compiler: clang PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 6.8213 6.7836 6.8060 6.8743 0.0386 20.4639
- sys 0.8527 0.8376 0.8598 0.8607 0.0107 2.5582
-wall 7.8055 7.7154 7.8109 7.8902 0.0714 23.4165
- Asm Lines: 1581804
-
-Mode: asm Compiler: gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 8.7962 8.6334 8.7861 8.9691 0.1373 26.3887
- sys 1.2758 1.2395 1.2780 1.3100 0.0288 3.8275
-wall 10.2714 10.1274 10.2232 10.4635 0.1414 30.8142
- Asm Lines: 1403421
-
-Mode: asm Compiler: llvm-gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 7.9903 7.9383 7.9821 8.0504 0.0461 23.9708
- sys 1.1587 1.1374 1.1592 1.1794 0.0171 3.4760
-wall 9.3711 9.2555 9.2884 9.5692 0.1408 28.1132
- Asm Lines: 1580849
-
-
- Done: 2008-10-31_17-16
diff --git a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc-02.txt b/contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc-02.txt
deleted file mode 100644
index dd898c1..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc-02.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-Title: 176.gcc Timings
-Timestamp: 2008-10-31_17-17
-Uname: Darwin lordcrumb.apple.com 10.0.0d3 Darwin Kernel Version 10.0.0d3: Fri Oct 24 02:12:11 PDT 2008; root:xnu-1353~2/RELEASE_I386 i386
-Path: /Users/ddunbar/nightlytest/176.gcc
-Runs: 3
-
-LLVM SVN Rev.: 58536
-
-clang: /Users/ddunbar/llvm/Release-Asserts/bin//clang
-gcc: /usr/bin/gcc-4.2
-llvm-gcc: /Users/ddunbar/llvm-gcc/install/bin/llvm-gcc
-
-Mode: Eonly Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 0.8238 0.8184 0.8187 0.8342 0.0074 2.4713
- sys 0.4030 0.3891 0.3953 0.4247 0.0155 1.2091
-wall 1.2731 1.2477 1.2565 1.3152 0.0299 3.8194
-
-Mode: Eonly Compiler: gcc PCH: 0 Flags:
-name avg min med max SD total
-user 0.8584 0.8501 0.8560 0.8692 0.0080 2.5753
- sys 0.5426 0.5268 0.5453 0.5556 0.0119 1.6277
-wall 1.4485 1.4214 1.4503 1.4737 0.0214 4.3454
-
-Mode: Eonly Compiler: llvm-gcc PCH: 0 Flags:
-name avg min med max SD total
-user 1.1289 1.1338 1.1322 1.1207 0.0058 3.3866
- sys 0.5857 0.5787 0.5734 0.6051 0.0138 1.7572
-wall 1.8195 1.8110 1.8124 1.8350 0.0110 5.4585
-
-
-Mode: parse-noop Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 0.9286 0.9250 0.9250 0.9370 0.0059 2.7859
- sys 0.4255 0.4163 0.4163 0.4417 0.0115 1.2764
-wall 1.3970 1.3826 1.3826 1.4241 0.0192 4.1910
-
-
-Mode: disable-free Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 1.2962 1.2963 1.2963 1.3114 0.0125 3.8885
- sys 0.4842 0.4864 0.4864 0.4901 0.0059 1.4527
-wall 1.8424 1.8356 1.8356 1.8534 0.0078 5.5273
-
-
-Mode: syntax Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 1.4120 1.4055 1.4118 1.4188 0.0054 4.2360
- sys 0.4824 0.4786 0.4821 0.4864 0.0032 1.4471
-wall 1.9573 1.9467 1.9570 1.9682 0.0088 5.8719
-
-Mode: syntax Compiler: gcc PCH: 0 Flags:
-name avg min med max SD total
-user 3.9243 3.8431 3.9624 3.9675 0.0575 11.7730
- sys 1.0094 0.9967 1.0135 1.0180 0.0091 3.0282
-wall 5.0495 4.9447 5.1012 5.1025 0.0741 15.1484
-
-Mode: syntax Compiler: llvm-gcc PCH: 0 Flags:
-name avg min med max SD total
-user 3.9287 3.8760 3.9226 3.9874 0.0457 11.7860
- sys 0.8949 0.8684 0.9014 0.9147 0.0195 2.6846
-wall 4.9625 4.8722 4.9601 5.0550 0.0747 14.8874
-
-
-Mode: llvm Compiler: clang PCH: 0 Flags: -O0
-name avg min med max SD total
-user 2.8082 2.7806 2.8106 2.8334 0.0216 8.4246
- sys 0.6608 0.6564 0.6582 0.6677 0.0049 1.9823
-wall 3.5453 3.5150 3.5559 3.5650 0.0218 10.6359
-
-Mode: llvm Compiler: llvm-gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 4.1471 4.1512 4.1505 4.1395 0.0053 12.4413
- sys 0.9221 0.9069 0.9203 0.9391 0.0132 2.7663
-wall 5.2138 5.1919 5.2001 5.2495 0.0255 15.6415
-
-
-Mode: asm Compiler: clang PCH: 0 Flags: -O0
-name avg min med max SD total
-user 5.1674 5.1537 5.1637 5.1637 0.0129 15.5022
- sys 0.7424 0.7404 0.7376 0.7376 0.0049 2.2271
-wall 6.0284 5.9844 6.0964 6.0964 0.0487 18.0852
- Asm Lines: 735931
-
-Mode: asm Compiler: gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 8.0945 8.0259 8.1235 8.1342 0.0487 24.2835
- sys 1.1599 1.1517 1.1626 1.1654 0.0059 3.4796
-wall 9.4120 9.2935 9.4036 9.5390 0.1004 28.2361
- Asm Lines: 514962
-
-Mode: asm Compiler: llvm-gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 6.4405 6.3577 6.4623 6.5014 0.0607 19.3214
- sys 1.0571 1.0454 1.0359 1.0902 0.0237 3.1714
-wall 7.6688 7.5631 7.6376 7.8058 0.1015 23.0065
- Asm Lines: 597193
-
-
-Mode: llvm Compiler: clang PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 3.9883 3.9539 3.9626 4.0485 0.0427 11.9650
- sys 0.7333 0.7209 0.7377 0.7413 0.0089 2.1998
-wall 4.8088 4.7485 4.7821 4.8957 0.0630 14.4263
-
-Mode: llvm Compiler: llvm-gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 5.4875 5.4528 5.5017 5.5017 0.0247 16.4626
- sys 1.0308 1.0231 1.0248 1.0248 0.0097 3.0923
-wall 6.6781 6.6372 6.7006 6.7006 0.0290 20.0342
-
-
-Mode: asm Compiler: clang PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 6.7945 6.6664 6.7352 6.9819 0.1355 20.3835
- sys 0.8359 0.8172 0.8329 0.8577 0.0167 2.5077
-wall 7.7458 7.6003 7.7080 7.9290 0.1368 23.2374
- Asm Lines: 1581804
-
-Mode: asm Compiler: gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 8.7280 8.6884 8.7084 8.7870 0.0426 26.1839
- sys 1.3031 1.2940 1.3118 1.3037 0.0073 3.9094
-wall 10.2039 10.1039 10.1162 10.3916 0.1328 30.6116
- Asm Lines: 1403421
-
-Mode: asm Compiler: llvm-gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 7.9987 7.9805 7.9805 8.0493 0.0362 23.9962
- sys 1.1561 1.1523 1.1523 1.1626 0.0047 3.4682
-wall 9.3154 9.2801 9.2801 9.3606 0.0336 27.9463
- Asm Lines: 1580849
-
-
- Done: 2008-10-31_17-23
diff --git a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc.png b/contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc.png
deleted file mode 100644
index 53efd87..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/176.gcc.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch-01.txt b/contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch-01.txt
deleted file mode 100644
index ff5d83e..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch-01.txt
+++ /dev/null
@@ -1,187 +0,0 @@
-Title: Sketch Timings
-Timestamp: 2008-10-31_16-46
-Uname: Darwin lordcrumb.apple.com 10.0.0d3 Darwin Kernel Version 10.0.0d3: Fri Oct 24 02:12:11 PDT 2008; root:xnu-1353~2/RELEASE_I386 i386
-Path: /Users/ddunbar/nightlytest/Sketch.ref
-Runs: 3
-
-LLVM SVN Rev.: 58536
-
-clang: /Users/ddunbar/llvm/Release-Asserts/bin//clang
-gcc: /usr/bin/gcc-4.2
-llvm-gcc: /Users/ddunbar/llvm-gcc/install/bin/llvm-gcc
-
-Mode: Eonly Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 1.3762 1.3711 1.3724 1.3849 0.0062 4.1285
- sys 0.8306 0.8276 0.8274 0.8367 0.0044 2.4917
-wall 2.2290 2.2207 2.2219 2.2445 0.0109 6.6870
-
-Mode: Eonly Compiler: gcc PCH: 0 Flags:
-name avg min med max SD total
-user 2.2970 2.2352 2.2374 2.4184 0.0858 6.8910
- sys 1.0716 1.0338 1.0342 1.1470 0.0533 3.2149
-wall 3.4039 3.3027 3.3046 3.6043 0.1417 10.2116
-
-Mode: Eonly Compiler: llvm-gcc PCH: 0 Flags:
-name avg min med max SD total
-user 2.8472 2.7770 2.7770 2.9893 0.1005 8.5416
- sys 1.3153 1.2699 1.2699 1.4079 0.0655 3.9460
-wall 4.2134 4.0909 4.0909 4.4421 0.1618 12.6403
-
-
-Mode: parse-noop Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 1.7295 1.7228 1.7237 1.7421 0.0089 5.1886
- sys 0.8510 0.8468 0.8448 0.8615 0.0074 2.5530
-wall 2.6034 2.5913 2.5914 2.6277 0.0172 7.8103
-
-
-Mode: disable-free Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 2.7310 2.7274 2.7288 2.7288 0.0042 8.1930
- sys 0.9950 0.9890 0.9917 0.9917 0.0068 2.9851
-wall 3.7720 3.7515 3.7866 3.7866 0.0150 11.3161
-
-
-Mode: syntax Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 3.1817 3.1284 3.1620 3.2547 0.0534 9.5451
- sys 1.0815 1.0569 1.0737 1.1138 0.0239 3.2444
-wall 4.2918 4.2129 4.2635 4.3991 0.0786 12.8755
-
-Mode: syntax Compiler: gcc PCH: 0 Flags:
-name avg min med max SD total
-user 6.4086 6.3289 6.4012 6.4956 0.0682 19.2258
- sys 1.7617 1.7257 1.7615 1.7979 0.0295 5.2851
-wall 8.2403 8.1235 8.2432 8.3541 0.0942 24.7208
-
-Mode: syntax Compiler: llvm-gcc PCH: 0 Flags:
-name avg min med max SD total
-user 6.9711 6.8657 6.9738 7.0739 0.0850 20.9133
- sys 1.7577 1.7226 1.7801 1.7702 0.0251 5.2730
-wall 8.8020 8.6601 8.8243 8.9216 0.1079 26.4061
-
-Mode: syntax Compiler: gcc PCH: 1 Flags:
-name avg min med max SD total
-user 0.6082 0.6078 0.6083 0.6085 0.0003 1.8245
- sys 0.8901 0.8826 0.8949 0.8927 0.0053 2.6702
-wall 1.5593 1.5558 1.5605 1.5617 0.0025 4.6780
-
-Mode: syntax Compiler: llvm-gcc PCH: 1 Flags:
-name avg min med max SD total
-user 0.6413 0.6409 0.6409 0.6407 0.0008 1.9240
- sys 0.7872 0.7805 0.7805 0.7954 0.0062 2.3615
-wall 1.4837 1.4760 1.4760 1.4877 0.0054 4.4510
-
-
-Mode: llvm Compiler: clang PCH: 0 Flags: -O0
-name avg min med max SD total
-user 3.3512 3.2800 3.3205 3.4530 0.0739 10.0535
- sys 1.0991 1.0690 1.0833 1.1450 0.0330 3.2974
-wall 4.4934 4.4015 4.4394 4.6392 0.1043 13.4801
-
-Mode: llvm Compiler: llvm-gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 7.1104 7.0581 7.1061 7.1670 0.0446 21.3311
- sys 1.7621 1.7462 1.7556 1.7845 0.0163 5.2863
-wall 8.9510 8.8993 8.9352 9.0187 0.0500 26.8531
-
-Mode: llvm Compiler: llvm-gcc PCH: 1 Flags: -O0
-name avg min med max SD total
-user 0.8446 0.8300 0.8499 0.8538 0.0104 2.5338
- sys 0.8742 0.8366 0.8861 0.9000 0.0272 2.6227
-wall 1.7871 1.7366 1.8046 1.8201 0.0362 5.3613
-
-
-Mode: asm Compiler: clang PCH: 0 Flags: -O0
-name avg min med max SD total
-user 3.4794 3.4750 3.4794 3.4794 0.0035 10.4381
- sys 1.0876 1.0817 1.0874 1.0874 0.0049 3.2628
-wall 4.6112 4.5958 4.6223 4.6223 0.0112 13.8337
- Asm Lines: 46279
-
-Mode: asm Compiler: gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 6.8875 6.7735 6.8748 7.0143 0.0987 20.6626
- sys 1.8035 1.7586 1.8049 1.8472 0.0362 5.4106
-wall 8.7785 8.6100 8.7574 8.9682 0.1470 26.3356
- Asm Lines: 41008
-
-Mode: asm Compiler: llvm-gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 7.3392 7.2327 7.3071 7.4779 0.1026 22.0176
- sys 1.8018 1.7703 1.7930 1.8420 0.0299 5.4053
-wall 9.2274 9.0793 9.1968 9.4062 0.1352 27.6823
- Asm Lines: 47243
-
-Mode: asm Compiler: gcc PCH: 1 Flags: -O0
-name avg min med max SD total
-user 1.0485 1.0361 1.0429 1.0666 0.0131 3.1456
- sys 1.0277 1.0097 1.0437 1.0296 0.0140 3.0830
-wall 2.1621 2.1181 2.1496 2.2185 0.0419 6.4862
- Asm Lines: 41001
-
-Mode: asm Compiler: llvm-gcc PCH: 1 Flags: -O0
-name avg min med max SD total
-user 0.9927 0.9898 0.9932 0.9951 0.0022 2.9781
- sys 0.8640 0.8529 0.8610 0.8781 0.0105 2.5920
-wall 1.9183 1.9041 1.9193 1.9315 0.0112 5.7550
- Asm Lines: 47238
-
-
-Mode: llvm Compiler: clang PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 3.3843 3.3639 3.3719 3.4173 0.0235 10.1530
- sys 1.0862 1.0743 1.0789 1.1053 0.0136 3.2585
-wall 4.5248 4.4754 4.4906 4.6084 0.0595 13.5744
-
-Mode: llvm Compiler: llvm-gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 7.4463 7.3855 7.3897 7.5638 0.0831 22.3390
- sys 1.7927 1.7653 1.7841 1.8286 0.0265 5.3780
-wall 9.3259 9.2350 9.2660 9.4767 0.1074 27.9777
-
-Mode: llvm Compiler: llvm-gcc PCH: 1 Flags: -O0 -g
-name avg min med max SD total
-user 1.1532 1.1527 1.1527 1.1556 0.0018 3.4596
- sys 0.8746 0.8663 0.8663 0.8774 0.0060 2.6238
-wall 2.1168 2.0914 2.0914 2.1464 0.0226 6.3503
-
-
-Mode: asm Compiler: clang PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 3.6819 3.5955 3.7080 3.7422 0.0627 11.0458
- sys 1.1386 1.0879 1.1480 1.1798 0.0381 3.4158
-wall 4.8606 4.7204 4.8947 4.9668 0.1034 14.5819
- Asm Lines: 106056
-
-Mode: asm Compiler: gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 7.9271 7.8581 7.8581 8.0696 0.1008 23.7814
- sys 2.0275 1.9943 1.9943 2.0711 0.0322 6.0826
-wall 10.0313 9.9266 9.9266 10.2314 0.1415 30.0939
- Asm Lines: 177342
-
-Mode: asm Compiler: llvm-gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 7.7083 7.6793 7.6941 7.6941 0.0312 23.1249
- sys 1.8122 1.7971 1.8204 1.8204 0.0107 5.4365
-wall 9.6227 9.5591 9.6555 9.6555 0.0450 28.8682
- Asm Lines: 203358
-
-Mode: asm Compiler: gcc PCH: 1 Flags: -O0 -g
-name avg min med max SD total
-user 1.2589 1.2129 1.2130 1.3509 0.0650 3.7767
- sys 1.2141 1.1467 1.1601 1.3355 0.0860 3.6423
-wall 2.5426 2.4325 2.4357 2.7596 0.1534 7.6278
- Asm Lines: 177335
-
-Mode: asm Compiler: llvm-gcc PCH: 1 Flags: -O0 -g
-name avg min med max SD total
-user 1.4234 1.3843 1.4009 1.4849 0.0440 4.2701
- sys 0.9822 0.9153 0.9446 1.0867 0.0749 2.9466
-wall 2.4856 2.3713 2.4482 2.6372 0.1117 7.4567
- Asm Lines: 203353
-
-
- Done: 2008-10-31_16-55
diff --git a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch-02.txt b/contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch-02.txt
deleted file mode 100644
index 88af326..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch-02.txt
+++ /dev/null
@@ -1,187 +0,0 @@
-Title: Sketch Timings
-Timestamp: 2008-10-31_16-59
-Uname: Darwin lordcrumb.apple.com 10.0.0d3 Darwin Kernel Version 10.0.0d3: Fri Oct 24 02:12:11 PDT 2008; root:xnu-1353~2/RELEASE_I386 i386
-Path: /Users/ddunbar/nightlytest/Sketch.ref
-Runs: 3
-
-LLVM SVN Rev.: 58536
-
-clang: /Users/ddunbar/llvm/Release-Asserts/bin//clang
-gcc: /usr/bin/gcc-4.2
-llvm-gcc: /Users/ddunbar/llvm-gcc/install/bin/llvm-gcc
-
-Mode: Eonly Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 1.4030 1.3765 1.3887 1.4437 0.0293 4.2089
- sys 0.8561 0.8388 0.8497 0.8796 0.0173 2.5682
-wall 2.2809 2.2373 2.2586 2.3468 0.0474 6.8426
-
-Mode: Eonly Compiler: gcc PCH: 0 Flags:
-name avg min med max SD total
-user 2.3041 2.2821 2.2821 2.3563 0.0371 6.9123
- sys 1.0772 1.0593 1.0593 1.0976 0.0157 3.2316
-wall 3.4323 3.3918 3.3918 3.4905 0.0422 10.2970
-
-Mode: Eonly Compiler: llvm-gcc PCH: 0 Flags:
-name avg min med max SD total
-user 2.7593 2.7038 2.7831 2.7831 0.0393 8.2778
- sys 1.2805 1.2605 1.2868 1.2868 0.0144 3.8414
-wall 4.0893 4.0056 4.1319 4.1319 0.0592 12.2679
-
-
-Mode: parse-noop Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 1.7430 1.7252 1.7429 1.7610 0.0146 5.2291
- sys 0.8573 0.8457 0.8605 0.8656 0.0085 2.5718
-wall 2.6237 2.5942 2.6266 2.6504 0.0230 7.8711
-
-
-Mode: disable-free Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 2.7684 2.7291 2.7310 2.8450 0.0542 8.3051
- sys 1.0088 0.9948 0.9960 1.0356 0.0189 3.0263
-wall 3.8203 3.7581 3.7635 3.9394 0.0842 11.4610
-
-
-Mode: syntax Compiler: clang PCH: 0 Flags:
-name avg min med max SD total
-user 3.1106 3.1115 3.1107 3.1095 0.0008 9.3317
- sys 1.0674 1.0630 1.0672 1.0721 0.0037 3.2022
-wall 4.2059 4.2015 4.2077 4.2085 0.0031 12.6176
-
-Mode: syntax Compiler: gcc PCH: 0 Flags:
-name avg min med max SD total
-user 6.4166 6.3461 6.4479 6.4559 0.0500 19.2499
- sys 1.7649 1.7256 1.7836 1.7854 0.0278 5.2946
-wall 8.2536 8.1547 8.3018 8.3045 0.0700 24.7609
-
-Mode: syntax Compiler: llvm-gcc PCH: 0 Flags:
-name avg min med max SD total
-user 7.0297 6.9018 7.0003 7.1869 0.1182 21.0890
- sys 1.7782 1.7336 1.7875 1.8136 0.0333 5.3347
-wall 8.8942 8.7128 8.8699 9.0999 0.1590 26.6826
-
-Mode: syntax Compiler: gcc PCH: 1 Flags:
-name avg min med max SD total
-user 0.6133 0.6065 0.6089 0.6244 0.0079 1.8398
- sys 0.9115 0.8880 0.9019 0.9446 0.0241 2.7345
-wall 1.5864 1.5593 1.5669 1.6330 0.0331 4.7592
-
-Mode: syntax Compiler: llvm-gcc PCH: 1 Flags:
-name avg min med max SD total
-user 0.6412 0.6387 0.6387 0.6477 0.0047 1.9235
- sys 0.7820 0.7654 0.7654 0.7955 0.0125 2.3461
-wall 1.4909 1.4783 1.4783 1.5124 0.0153 4.4726
-
-
-Mode: llvm Compiler: clang PCH: 0 Flags: -O0
-name avg min med max SD total
-user 3.2926 3.2939 3.2939 3.2998 0.0065 9.8778
- sys 1.0746 1.0728 1.0728 1.0793 0.0034 3.2237
-wall 4.4097 4.4045 4.4045 4.4150 0.0043 13.2290
-
-Mode: llvm Compiler: llvm-gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 7.3232 7.2559 7.3145 7.3991 0.0588 21.9695
- sys 1.8050 1.7967 1.7982 1.8201 0.0107 5.4151
-wall 9.2155 9.1243 9.2130 9.3092 0.0755 27.6465
-
-Mode: llvm Compiler: llvm-gcc PCH: 1 Flags: -O0
-name avg min med max SD total
-user 0.8337 0.8288 0.8288 0.8444 0.0076 2.5011
- sys 0.8575 0.8484 0.8484 0.8773 0.0140 2.5725
-wall 1.7973 1.7406 1.7406 1.9054 0.0764 5.3919
-
-
-Mode: asm Compiler: clang PCH: 0 Flags: -O0
-name avg min med max SD total
-user 3.4909 3.4823 3.4896 3.4896 0.0077 10.4728
- sys 1.0997 1.1027 1.1028 1.1028 0.0043 3.2991
-wall 4.6332 4.6179 4.6483 4.6483 0.0124 13.8996
- Asm Lines: 46279
-
-Mode: asm Compiler: gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 6.8956 6.7882 6.9057 6.9929 0.0839 20.6868
- sys 1.7978 1.7703 1.7928 1.8302 0.0247 5.3933
-wall 8.7724 8.6360 8.7818 8.8994 0.1077 26.3172
- Asm Lines: 41008
-
-Mode: asm Compiler: llvm-gcc PCH: 0 Flags: -O0
-name avg min med max SD total
-user 7.2722 7.2087 7.3014 7.3014 0.0450 21.8167
- sys 1.8020 1.7828 1.8083 1.8083 0.0139 5.4060
-wall 9.1527 9.0609 9.2011 9.2011 0.0650 27.4582
- Asm Lines: 47243
-
-Mode: asm Compiler: gcc PCH: 1 Flags: -O0
-name avg min med max SD total
-user 1.0563 1.0337 1.0373 1.0979 0.0294 3.1689
- sys 1.0249 0.9862 0.9837 1.1048 0.0565 3.0747
-wall 2.1458 2.0764 2.0838 2.2772 0.0930 6.4374
- Asm Lines: 41001
-
-Mode: asm Compiler: llvm-gcc PCH: 1 Flags: -O0
-name avg min med max SD total
-user 0.9983 0.9929 0.9929 1.0110 0.0090 2.9950
- sys 0.8616 0.8525 0.8525 0.8822 0.0146 2.5849
-wall 1.9268 1.9061 1.9061 1.9632 0.0259 5.7804
- Asm Lines: 47238
-
-
-Mode: llvm Compiler: clang PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 3.4344 3.3999 3.4302 3.4730 0.0300 10.3032
- sys 1.1155 1.0881 1.1394 1.1191 0.0211 3.3466
-wall 4.5875 4.5279 4.6054 4.6292 0.0432 13.7626
-
-Mode: llvm Compiler: llvm-gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 7.5996 7.5021 7.5389 7.7578 0.1129 22.7988
- sys 1.8546 1.8469 1.8262 1.8908 0.0270 5.5639
-wall 9.5392 9.4246 9.4575 9.7353 0.1394 28.6175
-
-Mode: llvm Compiler: llvm-gcc PCH: 1 Flags: -O0 -g
-name avg min med max SD total
-user 1.1556 1.1512 1.1542 1.1542 0.0042 3.4667
- sys 0.9021 0.8890 0.8971 0.8971 0.0131 2.7062
-wall 2.1308 2.1126 2.1487 2.1487 0.0147 6.3924
-
-
-Mode: asm Compiler: clang PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 3.6020 3.5895 3.5904 3.6259 0.0169 10.8059
- sys 1.0967 1.0879 1.0879 1.1143 0.0124 3.2901
-wall 4.7362 4.7169 4.7182 4.7736 0.0264 14.2087
- Asm Lines: 106056
-
-Mode: asm Compiler: gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 8.0264 7.8409 8.0350 8.2033 0.1481 24.0792
- sys 2.0315 1.9767 2.0315 2.0864 0.0448 6.0946
-wall 10.1477 9.9000 10.1584 10.3846 0.1980 30.4430
- Asm Lines: 177342
-
-Mode: asm Compiler: llvm-gcc PCH: 0 Flags: -O0 -g
-name avg min med max SD total
-user 7.8449 7.8189 7.8471 7.8687 0.0204 23.5346
- sys 1.8727 1.8768 1.8539 1.8874 0.0140 5.6181
-wall 9.8164 9.7803 9.8029 9.8661 0.0363 29.4492
- Asm Lines: 203358
-
-Mode: asm Compiler: gcc PCH: 1 Flags: -O0 -g
-name avg min med max SD total
-user 1.2216 1.2137 1.2168 1.2342 0.0090 3.6647
- sys 1.1771 1.1627 1.1630 1.2055 0.0201 3.5312
-wall 2.4619 2.4419 2.4429 2.5008 0.0275 7.3856
- Asm Lines: 177335
-
-Mode: asm Compiler: llvm-gcc PCH: 1 Flags: -O0 -g
-name avg min med max SD total
-user 1.3980 1.3682 1.3688 1.4569 0.0416 4.1939
- sys 0.9354 0.8951 0.9181 0.9930 0.0418 2.8062
-wall 2.4380 2.3312 2.3606 2.6224 0.1309 7.3141
- Asm Lines: 203353
-
-
- Done: 2008-10-31_17-08
diff --git a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch.png b/contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch.png
deleted file mode 100644
index 5ce3b11..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2008-10-31/sketch.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.pdf b/contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.pdf
deleted file mode 100644
index 0b2e610..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.pdf
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.png b/contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.png
deleted file mode 100644
index 4ae08e1..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.txt b/contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.txt
deleted file mode 100644
index f965e97..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/176.gcc.txt
+++ /dev/null
@@ -1,1120 +0,0 @@
-ccc_path = """/Volumes/Data/ddunbar/llvm.install/bin/ccc"""
-ccc_clang = """/Volumes/Data/ddunbar/zorg/xcb_scripts/cc/xcc.fb"""
-ccc_gcc = """/Volumes/Data/ddunbar/zorg/xcb_scripts/cc/xcc.fb -ccc-no-clang"""
-gcc = """/usr/bin/gcc-4.2"""
-ccc_clang_info = """
-ccc version 1.0 (https://ddunbar@llvm.org/svn/llvm-project/cfe/trunk)
- "/Volumes/Data/ddunbar/llvm.install/bin/clang" "-S" "-disable-free" "--relocation-model=pic" "--disable-fp-elim" "--nozero-initialized-in-bss" "--unwind-tables=1" "--mcpu=core2" "--fmath-errno=0" "-mmacosx-version-min=10.6.0" "-arch" "x86_64" "-o" "/tmp/tmp62ee6x.s" "-x" "c" "/dev/null"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/tmp/tmpyLxO26.o" "/tmp/tmp62ee6x.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.5.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/tmp/tmpyLxO26.o" "-lgcc_s.10.5" "-lgcc" "-lSystem"
-"""
-ccc_gcc_info = """
-ccc version 1.0 (https://ddunbar@llvm.org/svn/llvm-project/cfe/trunk)
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1" "-quiet" "-imultilib" "x86_64" "-D__DYNAMIC__" "/dev/null" "-fPIC" "-quiet" "-dumpbase" "null" "-mmacosx-version-min=10.6.0" "-m64" "-mtune=core2" "-auxbase" "null" "-o" "/tmp/tmpDx0Rtr.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/tmp/tmpNbvYrM.o" "/tmp/tmpDx0Rtr.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.5.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/tmp/tmpNbvYrM.o" "-lgcc_s.10.5" "-lgcc" "-lSystem"
-"""
-gcc_info = """
-Using built-in specs.
-Target: i686-apple-darwin10
-Configured with: /var/tmp/gcc/gcc-5641~3/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
-Thread model: posix
-gcc version 4.2.1 (Apple Inc. build 5641)
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1" "-quiet" "-imultilib" "x86_64" "-D__DYNAMIC__" "/dev/null" "-fPIC" "-quiet" "-dumpbase" "null" "-mmacosx-version-min=10.6.0" "-m64" "-mtune=core2" "-auxbase" "null" "-o" "/var/tmp//ccDnCoVC.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/var/tmp//ccwsOXBR.o" "/var/tmp//ccDnCoVC.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.6.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/var/tmp//ccwsOXBR.o" "-lgcc" "-lSystem"
-"""
-style = """make"""
-runs = []
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.041626, 0.067272, 0.122191),
- (1, 0.041643, 0.067045, 0.122192),
- (2, 0.041655, 0.067055, 0.121649),
- (3, 0.041562, 0.066648, 0.121432),
- (4, 0.041613, 0.066810, 0.121305),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.041606, 0.066993, 0.121704),
- (1, 0.041581, 0.066630, 0.121471),
- (2, 0.041602, 0.066922, 0.121765),
- (3, 0.041581, 0.066859, 0.121405),
- (4, 0.041689, 0.066980, 0.124326),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.041675, 0.067138, 0.121728),
- (1, 0.041612, 0.066859, 0.121205),
- (2, 0.041580, 0.066483, 0.120964),
- (3, 0.041594, 0.066483, 0.120985),
- (4, 0.041568, 0.066532, 0.120499),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.186639, 1.937014, 4.437061),
- (1, 2.186681, 1.945610, 4.433872),
- (2, 2.188041, 1.947231, 4.462319),
- (3, 2.188190, 1.943516, 4.470365),
- (4, 2.187020, 1.950682, 4.436890),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.195748, 1.947951, 4.443053),
- (1, 2.194402, 1.940449, 4.432535),
- (2, 2.195423, 1.943498, 4.447053),
- (3, 2.196253, 1.950332, 4.448664),
- (4, 2.195660, 1.942226, 4.437071),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.136111, 0.313413, 0.499384),
- (1, 0.136203, 0.313310, 0.500697),
- (2, 0.136639, 0.314917, 0.558877),
- (3, 0.136173, 0.313843, 0.501008),
- (4, 0.135965, 0.312723, 0.498594),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.819676, 2.374582, 5.801642),
- (1, 2.819568, 2.375962, 5.525720),
- (2, 2.819725, 2.377977, 5.526612),
- (3, 2.819563, 2.374766, 5.525245),
- (4, 2.820020, 2.378179, 5.531853),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.979842, 2.393759, 5.773241),
- (1, 2.978360, 2.388217, 5.699588),
- (2, 2.979615, 2.392749, 5.713015),
- (3, 2.978055, 2.388861, 5.697303),
- (4, 2.979260, 2.390138, 5.710568),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.525414, 2.495433, 6.457547),
- (1, 3.523990, 2.498728, 6.378505),
- (2, 3.523183, 2.492712, 6.370535),
- (3, 3.523363, 2.494413, 6.376960),
- (4, 3.525216, 2.501657, 6.413753),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.143927, 2.857721, 9.407785),
- (1, 6.144766, 2.871091, 9.396498),
- (2, 6.143893, 2.860256, 9.392155),
- (3, 6.146454, 2.866420, 9.447510),
- (4, 6.146771, 2.864488, 9.664806),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.975961, 1.044303, 5.199328),
- (1, 3.976843, 1.044060, 5.209434),
- (2, 3.976622, 1.043787, 5.223585),
- (3, 3.975836, 1.043403, 5.198575),
- (4, 3.975980, 1.035674, 5.196275),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 5.707728, 2.859466, 9.115580),
- (1, 5.709064, 2.858221, 9.094858),
- (2, 5.707868, 2.868881, 9.006296),
- (3, 5.706836, 2.856589, 8.998487),
- (4, 5.706603, 2.857047, 9.028045),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.855523, 3.041195, 11.679531),
- (1, 7.855184, 3.046897, 11.389012),
- (2, 7.855530, 3.039149, 11.435265),
- (3, 7.856299, 3.037483, 11.382391),
- (4, 7.854147, 3.043133, 11.373174),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.926280, 3.168833, 14.542014),
- (1, 10.931726, 3.174573, 14.573554),
- (2, 10.933809, 3.163183, 14.857843),
- (3, 10.927966, 3.164824, 14.543822),
- (4, 10.927423, 3.166222, 14.658131),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.755856, 1.342961, 10.311273),
- (1, 8.756782, 1.346296, 10.314137),
- (2, 8.760167, 1.338744, 10.442545),
- (3, 8.759031, 1.346241, 10.333765),
- (4, 8.758174, 1.339294, 10.328992),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.159773, 3.431851, 13.319311),
- (1, 9.156190, 3.421113, 13.203571),
- (2, 9.157752, 3.417859, 13.220865),
- (3, 9.156178, 3.413504, 13.204341),
- (4, 9.150167, 3.412242, 13.252471),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 12.062994, 3.497204, 16.184210),
- (1, 12.065757, 3.486858, 16.503552),
- (2, 12.063830, 3.499430, 16.171503),
- (3, 12.065427, 3.500838, 16.268848),
- (4, 12.063384, 3.503007, 16.164980),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.836694, 1.570806, 11.863629),
- (1, 9.835162, 1.580921, 11.762224),
- (2, 9.836416, 1.572111, 11.893337),
- (3, 9.835066, 1.571860, 11.751330),
- (4, 9.836771, 1.575158, 11.783299),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.262905, 3.437217, 13.459870),
- (1, 9.262539, 3.446216, 13.349994),
- (2, 9.260750, 3.445077, 13.357125),
- (3, 9.263932, 3.448647, 13.366228),
- (4, 9.258133, 3.443125, 13.369278),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 12.163348, 3.513017, 16.559292),
- (1, 12.159476, 3.526493, 16.430252),
- (2, 12.157784, 3.513763, 16.306505),
- (3, 12.159307, 3.530832, 16.495815),
- (4, 12.160843, 3.516564, 16.331499),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.945925, 1.592199, 11.971326),
- (1, 9.944375, 1.603629, 11.899797),
- (2, 9.945863, 1.601172, 11.917642),
- (3, 9.946878, 1.601530, 12.113196),
- (4, 9.943168, 1.596300, 11.910257),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.042234, 0.072110, 0.068216),
- (1, 0.042155, 0.071582, 0.067917),
- (2, 0.042120, 0.071280, 0.067838),
- (3, 0.042134, 0.071281, 0.067688),
- (4, 0.042182, 0.071185, 0.068571),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.042195, 0.072394, 0.067753),
- (1, 0.042154, 0.071378, 0.067667),
- (2, 0.042126, 0.071503, 0.067645),
- (3, 0.042142, 0.071525, 0.067641),
- (4, 0.042137, 0.071263, 0.067512),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.042117, 0.071863, 0.067866),
- (1, 0.042095, 0.071587, 0.067778),
- (2, 0.042123, 0.071824, 0.067718),
- (3, 0.042017, 0.071448, 0.067336),
- (4, 0.042098, 0.071669, 0.067649),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.312764, 2.250083, 2.579668),
- (1, 2.313524, 2.255599, 2.581617),
- (2, 2.314576, 2.236269, 2.751308),
- (3, 2.313798, 2.247632, 2.576000),
- (4, 2.308146, 2.127675, 2.449384),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.319161, 2.248583, 2.579843),
- (1, 2.320569, 2.254949, 2.582595),
- (2, 2.319615, 2.254838, 2.582868),
- (3, 2.317640, 2.234440, 2.566378),
- (4, 2.319468, 2.253768, 2.582185),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.138760, 0.342468, 0.274713),
- (1, 0.138529, 0.338083, 0.270603),
- (2, 0.138419, 0.339997, 0.272035),
- (3, 0.138474, 0.339942, 0.271676),
- (4, 0.138476, 0.339545, 0.271208),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.927601, 2.621882, 3.040263),
- (1, 2.928817, 2.618327, 3.042979),
- (2, 2.925842, 2.616328, 3.034669),
- (3, 2.933845, 2.642455, 3.077028),
- (4, 2.947212, 2.620121, 3.167388),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.095391, 2.632837, 3.130378),
- (1, 3.096120, 2.626309, 3.120448),
- (2, 3.095708, 2.622912, 3.125333),
- (3, 3.096435, 2.628234, 3.124718),
- (4, 3.095836, 2.623590, 3.124194),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.674570, 2.716479, 3.444615),
- (1, 3.673243, 2.720120, 3.443432),
- (2, 3.673080, 2.709820, 3.443546),
- (3, 3.673200, 2.709185, 3.426130),
- (4, 3.670534, 2.711744, 3.427015),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.389665, 3.072630, 4.983543),
- (1, 6.385878, 3.080763, 4.975980),
- (2, 6.389956, 3.069652, 4.982242),
- (3, 6.388396, 3.078156, 4.977871),
- (4, 6.391305, 3.090905, 4.994381),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.079359, 1.112710, 2.692685),
- (1, 4.077052, 1.114109, 2.689234),
- (2, 4.078218, 1.119202, 2.693919),
- (3, 4.077124, 1.108491, 2.690559),
- (4, 4.077296, 1.112142, 2.684408),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.043907, 3.082369, 4.874229),
- (1, 6.044110, 3.072240, 4.860724),
- (2, 6.049991, 3.085666, 4.927778),
- (3, 6.050681, 3.087747, 4.866959),
- (4, 6.046383, 3.081174, 4.865700),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.277376, 3.241075, 6.041627),
- (1, 8.274767, 3.246052, 6.032635),
- (2, 8.273632, 3.240323, 6.034355),
- (3, 8.283322, 3.235898, 6.055232),
- (4, 8.279572, 3.237813, 6.040545),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 11.267468, 3.368598, 7.582008),
- (1, 11.264991, 3.356817, 7.573902),
- (2, 11.258736, 3.371794, 7.616322),
- (3, 11.272174, 3.375177, 7.750662),
- (4, 11.265369, 3.355828, 7.569228),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.948892, 1.408841, 5.346675),
- (1, 8.947425, 1.388794, 5.341078),
- (2, 8.959290, 1.397633, 5.703015),
- (3, 8.948915, 1.391639, 5.351654),
- (4, 8.946706, 1.404458, 5.345449),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.576401, 3.659016, 6.972346),
- (1, 9.577255, 3.641158, 6.953448),
- (2, 9.572443, 3.647954, 7.051130),
- (3, 9.571615, 3.646782, 6.956555),
- (4, 9.572963, 3.653229, 6.957711),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 12.425333, 3.720605, 8.468826),
- (1, 12.420657, 3.729020, 8.648778),
- (2, 12.424221, 3.709511, 8.467562),
- (3, 12.425595, 3.726297, 8.449276),
- (4, 12.422584, 3.718660, 8.713483),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.042865, 1.647364, 6.147098),
- (1, 10.038624, 1.646965, 6.107788),
- (2, 10.036193, 1.643319, 6.100944),
- (3, 10.037764, 1.637319, 6.121365),
- (4, 10.044532, 1.648919, 6.354301),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.686781, 3.657538, 7.098294),
- (1, 9.679355, 3.674326, 7.109849),
- (2, 9.678938, 3.659032, 7.093127),
- (3, 9.683371, 3.655282, 7.396885),
- (4, 9.677578, 3.661111, 7.086666),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 12.511083, 3.753316, 8.574587),
- (1, 12.517391, 3.745202, 8.579089),
- (2, 12.515167, 3.747517, 8.906780),
- (3, 12.510503, 3.744116, 8.561728),
- (4, 12.516263, 3.740046, 8.578455),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.139224, 1.659640, 6.213839),
- (1, 10.144829, 1.668260, 6.423697),
- (2, 10.144182, 1.670476, 6.213931),
- (3, 10.144068, 1.658834, 6.211693),
- (4, 10.138223, 1.667654, 6.222308),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.044057, 0.093485, 0.045956),
- (1, 0.044004, 0.092769, 0.045605),
- (2, 0.043901, 0.092551, 0.045247),
- (3, 0.043818, 0.091785, 0.045295),
- (4, 0.043924, 0.091899, 0.045216),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.043938, 0.092531, 0.045317),
- (1, 0.043985, 0.092990, 0.045413),
- (2, 0.043847, 0.091943, 0.044986),
- (3, 0.043889, 0.091626, 0.045207),
- (4, 0.043936, 0.091446, 0.045068),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.043935, 0.092137, 0.045550),
- (1, 0.044036, 0.092432, 0.045443),
- (2, 0.043907, 0.092597, 0.045207),
- (3, 0.043906, 0.092773, 0.045220),
- (4, 0.043932, 0.092273, 0.045162),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.510229, 2.524326, 1.447378),
- (1, 2.511153, 2.582682, 1.463158),
- (2, 2.509131, 2.551808, 1.443700),
- (3, 2.530506, 2.606601, 1.631594),
- (4, 2.525546, 2.556516, 1.460912),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.519330, 2.572381, 1.455862),
- (1, 2.519059, 2.662137, 1.521106),
- (2, 2.506144, 2.556738, 1.456221),
- (3, 2.511366, 2.577441, 1.459606),
- (4, 2.526218, 2.553722, 1.574747),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.147023, 0.430956, 0.176525),
- (1, 0.147430, 0.429136, 0.175834),
- (2, 0.146893, 0.428812, 0.175145),
- (3, 0.147174, 0.429968, 0.175169),
- (4, 0.147492, 0.431385, 0.174682),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.167799, 3.158706, 1.805685),
- (1, 3.167239, 3.135936, 1.802571),
- (2, 3.157960, 3.130196, 1.803330),
- (3, 3.146711, 3.153077, 1.813078),
- (4, 3.149927, 3.152081, 1.801526),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.342516, 3.109718, 1.823208),
- (1, 3.353297, 3.103074, 1.819566),
- (2, 3.333260, 3.149734, 1.829796),
- (3, 3.338234, 3.103725, 1.822010),
- (4, 3.336550, 3.100652, 1.832110),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.970523, 3.209725, 1.991844),
- (1, 3.937210, 3.198855, 1.976041),
- (2, 3.955488, 3.206959, 1.989544),
- (3, 3.946574, 3.198149, 1.980601),
- (4, 3.948581, 3.205880, 1.983994),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.732216, 3.619584, 2.782476),
- (1, 6.745420, 3.616948, 2.790903),
- (2, 6.750526, 3.594650, 2.790881),
- (3, 6.738845, 3.612443, 2.790569),
- (4, 6.747457, 3.617553, 2.788687),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.194680, 1.292044, 1.444048),
- (1, 4.190321, 1.300927, 1.441506),
- (2, 4.198820, 1.293219, 1.444174),
- (3, 4.209445, 1.289162, 1.447259),
- (4, 4.187489, 1.282234, 1.440277),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.517757, 3.615464, 2.854763),
- (1, 6.519460, 3.617775, 2.756124),
- (2, 6.498704, 3.602169, 2.756365),
- (3, 6.509982, 3.621462, 2.745702),
- (4, 6.489827, 3.608797, 2.747793),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.825143, 3.794072, 3.362608),
- (1, 8.824013, 3.765690, 3.355471),
- (2, 8.813541, 3.783641, 3.357039),
- (3, 8.786371, 3.786659, 3.345793),
- (4, 8.772730, 3.771638, 3.454307),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 11.738484, 3.836784, 4.120546),
- (1, 11.739288, 3.848616, 4.125808),
- (2, 11.738261, 3.837534, 4.136642),
- (3, 11.735003, 3.844597, 4.120444),
- (4, 11.761638, 3.862457, 4.145417),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.155087, 1.561075, 2.833868),
- (1, 9.154934, 1.538791, 2.833134),
- (2, 9.183035, 1.553281, 2.902132),
- (3, 9.151130, 1.546822, 2.879777),
- (4, 9.151844, 1.542450, 2.825560),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.166988, 4.242308, 3.894601),
- (1, 10.218686, 4.265537, 3.896997),
- (2, 10.208211, 4.256174, 3.905990),
- (3, 10.182169, 4.254989, 4.094963),
- (4, 10.165336, 4.239672, 3.873703),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 12.960833, 4.319633, 4.628599),
- (1, 12.997509, 4.323695, 4.942418),
- (2, 12.940625, 4.326994, 4.624419),
- (3, 12.947641, 4.300034, 4.597456),
- (4, 12.942562, 4.308688, 4.619190),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.300396, 1.823967, 3.250894),
- (1, 10.305252, 1.822285, 3.244746),
- (2, 10.307011, 1.845773, 3.260861),
- (3, 10.319953, 1.831435, 3.500671),
- (4, 10.320805, 1.834782, 3.246639),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.297812, 4.264184, 4.013061),
- (1, 10.315407, 4.293257, 4.021099),
- (2, 10.257966, 4.265659, 4.006248),
- (3, 10.307857, 4.273741, 4.044614),
- (4, 10.273398, 4.260286, 4.216469),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 13.040233, 4.302015, 4.719135),
- (1, 13.046999, 4.316412, 5.773880),
- (2, 13.081143, 4.324329, 4.745519),
- (3, 13.025611, 4.311093, 4.738916),
- (4, 13.063041, 4.336277, 4.771969),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.419745, 1.855515, 3.343652),
- (1, 10.447391, 1.858839, 3.374031),
- (2, 10.428436, 1.866242, 3.381289),
- (3, 10.428931, 1.879273, 3.582034),
- (4, 10.410715, 1.836761, 3.371333),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.044629, 0.104236, 0.047124),
- (1, 0.044357, 0.101072, 0.046054),
- (2, 0.044261, 0.099350, 0.045512),
- (3, 0.044279, 0.099032, 0.045401),
- (4, 0.044291, 0.098233, 0.045262),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.044388, 0.101047, 0.045972),
- (1, 0.044267, 0.100816, 0.045836),
- (2, 0.044319, 0.100931, 0.045829),
- (3, 0.044242, 0.102208, 0.046286),
- (4, 0.044197, 0.101894, 0.046310),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.044199, 0.099476, 0.045336),
- (1, 0.044064, 0.099032, 0.045431),
- (2, 0.044081, 0.097169, 0.044910),
- (3, 0.044055, 0.099088, 0.044957),
- (4, 0.044322, 0.099454, 0.045563),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.768949, 3.566605, 1.008622),
- (1, 2.753933, 3.515221, 1.011067),
- (2, 2.790210, 3.581213, 1.006835),
- (3, 2.742393, 3.612996, 1.065939),
- (4, 2.783563, 3.457715, 0.977203),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.803126, 3.542212, 1.140376),
- (1, 2.794538, 3.523127, 1.000266),
- (2, 2.821545, 3.533185, 0.996633),
- (3, 2.754702, 3.604113, 1.127400),
- (4, 2.773800, 3.590831, 1.023085),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.162694, 0.629660, 0.131824),
- (1, 0.162231, 0.630903, 0.131937),
- (2, 0.162713, 0.636833, 0.133010),
- (3, 0.163527, 0.627696, 0.130973),
- (4, 0.162591, 0.628073, 0.128269),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.398995, 4.386961, 1.222372),
- (1, 3.433913, 4.302404, 1.191109),
- (2, 3.403972, 4.249079, 1.179600),
- (3, 3.430418, 4.241026, 1.173406),
- (4, 3.405708, 4.295249, 1.192367),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.589608, 4.234909, 1.206952),
- (1, 3.595580, 4.250801, 1.195809),
- (2, 3.598782, 4.186360, 1.189533),
- (3, 3.576135, 4.210771, 1.192198),
- (4, 3.596508, 4.272774, 1.195682),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.188318, 4.323380, 1.272841),
- (1, 4.204432, 4.301331, 1.276169),
- (2, 4.232123, 4.359346, 1.308850),
- (3, 4.254709, 4.295013, 1.277959),
- (4, 4.214074, 4.293825, 1.275462),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.056727, 4.672983, 1.677022),
- (1, 7.064183, 4.697158, 1.685536),
- (2, 7.013256, 4.653804, 1.669026),
- (3, 7.077917, 4.720479, 1.692836),
- (4, 7.028864, 4.654591, 1.674130),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.250811, 1.598520, 0.822128),
- (1, 4.255341, 1.616523, 0.819562),
- (2, 4.282720, 1.628032, 0.823764),
- (3, 4.296236, 1.628292, 0.828753),
- (4, 4.263254, 1.614337, 0.822968),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.828563, 4.698920, 1.665128),
- (1, 6.887088, 4.678607, 1.660858),
- (2, 6.867776, 4.703203, 1.657673),
- (3, 6.841523, 4.645255, 1.637169),
- (4, 6.904172, 4.682556, 1.690968),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.164624, 4.728257, 2.026243),
- (1, 9.258789, 4.757386, 1.996115),
- (2, 9.215979, 4.740186, 1.995604),
- (3, 9.241390, 4.750833, 2.007054),
- (4, 9.161773, 4.742841, 1.987729),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 12.113609, 4.726450, 2.385739),
- (1, 12.121322, 4.784194, 2.416434),
- (2, 12.095256, 4.762198, 2.394130),
- (3, 12.125848, 4.743744, 2.386863),
- (4, 12.117883, 4.759723, 2.384746),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.196017, 1.794764, 1.538604),
- (1, 9.293693, 1.830825, 1.559088),
- (2, 9.210498, 1.813935, 1.538989),
- (3, 9.207860, 1.799598, 1.536893),
- (4, 9.202729, 1.797648, 1.530905),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.574802, 5.298921, 2.539728),
- (1, 10.657320, 5.376201, 2.329437),
- (2, 10.650595, 5.345177, 2.311878),
- (3, 10.611628, 5.366770, 2.319432),
- (4, 10.599574, 5.358888, 2.479782),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 13.432160, 5.417611, 2.691172),
- (1, 13.443341, 5.377409, 2.678012),
- (2, 13.343336, 5.338212, 2.812471),
- (3, 13.333183, 5.333529, 2.687594),
- (4, 13.384371, 5.414969, 2.837339),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.381974, 2.152140, 1.786428),
- (1, 10.378996, 2.143003, 1.774503),
- (2, 10.453921, 2.187323, 1.794154),
- (3, 10.398109, 2.212740, 2.013101),
- (4, 10.435604, 2.197729, 1.779200),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.786656, 5.383657, 2.435159),
- (1, 10.689933, 5.362047, 2.435158),
- (2, 10.761754, 5.406655, 2.462640),
- (3, 10.760319, 5.401706, 2.571526),
- (4, 10.666932, 5.361587, 2.444485),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 13.519919, 5.421898, 2.821722),
- (1, 13.447262, 5.364940, 2.926024),
- (2, 13.464838, 5.369476, 2.802961),
- (3, 13.514555, 5.440290, 2.831226),
- (4, 13.443975, 5.410124, 2.947296),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.498388, 2.171118, 2.153460),
- (1, 10.524313, 2.175829, 1.899075),
- (2, 10.502688, 2.185754, 1.894639),
- (3, 10.498667, 2.201617, 1.888811),
- (4, 10.488970, 2.166527, 1.885400),
-]}
-))
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.pdf b/contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.pdf
deleted file mode 100644
index 3b98a3d..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.pdf
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.png b/contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.png
deleted file mode 100644
index 3d1bc14..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.txt b/contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.txt
deleted file mode 100644
index d2270e4..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-03-02/sketch.txt
+++ /dev/null
@@ -1,2368 +0,0 @@
-ccc_path = """/Volumes/Data/ddunbar/llvm.install/bin/ccc"""
-ccc_clang = """/Volumes/Data/ddunbar/zorg/xcb_scripts/cc/xcc.fb"""
-ccc_gcc = """/Volumes/Data/ddunbar/zorg/xcb_scripts/cc/xcc.fb -ccc-no-clang"""
-gcc = """/usr/bin/gcc-4.2"""
-ccc_clang_info = """
-ccc version 1.0 (https://ddunbar@llvm.org/svn/llvm-project/cfe/trunk)
- "/Volumes/Data/ddunbar/llvm.install/bin/clang" "-S" "-disable-free" "--relocation-model=pic" "--disable-fp-elim" "--nozero-initialized-in-bss" "--unwind-tables=1" "--mcpu=core2" "--fmath-errno=0" "-mmacosx-version-min=10.6.0" "-arch" "x86_64" "-o" "/tmp/tmpugUQni.s" "-x" "c" "/dev/null"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/tmp/tmpH8AOZI.o" "/tmp/tmpugUQni.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.5.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/tmp/tmpH8AOZI.o" "-lgcc_s.10.5" "-lgcc" "-lSystem"
-"""
-ccc_gcc_info = """
-ccc version 1.0 (https://ddunbar@llvm.org/svn/llvm-project/cfe/trunk)
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1" "-quiet" "-imultilib" "x86_64" "-D__DYNAMIC__" "/dev/null" "-fPIC" "-quiet" "-dumpbase" "null" "-mmacosx-version-min=10.6.0" "-m64" "-mtune=core2" "-auxbase" "null" "-o" "/tmp/tmpTiOyJZ.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/tmp/tmpTi0lCN.o" "/tmp/tmpTiOyJZ.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.5.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/tmp/tmpTi0lCN.o" "-lgcc_s.10.5" "-lgcc" "-lSystem"
-"""
-gcc_info = """
-Using built-in specs.
-Target: i686-apple-darwin10
-Configured with: /var/tmp/gcc/gcc-5630~5/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
-Thread model: posix
-gcc version 4.2.1 (Apple Inc. build 5630)
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1" "-quiet" "-imultilib" "x86_64" "-D__DYNAMIC__" "/dev/null" "-fPIC" "-quiet" "-dumpbase" "null" "-mmacosx-version-min=10.6.0" "-m64" "-mtune=core2" "-auxbase" "null" "-o" "/var/tmp//ccuvh82w.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/var/tmp//ccb3T8Fr.o" "/var/tmp//ccuvh82w.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.5.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/var/tmp//ccb3T8Fr.o" "-lgcc_s.10.5" "-lgcc" "-lSystem"
-"""
-style = """xcb"""
-runs = []
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.405425, 0.222438, 0.698198),
- (1, 0.403472, 0.218381, 0.695599),
- (2, 0.403354, 0.217344, 0.695414),
- (3, 0.403856, 0.218787, 0.703370),
- (4, 0.404353, 0.221186, 0.695619),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.393260, 0.212802, 0.656048),
- (1, 0.393075, 0.211285, 0.654796),
- (2, 0.394300, 0.213498, 0.695105),
- (3, 0.393851, 0.213657, 0.695272),
- (4, 0.395458, 0.213304, 0.695908),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.403360, 0.216918, 0.704434),
- (1, 0.403818, 0.219731, 0.696158),
- (2, 0.402206, 0.218530, 0.697751),
- (3, 0.403133, 0.218441, 0.695443),
- (4, 0.403311, 0.218882, 0.695080),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.395200, 0.213912, 0.696117),
- (1, 0.395331, 0.213822, 0.695887),
- (2, 0.395293, 0.212402, 0.697557),
- (3, 0.395446, 0.213684, 0.695732),
- (4, 0.394667, 0.213321, 0.656472),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.403665, 0.217763, 0.694820),
- (1, 0.403482, 0.217606, 0.695959),
- (2, 0.404965, 0.219817, 0.819840),
- (3, 0.404437, 0.217515, 0.695675),
- (4, 0.402886, 0.216456, 0.703275),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.393583, 0.212237, 0.655196),
- (1, 0.394063, 0.212744, 0.695220),
- (2, 0.393998, 0.212889, 0.695448),
- (3, 0.394364, 0.213507, 0.695090),
- (4, 0.395886, 0.214974, 0.696254),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.129656, 0.771133, 2.056006),
- (1, 1.129855, 0.772644, 2.055649),
- (2, 1.130559, 0.768629, 2.055976),
- (3, 1.130291, 0.769030, 2.059280),
- (4, 1.130861, 0.771000, 2.055720),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.086760, 0.741197, 1.976344),
- (1, 1.087919, 0.739640, 1.975560),
- (2, 1.087589, 0.739815, 2.015386),
- (3, 1.087730, 0.738847, 1.976232),
- (4, 1.088193, 0.739529, 2.016033),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.138506, 0.768675, 2.064631),
- (1, 1.138085, 0.770549, 2.097210),
- (2, 1.138889, 0.771511, 2.096435),
- (3, 1.138765, 0.770142, 2.064291),
- (4, 1.138779, 0.768611, 2.095530),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.096902, 0.741661, 2.015757),
- (1, 1.097165, 0.740449, 2.015432),
- (2, 1.096494, 0.740608, 2.016453),
- (3, 1.096410, 0.739960, 1.975427),
- (4, 1.096579, 0.743114, 2.016444),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.444144, 0.284384, 0.814217),
- (1, 0.445853, 0.286540, 0.816314),
- (2, 0.446338, 0.287002, 0.814997),
- (3, 0.445384, 0.284369, 0.823090),
- (4, 0.444071, 0.284531, 0.815854),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.435113, 0.278547, 0.817260),
- (1, 0.433108, 0.275659, 0.775024),
- (2, 0.434473, 0.276611, 0.784047),
- (3, 0.434224, 0.275786, 0.775677),
- (4, 0.433396, 0.276622, 0.775240),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_pch",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.328464, 0.973747, 2.577016),
- (1, 1.324318, 0.855290, 2.424347),
- (2, 1.323693, 0.856675, 2.416951),
- (3, 1.323004, 0.857324, 2.417132),
- (4, 1.323843, 0.856000, 2.415804),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_pch",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.748207, 1.141266, 4.576484),
- (1, 2.744640, 1.137930, 4.416237),
- (2, 2.745616, 1.136230, 4.495978),
- (3, 2.746108, 1.139037, 4.496219),
- (4, 2.746059, 1.137958, 4.416920),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_pch",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.051374, 0.650962, 3.144706),
- (1, 2.050914, 0.648174, 3.215974),
- (2, 2.050343, 0.649010, 3.176205),
- (3, 2.051910, 0.648745, 3.176613),
- (4, 2.051386, 0.648306, 3.217578),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.835919, 1.148648, 3.257076),
- (1, 1.835307, 1.146862, 3.264809),
- (2, 1.834812, 1.147964, 3.257005),
- (3, 1.835016, 1.144979, 3.256861),
- (4, 1.836571, 1.148836, 3.256094),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.288802, 1.569778, 4.095720),
- (1, 2.288176, 1.573356, 4.176816),
- (2, 2.287878, 1.573807, 4.096939),
- (3, 2.288041, 1.571541, 4.097750),
- (4, 2.288190, 1.569398, 4.097146),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.220738, 1.167367, 3.657062),
- (1, 2.219840, 1.170754, 3.657627),
- (2, 2.220897, 1.172925, 3.657043),
- (3, 2.221644, 1.167701, 3.656328),
- (4, 2.223199, 1.171444, 3.657134),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.717655, 1.602645, 4.536037),
- (1, 2.716324, 1.603188, 4.536210),
- (2, 2.718783, 1.605672, 4.576816),
- (3, 2.718146, 1.602360, 4.536958),
- (4, 2.718544, 1.606428, 4.577367),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.453390, 1.390902, 5.176330),
- (1, 3.453408, 1.394547, 5.176325),
- (2, 3.453141, 1.392043, 5.176946),
- (3, 3.457040, 1.390031, 5.257617),
- (4, 3.453262, 1.395063, 5.138977),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.077200, 1.866592, 6.223139),
- (1, 4.076044, 1.873001, 6.214158),
- (2, 4.079719, 1.869271, 6.235665),
- (3, 4.078223, 1.866927, 6.217922),
- (4, 4.076013, 1.867985, 6.204512),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.397072, 2.178746, 6.177185),
- (1, 3.397804, 2.167804, 6.177276),
- (2, 3.398193, 2.168075, 6.250655),
- (3, 3.397029, 2.165686, 6.184421),
- (4, 3.397568, 2.178013, 6.179279),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.486708, 2.445768, 10.254543),
- (1, 7.491379, 2.458432, 10.337225),
- (2, 7.486408, 2.433698, 10.257034),
- (3, 7.487016, 2.456457, 10.270939),
- (4, 7.487323, 2.439337, 10.258257),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.670173, 1.622433, 4.897808),
- (1, 2.666760, 1.609756, 4.776822),
- (2, 2.667040, 1.610998, 4.856885),
- (3, 2.671149, 1.594163, 4.816301),
- (4, 2.669699, 1.607578, 4.866539),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.803057, 1.908280, 8.963127),
- (1, 6.805076, 1.939662, 8.969825),
- (2, 6.802844, 1.921782, 8.970996),
- (3, 6.805031, 1.913186, 8.967523),
- (4, 6.805252, 1.919294, 8.959788),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.627373, 1.415978, 5.377556),
- (1, 3.625026, 1.415306, 5.337455),
- (2, 3.624699, 1.411942, 5.377834),
- (3, 3.627468, 1.422229, 5.376680),
- (4, 3.625721, 1.421354, 5.377509),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.249780, 1.891114, 6.438770),
- (1, 4.248041, 1.893114, 6.416578),
- (2, 4.248877, 1.890255, 6.422580),
- (3, 4.248459, 1.891867, 6.425267),
- (4, 4.251042, 1.896335, 6.438381),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.813308, 1.436255, 5.577048),
- (1, 3.812973, 1.436260, 5.577759),
- (2, 3.814667, 1.436329, 5.576892),
- (3, 3.814164, 1.439684, 5.577863),
- (4, 3.816874, 1.432057, 5.625098),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.438589, 1.914821, 6.634438),
- (1, 4.436802, 1.913064, 6.628424),
- (2, 4.438023, 1.918364, 6.632666),
- (3, 4.438494, 1.922851, 6.645062),
- (4, 4.439727, 1.920331, 6.685016),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.975290, 2.296164, 6.913135),
- (1, 3.977464, 2.309821, 6.916908),
- (2, 3.976537, 2.309954, 6.848258),
- (3, 3.977155, 2.305060, 7.357985),
- (4, 3.974276, 2.289059, 6.862249),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.928091, 2.684142, 11.969055),
- (1, 8.929295, 2.683263, 11.988445),
- (2, 8.929175, 2.678390, 11.956474),
- (3, 8.926613, 2.665122, 11.965071),
- (4, 8.926613, 2.680630, 11.964381),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.249871, 1.745454, 5.497846),
- (1, 3.249460, 1.737577, 5.538376),
- (2, 3.253966, 1.727548, 5.616847),
- (3, 3.251405, 1.725884, 5.496698),
- (4, 3.250563, 1.721386, 5.536694),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.249350, 2.147359, 10.672894),
- (1, 8.252421, 2.146136, 10.687439),
- (2, 8.252766, 2.142015, 10.683719),
- (3, 8.279512, 2.152184, 11.070527),
- (4, 8.250015, 2.161431, 10.703253),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.917675, 1.531758, 5.777717),
- (1, 3.917453, 1.532169, 5.777704),
- (2, 3.920630, 1.538518, 5.857605),
- (3, 3.917549, 1.535710, 5.776730),
- (4, 3.917673, 1.529128, 5.776450),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.536313, 2.003164, 6.831313),
- (1, 4.537451, 2.014513, 6.846562),
- (2, 4.540679, 2.016759, 6.865437),
- (3, 4.538081, 2.008899, 6.845811),
- (4, 4.538438, 2.009600, 6.836498),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.123486, 2.383752, 7.115483),
- (1, 4.127545, 2.372840, 7.151675),
- (2, 4.125900, 2.381678, 7.138942),
- (3, 4.123891, 2.369579, 7.127788),
- (4, 4.125164, 2.370661, 7.117664),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.076157, 2.771491, 12.341310),
- (1, 9.074681, 2.764608, 12.205139),
- (2, 9.076881, 2.766755, 12.228073),
- (3, 9.073910, 2.771638, 12.204252),
- (4, 9.076773, 2.777037, 12.235749),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.388061, 1.779190, 5.737793),
- (1, 3.387862, 1.790856, 5.697850),
- (2, 3.387800, 1.789477, 5.780238),
- (3, 3.387509, 1.788586, 5.743236),
- (4, 3.388152, 1.784450, 6.178092),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.376118, 2.205600, 10.877337),
- (1, 8.372512, 2.219382, 10.868894),
- (2, 8.375968, 2.225479, 10.996566),
- (3, 8.379525, 2.215791, 10.910221),
- (4, 8.375433, 2.210534, 10.890280),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.948571, 1.553366, 5.857777),
- (1, 3.946872, 1.549844, 5.817926),
- (2, 3.948643, 1.545410, 5.817794),
- (3, 3.947022, 1.548687, 5.816790),
- (4, 3.951557, 1.560511, 5.937022),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.568105, 2.037309, 6.888153),
- (1, 4.567872, 2.037818, 6.893678),
- (2, 4.569582, 2.037795, 6.894469),
- (3, 4.571991, 2.042292, 6.920444),
- (4, 4.568506, 2.036233, 6.895221),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.153075, 2.389230, 7.183219),
- (1, 4.150947, 2.401330, 7.175264),
- (2, 4.150807, 2.390926, 7.237253),
- (3, 4.152335, 2.393576, 7.265347),
- (4, 4.154240, 2.408743, 7.201345),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.104507, 2.799196, 12.284425),
- (1, 9.102214, 2.804734, 12.263326),
- (2, 9.102799, 2.797758, 12.263314),
- (3, 9.102472, 2.797718, 12.283471),
- (4, 9.101655, 2.799231, 12.257987),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.412096, 1.803347, 5.817859),
- (1, 3.412334, 1.792039, 5.897059),
- (2, 3.413608, 1.789291, 5.817810),
- (3, 3.413812, 1.785669, 5.827047),
- (4, 3.413291, 1.782601, 5.738213),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.402455, 2.228676, 10.943842),
- (1, 8.396442, 2.225608, 10.902714),
- (2, 8.401735, 2.220712, 10.918381),
- (3, 8.400619, 2.226284, 10.926158),
- (4, 8.398896, 2.221540, 10.901292),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.421126, 0.234655, 0.534969),
- (1, 0.418396, 0.232067, 0.536121),
- (2, 0.419512, 0.236062, 0.536636),
- (3, 0.420755, 0.236390, 0.535508),
- (4, 0.421343, 0.234614, 0.537189),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.411128, 0.230994, 0.499097),
- (1, 0.412593, 0.231427, 0.536123),
- (2, 0.407668, 0.229908, 0.495794),
- (3, 0.410890, 0.229289, 0.535618),
- (4, 0.412812, 0.229662, 0.535043),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.421792, 0.234957, 0.536236),
- (1, 0.421073, 0.235668, 0.538946),
- (2, 0.418909, 0.236416, 0.535464),
- (3, 0.420363, 0.235692, 0.535257),
- (4, 0.419598, 0.234400, 0.534633),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.409040, 0.230090, 0.534802),
- (1, 0.411753, 0.232552, 0.537293),
- (2, 0.415536, 0.231495, 0.536877),
- (3, 0.410714, 0.227612, 0.535090),
- (4, 0.409547, 0.230152, 0.497187),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.421181, 0.235033, 0.535407),
- (1, 0.420747, 0.236700, 0.535928),
- (2, 0.418786, 0.235032, 0.534312),
- (3, 0.420015, 0.233378, 0.535452),
- (4, 0.421154, 0.235218, 0.535269),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.411356, 0.231786, 0.537593),
- (1, 0.412772, 0.230723, 0.537039),
- (2, 0.410034, 0.228264, 0.494194),
- (3, 0.412693, 0.230932, 0.536339),
- (4, 0.411372, 0.228262, 0.497113),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.185856, 0.840347, 1.416460),
- (1, 1.186435, 0.854091, 1.415674),
- (2, 1.183343, 0.844916, 1.415643),
- (3, 1.181560, 0.857296, 1.415242),
- (4, 1.187699, 0.853918, 1.415647),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.138810, 0.818035, 1.335935),
- (1, 1.141064, 0.827249, 1.337062),
- (2, 1.138410, 0.811996, 1.335346),
- (3, 1.142644, 0.820159, 1.337486),
- (4, 1.138460, 0.815423, 1.335647),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.194684, 0.841290, 1.415885),
- (1, 1.195720, 0.844873, 1.416552),
- (2, 1.194440, 0.850513, 1.415595),
- (3, 1.191931, 0.850890, 1.414722),
- (4, 1.192481, 0.853052, 1.416102),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.148891, 0.817183, 1.335717),
- (1, 1.149617, 0.823096, 1.336040),
- (2, 1.149791, 0.805679, 1.337424),
- (3, 1.150876, 0.814239, 1.336748),
- (4, 1.153157, 0.809177, 1.336246),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.463514, 0.310817, 0.614767),
- (1, 0.464612, 0.310198, 0.618455),
- (2, 0.463460, 0.308990, 0.616282),
- (3, 0.463413, 0.311280, 0.617026),
- (4, 0.467009, 0.310382, 0.857752),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.453517, 0.301571, 0.575912),
- (1, 0.452100, 0.300588, 0.576359),
- (2, 0.448456, 0.297936, 0.575121),
- (3, 0.451645, 0.298907, 0.577323),
- (4, 0.450964, 0.301582, 0.574520),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_pch",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.381350, 0.944251, 1.776275),
- (1, 1.380373, 0.930919, 1.775617),
- (2, 1.379352, 0.937129, 1.736723),
- (3, 1.380977, 0.944068, 1.737369),
- (4, 1.381796, 0.938486, 1.776093),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_pch",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.805408, 1.220930, 3.697693),
- (1, 2.804236, 1.204836, 3.657105),
- (2, 2.803037, 1.210121, 3.696933),
- (3, 2.807280, 1.219531, 3.779261),
- (4, 2.802821, 1.208316, 3.736487),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_pch",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.076567, 0.672051, 2.896169),
- (1, 2.070465, 0.668786, 2.895749),
- (2, 2.077549, 0.673245, 2.896393),
- (3, 2.075634, 0.671026, 2.976119),
- (4, 2.074463, 0.671262, 2.975937),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.909827, 1.258607, 2.215806),
- (1, 1.910547, 1.261354, 2.255924),
- (2, 1.907436, 1.262299, 2.216659),
- (3, 1.908875, 1.254564, 2.256077),
- (4, 1.906568, 1.264632, 2.215638),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.384586, 1.708563, 2.495874),
- (1, 2.386876, 1.705256, 2.456596),
- (2, 2.383560, 1.707485, 2.456364),
- (3, 2.388580, 1.714631, 2.496008),
- (4, 2.383943, 1.709754, 2.455848),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.296978, 1.274825, 2.415106),
- (1, 2.303460, 1.279010, 2.456151),
- (2, 2.300862, 1.277879, 2.536542),
- (3, 2.297727, 1.277312, 2.416137),
- (4, 2.299045, 1.281014, 2.457338),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.823962, 1.752509, 2.738192),
- (1, 2.825617, 1.738546, 2.736478),
- (2, 2.825608, 1.744360, 2.735298),
- (3, 2.822577, 1.756988, 2.735053),
- (4, 2.828362, 1.751245, 2.737930),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.586428, 1.498329, 3.258357),
- (1, 3.581922, 1.510793, 3.258049),
- (2, 3.584574, 1.523963, 3.256754),
- (3, 3.585929, 1.525886, 3.296728),
- (4, 3.583339, 1.509529, 3.255773),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.249019, 2.030066, 3.658088),
- (1, 4.244427, 1.997319, 3.618002),
- (2, 4.247446, 2.034549, 3.656419),
- (3, 4.250734, 1.984081, 3.616241),
- (4, 4.247304, 2.029095, 3.656926),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.533690, 2.339185, 4.777496),
- (1, 3.542505, 2.348833, 4.697715),
- (2, 3.544757, 2.349717, 4.658518),
- (3, 3.542116, 2.342489, 4.697843),
- (4, 3.532830, 2.358614, 4.777230),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.911000, 2.638922, 5.859227),
- (1, 7.898019, 2.606325, 5.856922),
- (2, 7.905536, 2.635740, 5.857377),
- (3, 7.904312, 2.612189, 5.858381),
- (4, 7.905098, 2.630487, 5.896411),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.751623, 1.803556, 3.817713),
- (1, 2.747727, 1.810833, 3.816503),
- (2, 2.748505, 1.805853, 3.937231),
- (3, 2.751082, 1.785040, 3.856857),
- (4, 2.712181, 1.628194, 4.458047),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.130218, 2.046734, 5.375091),
- (1, 7.178329, 2.050762, 5.101087),
- (2, 7.169060, 2.043104, 5.099096),
- (3, 7.173283, 2.044239, 5.098124),
- (4, 7.175252, 2.051192, 5.098199),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.789165, 1.527458, 3.336326),
- (1, 3.777274, 1.538660, 3.375557),
- (2, 3.784557, 1.519313, 3.376128),
- (3, 3.787602, 1.522217, 3.335926),
- (4, 3.787288, 1.526795, 3.337409),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.447726, 2.033431, 3.740433),
- (1, 4.442726, 2.033703, 3.738224),
- (2, 4.442734, 2.032771, 3.738289),
- (3, 4.444849, 2.031724, 3.737305),
- (4, 4.447839, 2.041379, 3.737854),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.976113, 1.536616, 3.457503),
- (1, 3.982885, 1.550541, 3.459236),
- (2, 3.980745, 1.542500, 3.418313),
- (3, 3.983197, 1.534735, 3.416768),
- (4, 3.984319, 1.549369, 3.456912),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.646497, 2.058736, 3.857968),
- (1, 4.645902, 2.056331, 3.816948),
- (2, 4.644425, 2.042617, 3.817483),
- (3, 4.650170, 2.053945, 3.816996),
- (4, 4.652057, 2.054087, 3.817612),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.227559, 2.531595, 5.137862),
- (1, 4.227397, 2.523166, 5.177460),
- (2, 4.221999, 2.507393, 5.217410),
- (3, 4.222567, 2.526250, 5.217654),
- (4, 4.227901, 2.540431, 5.098870),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.519619, 2.893774, 6.844787),
- (1, 9.519173, 2.909991, 6.855886),
- (2, 9.510792, 2.877242, 6.838998),
- (3, 9.510783, 2.891383, 6.824785),
- (4, 9.519126, 2.885516, 6.833841),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.451087, 1.898383, 4.336398),
- (1, 3.449852, 1.892527, 4.337959),
- (2, 3.454374, 1.893303, 4.658079),
- (3, 3.455111, 1.882656, 4.378217),
- (4, 3.450626, 1.869007, 4.337978),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.787702, 2.320593, 6.058270),
- (1, 8.789275, 2.306274, 6.057923),
- (2, 8.784843, 2.316817, 6.057423),
- (3, 8.783675, 2.311861, 6.060013),
- (4, 8.781261, 2.313746, 6.057873),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.083893, 1.630474, 3.536216),
- (1, 4.087591, 1.635289, 3.497630),
- (2, 4.085695, 1.632900, 3.538942),
- (3, 4.091750, 1.621504, 3.537607),
- (4, 4.083429, 1.624206, 3.538044),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.741063, 2.114975, 3.939181),
- (1, 4.742471, 2.134199, 3.937271),
- (2, 4.751861, 2.134679, 3.937887),
- (3, 4.748915, 2.139128, 3.937938),
- (4, 4.744369, 2.118603, 4.016509),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.373580, 2.603582, 5.297729),
- (1, 4.375890, 2.576323, 5.258865),
- (2, 4.371432, 2.583884, 5.297363),
- (3, 4.374495, 2.589453, 5.257298),
- (4, 4.369606, 2.606228, 5.257661),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.661360, 2.976421, 7.177350),
- (1, 9.668097, 2.986125, 6.963308),
- (2, 9.667800, 2.983053, 6.959276),
- (3, 9.663941, 2.979323, 6.939242),
- (4, 9.662299, 2.970007, 6.988974),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.579784, 1.946620, 4.378033),
- (1, 3.579704, 1.964725, 4.377985),
- (2, 3.584964, 1.951670, 4.376971),
- (3, 3.576692, 1.920906, 4.418008),
- (4, 3.590239, 1.966765, 4.377119),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.908318, 2.358443, 6.137820),
- (1, 8.900847, 2.342913, 6.137705),
- (2, 8.902168, 2.355932, 6.179136),
- (3, 8.903369, 2.363490, 6.097751),
- (4, 8.896827, 2.364196, 6.098246),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.122590, 1.633583, 3.696664),
- (1, 4.114949, 1.638141, 3.578111),
- (2, 4.114996, 1.631617, 3.536742),
- (3, 4.118038, 1.641230, 3.578327),
- (4, 4.112972, 1.639592, 3.575918),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.774701, 2.146296, 3.977572),
- (1, 4.775361, 2.153011, 3.979860),
- (2, 4.767364, 2.152865, 4.057217),
- (3, 4.762550, 2.149360, 3.979342),
- (4, 4.778981, 2.139902, 3.978489),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.400574, 2.604084, 5.299578),
- (1, 4.404470, 2.623904, 5.338578),
- (2, 4.396282, 2.608549, 5.297828),
- (3, 4.410117, 2.614698, 5.340116),
- (4, 4.406122, 2.619452, 5.337443),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.691876, 2.983326, 7.028989),
- (1, 9.686101, 2.995257, 6.984466),
- (2, 9.699200, 2.989842, 7.028152),
- (3, 9.694729, 2.989742, 6.973924),
- (4, 9.684670, 2.977108, 6.989194),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.603234, 1.964083, 4.458006),
- (1, 3.607074, 1.941178, 4.417525),
- (2, 3.603034, 1.943612, 4.737094),
- (3, 3.602477, 1.935710, 4.378785),
- (4, 3.603014, 1.920944, 4.496731),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.919863, 2.380177, 6.178527),
- (1, 8.915304, 2.377547, 6.139442),
- (2, 8.912262, 2.361640, 6.382166),
- (3, 8.928109, 2.368477, 6.192743),
- (4, 8.926360, 2.372693, 6.196191),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.433816, 0.270779, 0.497217),
- (1, 0.435460, 0.270028, 0.496532),
- (2, 0.433553, 0.269600, 0.496135),
- (3, 0.444402, 0.277012, 0.497745),
- (4, 0.435023, 0.270357, 0.496884),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.427882, 0.266594, 0.456246),
- (1, 0.436036, 0.268734, 0.457465),
- (2, 0.432485, 0.268278, 0.495730),
- (3, 0.431188, 0.269520, 0.457981),
- (4, 0.429806, 0.265927, 0.457372),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.439986, 0.271715, 0.496550),
- (1, 0.433586, 0.270013, 0.496199),
- (2, 0.432029, 0.268060, 0.497939),
- (3, 0.439059, 0.272464, 0.497620),
- (4, 0.434181, 0.272563, 0.497461),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.432427, 0.269396, 0.457136),
- (1, 0.428288, 0.270302, 0.737128),
- (2, 0.431231, 0.268325, 0.456252),
- (3, 0.427926, 0.267086, 0.456874),
- (4, 0.420557, 0.264270, 0.457617),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.434424, 0.272190, 0.498161),
- (1, 0.434165, 0.269235, 0.494824),
- (2, 0.432662, 0.270415, 0.500255),
- (3, 0.438368, 0.274265, 0.496769),
- (4, 0.436696, 0.274610, 0.495729),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.433117, 0.267209, 0.457335),
- (1, 0.431207, 0.267527, 0.457362),
- (2, 0.427488, 0.263088, 0.456154),
- (3, 0.424716, 0.264632, 0.456745),
- (4, 0.430324, 0.266478, 0.457237),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.243380, 0.979720, 1.137169),
- (1, 1.278996, 0.992319, 1.137506),
- (2, 1.287192, 0.993761, 1.138362),
- (3, 1.287132, 0.979672, 1.137975),
- (4, 1.280673, 0.991069, 1.134803),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.199258, 0.944011, 1.056302),
- (1, 1.238243, 0.967198, 1.055378),
- (2, 1.251064, 0.952736, 1.058118),
- (3, 1.238275, 0.953812, 1.056281),
- (4, 1.230085, 0.961011, 1.058278),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.303555, 1.002749, 1.177122),
- (1, 1.297516, 0.987769, 1.179257),
- (2, 1.291316, 0.989683, 1.134877),
- (3, 1.297521, 0.998087, 1.177932),
- (4, 1.298070, 0.996104, 1.136646),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.242426, 0.951754, 1.054691),
- (1, 1.251845, 0.955747, 1.055754),
- (2, 1.216099, 0.939568, 1.057614),
- (3, 1.252534, 0.953115, 1.057181),
- (4, 1.255139, 0.957134, 1.056560),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.480008, 0.367388, 0.535985),
- (1, 0.482634, 0.363998, 0.537057),
- (2, 0.487524, 0.362915, 0.536461),
- (3, 0.486824, 0.371502, 0.536601),
- (4, 0.486100, 0.368487, 0.536231),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.471967, 0.356792, 0.537280),
- (1, 0.471389, 0.351906, 0.537328),
- (2, 0.476653, 0.364830, 0.536856),
- (3, 0.473745, 0.360644, 0.536245),
- (4, 0.471692, 0.358740, 0.536919),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_pch",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.488745, 1.084366, 1.498790),
- (1, 1.477772, 1.072057, 1.497152),
- (2, 1.481656, 1.079815, 1.497487),
- (3, 1.488131, 1.086291, 1.497713),
- (4, 1.484908, 1.083611, 1.497307),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_pch",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.892219, 1.358115, 3.416973),
- (1, 2.908085, 1.361083, 3.458190),
- (2, 2.911845, 1.363507, 3.498229),
- (3, 2.861631, 1.340626, 3.497350),
- (4, 2.902695, 1.349841, 3.498252),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_pch",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.094289, 0.731166, 2.856787),
- (1, 2.094159, 0.727149, 3.098345),
- (2, 2.099123, 0.725737, 2.857987),
- (3, 2.099356, 0.725484, 2.857824),
- (4, 2.092198, 0.722902, 2.856964),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.072042, 1.472173, 1.777206),
- (1, 2.082600, 1.489627, 1.777280),
- (2, 2.056884, 1.488123, 1.817614),
- (3, 2.070744, 1.497244, 1.776597),
- (4, 2.067240, 1.482836, 1.777571),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.533060, 2.043311, 1.777522),
- (1, 2.628373, 2.047752, 1.777593),
- (2, 2.630915, 2.051977, 1.777852),
- (3, 2.630455, 2.065881, 1.777911),
- (4, 2.631787, 2.049902, 1.778263),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.505337, 1.496155, 1.898006),
- (1, 2.495744, 1.488942, 1.897842),
- (2, 2.515831, 1.484552, 1.897723),
- (3, 2.498317, 1.488449, 1.897741),
- (4, 2.515904, 1.484614, 1.897771),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.125124, 2.066737, 1.896962),
- (1, 3.066430, 2.061710, 1.897127),
- (2, 2.951498, 2.032558, 1.899777),
- (3, 3.102248, 2.072226, 1.938907),
- (4, 2.965375, 2.034301, 1.901575),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.959637, 1.775658, 2.417471),
- (1, 3.731703, 1.768139, 2.338378),
- (2, 3.938876, 1.797903, 2.376989),
- (3, 3.942618, 1.776899, 2.376468),
- (4, 3.955662, 1.784850, 2.417537),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.711232, 2.418611, 2.457315),
- (1, 4.710700, 2.405150, 2.458243),
- (2, 4.701677, 2.393935, 2.458244),
- (3, 4.700064, 2.411945, 2.458502),
- (4, 4.435552, 2.373475, 2.417904),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.765235, 3.147148, 4.457806),
- (1, 3.792075, 3.092380, 4.138512),
- (2, 3.755530, 3.109232, 4.099198),
- (3, 3.775577, 3.132702, 4.259349),
- (4, 3.765380, 3.153395, 4.138279),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.733600, 3.141350, 3.819429),
- (1, 8.729315, 3.130464, 3.818712),
- (2, 8.758360, 3.153188, 3.898371),
- (3, 8.284330, 3.049157, 3.698701),
- (4, 8.287672, 3.024545, 3.697567),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.874930, 2.387032, 3.537592),
- (1, 2.912332, 2.467479, 3.577891),
- (2, 2.864476, 2.410851, 3.499089),
- (3, 2.907625, 2.451013, 3.618200),
- (4, 2.911261, 2.404477, 4.099524),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.915458, 2.450591, 3.219913),
- (1, 7.956233, 2.439542, 3.300366),
- (2, 7.913691, 2.473252, 3.218957),
- (3, 7.509113, 2.397069, 3.138018),
- (4, 7.904014, 2.456804, 3.218425),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.942240, 1.800567, 2.417458),
- (1, 4.154844, 1.814089, 2.457805),
- (2, 4.176584, 1.830900, 2.457020),
- (3, 4.158194, 1.830085, 2.778865),
- (4, 4.150232, 1.830750, 2.459318),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.905547, 2.434522, 2.537988),
- (1, 4.924605, 2.457269, 2.538644),
- (2, 4.657417, 2.378047, 2.458053),
- (3, 4.911690, 2.470984, 2.537993),
- (4, 4.929673, 2.455544, 2.538190),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.418219, 1.850523, 2.536990),
- (1, 4.366724, 1.852566, 2.538399),
- (2, 4.384926, 1.854429, 2.539958),
- (3, 4.394250, 1.842192, 2.539435),
- (4, 4.397239, 1.838145, 2.540060),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 5.130585, 2.493244, 2.579148),
- (1, 5.162982, 2.497135, 2.578713),
- (2, 5.129066, 2.472889, 2.619872),
- (3, 4.874468, 2.405774, 2.497419),
- (4, 5.128376, 2.467295, 2.578880),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.630875, 3.227827, 4.420094),
- (1, 4.603130, 3.292521, 4.698425),
- (2, 4.637749, 3.169974, 4.378697),
- (3, 4.662829, 3.216485, 4.459226),
- (4, 4.661186, 3.194321, 4.459337),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.094412, 3.382733, 4.299690),
- (1, 10.607728, 3.485426, 4.420339),
- (2, 10.672437, 3.500697, 4.499281),
- (3, 10.081432, 3.369802, 4.260940),
- (4, 10.637020, 3.507006, 4.419349),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.756469, 2.606486, 3.858024),
- (1, 3.742525, 2.585514, 3.860432),
- (2, 3.763984, 2.594155, 3.858338),
- (3, 3.750329, 2.597445, 3.861970),
- (4, 3.780330, 2.594397, 4.178249),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.783391, 2.778921, 3.858346),
- (1, 9.291026, 2.713206, 3.741779),
- (2, 9.763105, 2.769221, 3.818018),
- (3, 9.781831, 2.771892, 3.860051),
- (4, 9.795868, 2.814192, 3.861095),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.526822, 1.970779, 2.579904),
- (1, 4.516155, 1.962200, 2.579553),
- (2, 4.502726, 1.967558, 2.657639),
- (3, 4.475255, 1.944838, 2.578810),
- (4, 4.552333, 1.965428, 2.620439),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 5.260314, 2.603498, 2.660341),
- (1, 4.995161, 2.487917, 2.539731),
- (2, 5.272310, 2.582304, 2.619170),
- (3, 5.297074, 2.584287, 2.659045),
- (4, 5.276844, 2.591704, 2.658579),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.820446, 3.357945, 4.457265),
- (1, 4.695519, 3.299694, 4.700489),
- (2, 4.802906, 3.355605, 4.499002),
- (3, 4.790937, 3.298910, 4.497635),
- (4, 4.807253, 3.403019, 4.538081),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.775635, 3.627255, 4.498454),
- (1, 10.819002, 3.627111, 4.498795),
- (2, 10.777939, 3.603335, 4.579594),
- (3, 10.261991, 3.489692, 4.340296),
- (4, 10.783511, 3.603470, 4.497803),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.926690, 2.635944, 3.858194),
- (1, 3.904631, 2.622227, 3.819312),
- (2, 3.902995, 2.656935, 3.899565),
- (3, 3.842353, 2.559599, 3.939178),
- (4, 3.912334, 2.629019, 3.858092),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.417663, 2.778879, 3.779754),
- (1, 9.981881, 2.854902, 3.981156),
- (2, 9.922719, 2.849422, 3.895627),
- (3, 9.932923, 2.851789, 3.899661),
- (4, 9.882651, 2.809967, 3.860299),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.524352, 1.986189, 2.979131),
- (1, 4.571793, 1.979632, 2.617329),
- (2, 4.551874, 1.976839, 2.657311),
- (3, 4.535069, 1.982461, 2.660565),
- (4, 4.517949, 1.967234, 2.619985),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 5.308971, 2.608535, 2.660880),
- (1, 5.300322, 2.591561, 2.698928),
- (2, 5.007866, 2.516937, 2.617425),
- (3, 5.004273, 2.518780, 2.620204),
- (4, 5.298584, 2.603459, 2.697609),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.829605, 3.306560, 4.499574),
- (1, 4.834964, 3.359516, 4.499708),
- (2, 4.848950, 3.406535, 4.500607),
- (3, 4.846305, 3.301867, 4.501270),
- (4, 4.841747, 3.311314, 4.460786),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.261230, 3.487758, 4.377307),
- (1, 10.821449, 3.608144, 4.579734),
- (2, 10.818690, 3.639902, 4.538873),
- (3, 10.288671, 3.520532, 4.378760),
- (4, 10.827655, 3.621076, 4.540632),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.945245, 2.727926, 4.020004),
- (1, 3.927023, 2.718237, 3.937944),
- (2, 3.864097, 2.645215, 4.258710),
- (3, 3.959593, 2.659668, 3.857486),
- (4, 3.949860, 2.636461, 3.860314),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.988320, 2.894515, 3.979462),
- (1, 9.984554, 2.865497, 3.978603),
- (2, 9.969262, 2.894911, 3.940909),
- (3, 9.971215, 2.860655, 3.939045),
- (4, 9.928752, 2.859610, 4.140611),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.437223, 0.305541, 0.456598),
- (1, 0.437365, 0.302782, 0.455612),
- (2, 0.444941, 0.302766, 0.458539),
- (3, 0.443284, 0.309348, 0.457267),
- (4, 0.438558, 0.302788, 0.456867),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"null",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.433141, 0.299426, 0.457566),
- (1, 0.433713, 0.302028, 0.456971),
- (2, 0.432310, 0.301072, 0.457115),
- (3, 0.431210, 0.298571, 0.456809),
- (4, 0.432891, 0.306442, 0.458554),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.440129, 0.307891, 0.457005),
- (1, 0.441966, 0.305756, 0.456712),
- (2, 0.444503, 0.310015, 0.457176),
- (3, 0.439473, 0.304319, 0.457442),
- (4, 0.443194, 0.306398, 0.457362),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"null",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.431106, 0.301673, 0.458410),
- (1, 0.434829, 0.302589, 0.456891),
- (2, 0.430545, 0.302707, 0.457500),
- (3, 0.436609, 0.301462, 0.456980),
- (4, 0.429837, 0.300629, 0.456958),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.441827, 0.306401, 0.457803),
- (1, 0.440791, 0.307818, 0.456863),
- (2, 0.441486, 0.306428, 0.456280),
- (3, 0.441639, 0.303644, 0.457488),
- (4, 0.435752, 0.302272, 0.456606),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.434382, 0.299908, 0.458576),
- (1, 0.430466, 0.299767, 0.458895),
- (2, 0.433482, 0.301923, 0.457146),
- (3, 0.437816, 0.305736, 0.460591),
- (4, 0.433787, 0.300150, 0.457657),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.248580, 1.078897, 1.137297),
- (1, 1.240939, 1.052455, 1.415574),
- (2, 1.241209, 1.084570, 1.136554),
- (3, 1.240406, 1.093724, 1.136429),
- (4, 1.240385, 1.082323, 1.136401),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"###",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.290192, 1.199382, 0.936326),
- (1, 1.276522, 1.198278, 0.936272),
- (2, 1.273170, 1.185225, 0.935751),
- (3, 1.281657, 1.188458, 0.934154),
- (4, 1.285165, 1.186782, 0.935658),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.261013, 1.087419, 1.135864),
- (1, 1.261208, 1.088418, 1.134847),
- (2, 1.243520, 1.091952, 1.135702),
- (3, 1.256916, 1.061697, 1.138041),
- (4, 1.262088, 1.105355, 1.137939),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"###",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.304031, 1.188856, 0.937909),
- (1, 1.293276, 1.188637, 0.935459),
- (2, 1.278288, 1.189283, 0.936833),
- (3, 1.302987, 1.181945, 0.936069),
- (4, 1.293851, 1.192556, 0.936999),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.490107, 0.418154, 0.575664),
- (1, 0.489843, 0.413785, 0.535501),
- (2, 0.487683, 0.415899, 0.535610),
- (3, 0.484014, 0.413119, 0.535279),
- (4, 0.491381, 0.413503, 0.537277),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.486695, 0.445844, 0.494296),
- (1, 0.481367, 0.455675, 0.497159),
- (2, 0.481974, 0.481187, 0.496221),
- (3, 0.479369, 0.425384, 0.495441),
- (4, 0.478301, 0.457115, 0.494315),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_pch",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.434857, 1.168123, 1.455765),
- (1, 1.436208, 1.190995, 1.496024),
- (2, 1.439552, 1.161674, 1.455066),
- (3, 1.436967, 1.180953, 1.494596),
- (4, 1.435067, 1.162529, 1.456440),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_pch",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.854271, 1.448036, 3.456023),
- (1, 2.864284, 1.464534, 3.456831),
- (2, 2.860290, 1.477350, 3.377527),
- (3, 2.857286, 1.458217, 3.417068),
- (4, 2.855595, 1.464395, 3.376247),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_pch",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.095114, 0.776987, 2.855911),
- (1, 2.099607, 0.795455, 2.856180),
- (2, 2.095073, 0.792649, 2.896811),
- (3, 2.094082, 0.789727, 2.897515),
- (4, 2.100236, 0.781259, 2.774968),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.999042, 1.594807, 1.777251),
- (1, 1.990498, 1.601683, 1.736392),
- (2, 2.006314, 1.599276, 1.897380),
- (3, 1.994969, 1.622299, 1.775973),
- (4, 1.988203, 1.577170, 1.736153),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"cpp",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.703651, 2.613281, 1.374149),
- (1, 2.700635, 2.658189, 1.415542),
- (2, 2.723514, 2.623613, 1.375880),
- (3, 2.698653, 2.597336, 1.376495),
- (4, 2.682678, 2.616761, 1.377316),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.415923, 1.586213, 1.856706),
- (1, 2.413466, 1.580113, 1.854297),
- (2, 2.415569, 1.611288, 1.856562),
- (3, 2.398350, 1.569858, 1.855165),
- (4, 2.394427, 1.597305, 1.856311),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"parse",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.166052, 2.593652, 1.456512),
- (1, 3.196717, 2.604754, 1.456743),
- (2, 3.101508, 2.536190, 1.456607),
- (3, 3.174828, 2.591447, 1.456659),
- (4, 3.201618, 2.596692, 1.457126),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.712949, 1.873531, 2.336073),
- (1, 3.691984, 1.870964, 2.297376),
- (2, 3.733735, 1.860346, 2.296816),
- (3, 3.702759, 1.885194, 2.336534),
- (4, 3.725368, 1.861191, 2.296488),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.674568, 2.896322, 1.777463),
- (1, 4.751183, 2.932167, 1.774656),
- (2, 4.619575, 2.943985, 1.775820),
- (3, 4.831743, 2.966127, 1.785376),
- (4, 4.696926, 2.918956, 1.774947),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.619956, 3.111231, 4.057294),
- (1, 3.634434, 3.079039, 4.176458),
- (2, 3.619489, 3.150783, 4.138602),
- (3, 3.621266, 3.104540, 4.058816),
- (4, 3.608454, 3.122193, 4.057912),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.685876, 3.735123, 2.538354),
- (1, 8.928202, 3.820031, 2.775907),
- (2, 9.001593, 3.780341, 2.615105),
- (3, 8.914982, 3.802006, 2.576587),
- (4, 8.672801, 3.745031, 2.537300),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.804784, 2.299355, 3.497193),
- (1, 2.837757, 2.362386, 3.538558),
- (2, 2.872059, 2.437397, 3.497046),
- (3, 2.822245, 2.354290, 3.416766),
- (4, 2.852352, 2.360742, 3.536904),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.840658, 2.912237, 2.176625),
- (1, 7.786177, 2.867490, 2.098460),
- (2, 8.029733, 2.900113, 2.094914),
- (3, 7.787848, 2.850907, 2.096058),
- (4, 8.009086, 2.890278, 2.097071),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.924865, 1.882098, 2.377105),
- (1, 3.946578, 1.907070, 2.377384),
- (2, 3.942964, 1.879682, 2.376026),
- (3, 3.891159, 1.892699, 2.377748),
- (4, 3.967042, 1.868087, 2.417171),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"irgen",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.959364, 2.975161, 1.817129),
- (1, 5.054176, 2.984549, 1.817835),
- (2, 4.919681, 2.991480, 1.815857),
- (3, 4.910313, 2.971126, 1.816666),
- (4, 4.951734, 2.972542, 1.815437),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.101830, 1.911448, 2.454536),
- (1, 4.134987, 1.907901, 2.417187),
- (2, 4.137531, 1.889402, 2.416253),
- (3, 4.106261, 1.900297, 2.418632),
- (4, 4.116540, 1.914047, 2.415859),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 5.144013, 2.981688, 1.855810),
- (1, 5.084562, 2.953167, 1.816353),
- (2, 5.123251, 2.985708, 1.937743),
- (3, 5.218549, 3.005248, 1.816337),
- (4, 5.121341, 2.958136, 1.817163),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.391211, 3.194895, 4.297978),
- (1, 4.320212, 3.215877, 4.336974),
- (2, 4.317236, 3.185048, 4.297096),
- (3, 4.347551, 3.210930, 4.337750),
- (4, 4.340133, 3.158959, 4.298051),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.533776, 4.099156, 2.857560),
- (1, 10.875003, 4.167712, 2.978028),
- (2, 10.559224, 4.084177, 2.898004),
- (3, 10.529217, 4.091320, 2.857602),
- (4, 10.531274, 4.079794, 2.857786),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.572211, 2.564058, 3.657172),
- (1, 3.610311, 2.554201, 3.738315),
- (2, 3.503969, 2.457425, 3.656664),
- (3, 3.497522, 2.477225, 3.776817),
- (4, 3.516315, 2.450350, 3.697352),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.667563, 3.247271, 2.416874),
- (1, 9.737532, 3.221747, 2.496587),
- (2, 9.683672, 3.255651, 2.416956),
- (3, 9.897372, 3.270324, 2.457738),
- (4, 9.960110, 3.282960, 2.536374),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.216047, 2.040267, 2.417042),
- (1, 4.198596, 2.057673, 2.417291),
- (2, 4.355761, 2.050442, 2.456578),
- (3, 4.269654, 2.046761, 2.414728),
- (4, 4.258278, 2.065794, 2.415867),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 5.364820, 3.155647, 1.856490),
- (1, 5.380241, 3.164256, 1.895779),
- (2, 5.258991, 3.099702, 1.858494),
- (3, 5.408499, 3.143804, 1.858232),
- (4, 5.433442, 3.172182, 1.896951),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.509842, 3.336711, 4.298495),
- (1, 4.493119, 3.342058, 4.338363),
- (2, 4.497302, 3.391293, 4.376365),
- (3, 4.552023, 3.326395, 4.296523),
- (4, 4.511749, 3.315174, 4.258914),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 11.063909, 4.331076, 2.975250),
- (1, 10.750918, 4.265164, 2.897127),
- (2, 10.773158, 4.274519, 2.858005),
- (3, 10.989661, 4.295921, 2.937906),
- (4, 10.991448, 4.334725, 2.977596),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.668731, 2.619398, 3.657468),
- (1, 3.654504, 2.592248, 3.696077),
- (2, 3.665061, 2.625732, 3.699196),
- (3, 3.673349, 2.573183, 3.697462),
- (4, 3.682111, 2.613733, 3.738984),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.810406, 3.300637, 2.416778),
- (1, 10.048934, 3.350114, 2.496649),
- (2, 9.875004, 3.340279, 2.537774),
- (3, 10.160045, 3.376951, 2.619453),
- (4, 10.115032, 3.362591, 2.537008),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.241536, 2.082256, 2.455986),
- (1, 4.286330, 2.067488, 2.496313),
- (2, 4.291944, 2.084961, 2.496839),
- (3, 4.299382, 2.050242, 2.497274),
- (4, 4.256038, 2.063266, 2.497293),
-]}
-))
-runs.append(( { 'cc':"ccc_clang",
- 'script':"all",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 5.421218, 3.170845, 1.936421),
- (1, 5.384884, 3.153992, 1.897806),
- (2, 5.296851, 3.153219, 1.951468),
- (3, 5.260795, 3.139369, 2.177163),
- (4, 5.278498, 3.141780, 1.895288),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.484287, 3.364861, 4.377941),
- (1, 4.531560, 3.308326, 4.377562),
- (2, 4.578896, 3.345062, 4.377173),
- (3, 4.566615, 3.446052, 4.417550),
- (4, 4.515315, 3.375575, 4.336788),
-]}
-))
-runs.append(( { 'cc':"ccc_gcc",
- 'script':"all",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.788959, 4.299290, 2.977905),
- (1, 11.090341, 4.345425, 3.058836),
- (2, 11.066430, 4.319885, 2.976521),
- (3, 10.779432, 4.283670, 3.018155),
- (4, 10.788091, 4.327036, 2.978633),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.682013, 2.568734, 3.737019),
- (1, 3.782095, 2.599814, 3.777516),
- (2, 3.694371, 2.626584, 3.858657),
- (3, 3.701257, 2.616141, 4.138741),
- (4, 3.772297, 2.652233, 3.697378),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.129212, 3.382389, 2.576426),
- (1, 10.165855, 3.362136, 2.579688),
- (2, 10.085414, 3.375557, 2.539346),
- (3, 10.106707, 3.375161, 2.777265),
- (4, 10.163243, 3.374295, 2.579247),
-]}
-))
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.pdf b/contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.pdf
deleted file mode 100644
index 50a8bc3..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.pdf
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.png b/contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.png
deleted file mode 100644
index da10f11..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.txt b/contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.txt
deleted file mode 100644
index e8b9c44..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/176.gcc.txt
+++ /dev/null
@@ -1,699 +0,0 @@
-start = """2009-06-26_10-19"""
-clang = """/Volumes/Data/ddunbar/llvm.install/bin/clang"""
-gcc = """/usr/bin/gcc-4.2"""
-clang_info = """
-clang version 1.0 (https://ddunbar@llvm.org/svn/llvm-project/cfe/trunk 70266M)
-Target: x86_64-apple-darwin10
- "/Volumes/Data/ddunbar/llvm.install/bin/../libexec/clang-cc" "-triple" "x86_64-apple-darwin10" "-S" "-disable-free" "-main-file-name" "null" "--relocation-model" "pic" "-pic-level=1" "--disable-fp-elim" "--unwind-tables=1" "--fmath-errno=0" "-mmacosx-version-min=10.6.0" "-fdiagnostics-show-option" "-o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-/cc-CVKyzP.s" "-x" "c" "/dev/null"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-/cc-yeTCzJ.o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-/cc-CVKyzP.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/ld" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.6.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-/cc-yeTCzJ.o" "-lSystem" "-lgcc"
-"""
-gcc_info = """
-Using built-in specs.
-Target: i686-apple-darwin10
-Configured with: /var/tmp/gcc/gcc-5646~6/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
-Thread model: posix
-gcc version 4.2.1 (Apple Inc. build 5646)
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1" "-quiet" "-imultilib" "x86_64" "-D__DYNAMIC__" "/dev/null" "-fPIC" "-quiet" "-dumpbase" "null" "-mmacosx-version-min=10.6.0" "-m64" "-mtune=core2" "-auxbase" "null" "-o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-//cc1kQh9M.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-//ccQcv4DT.o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-//cc1kQh9M.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.6.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-//ccQcv4DT.o" "-lSystem" "-lgcc" "-lSystem"
-"""
-style = """make"""
-runs = []
-runs.append(( { 'cc':"clang_pch",
- 'script':"null",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.065445, 0.110578, 0.041286),
- (1, 0.064915, 0.107837, 0.038992),
- (2, 0.065191, 0.106475, 0.039233),
- (3, 0.064924, 0.107004, 0.039142),
- (4, 0.065260, 0.108901, 0.038903),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.066126, 0.112036, 0.040769),
- (1, 0.065207, 0.108471, 0.038945),
- (2, 0.065186, 0.107970, 0.038926),
- (3, 0.065149, 0.108577, 0.039189),
- (4, 0.065456, 0.109348, 0.039253),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"###",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.206667, 0.425607, 0.110976),
- (1, 0.204719, 0.410080, 0.107065),
- (2, 0.204989, 0.410953, 0.108714),
- (3, 0.204985, 0.407392, 0.107438),
- (4, 0.203424, 0.408111, 0.108717),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.265631, 0.798950, 0.161461),
- (1, 0.263615, 0.805888, 0.160308),
- (2, 0.263824, 0.686335, 0.145542),
- (3, 0.262625, 0.949966, 0.177774),
- (4, 0.263458, 0.820937, 0.162473),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.464727, 0.818916, 0.657338),
- (1, 1.492318, 0.850179, 0.351025),
- (2, 1.492530, 0.861113, 0.349530),
- (3, 1.515402, 0.868510, 0.354163),
- (4, 1.501033, 0.855415, 0.351763),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.339387, 1.362012, 0.808105),
- (1, 4.327148, 1.319992, 0.794006),
- (2, 4.327374, 1.320020, 0.793893),
- (3, 4.319876, 1.319808, 0.787893),
- (4, 4.329951, 1.344321, 0.796930),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"irgen",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.977307, 1.244670, 0.754129),
- (1, 3.948981, 1.236009, 0.751078),
- (2, 3.987417, 1.247336, 0.750608),
- (3, 3.973621, 1.227822, 0.746016),
- (4, 3.947019, 1.234332, 0.741703),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.749291, 1.404829, 1.149195),
- (1, 6.750589, 1.434406, 1.151828),
- (2, 6.744767, 1.415306, 1.146994),
- (3, 6.738192, 1.425966, 1.147283),
- (4, 6.755475, 1.410701, 1.147945),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.403397, 1.560103, 1.539962),
- (1, 9.398348, 1.540148, 1.526404),
- (2, 9.421496, 1.551876, 1.744563),
- (3, 9.456310, 1.589165, 1.539901),
- (4, 9.417963, 1.545186, 1.528347),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.032359, 1.747400, 1.467280),
- (1, 7.962687, 1.720919, 1.391892),
- (2, 7.986155, 1.694753, 1.426921),
- (3, 7.978081, 1.695359, 1.416691),
- (4, 7.977982, 1.687328, 1.419240),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.750102, 1.794398, 1.729777),
- (1, 10.730841, 1.801150, 1.728536),
- (2, 10.723943, 1.779271, 1.701177),
- (3, 10.730824, 1.778987, 1.705904),
- (4, 10.741052, 1.819326, 1.724089),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"all",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.070440, 1.732707, 1.518658),
- (1, 8.111095, 1.739793, 1.542162),
- (2, 8.106386, 1.751412, 1.552584),
- (3, 8.062847, 1.723786, 1.540230),
- (4, 8.075670, 1.701288, 1.509957),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"8",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.803240, 1.832409, 1.822466),
- (1, 10.797956, 1.833142, 1.875121),
- (2, 10.815192, 1.818826, 1.835845),
- (3, 10.826268, 1.809307, 1.823997),
- (4, 10.815709, 1.809185, 1.840403),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"null",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.060892, 0.065833, 0.155946),
- (1, 0.060517, 0.064263, 0.133922),
- (2, 0.060487, 0.064208, 0.133807),
- (3, 0.060484, 0.063849, 0.134039),
- (4, 0.060465, 0.064026, 0.133506),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.060780, 0.064833, 0.136229),
- (1, 0.060581, 0.064090, 0.134156),
- (2, 0.060534, 0.064191, 0.133656),
- (3, 0.060524, 0.064027, 0.133635),
- (4, 0.060523, 0.063964, 0.133708),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"###",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.182177, 0.218261, 0.480256),
- (1, 0.181253, 0.215086, 0.446808),
- (2, 0.181503, 0.215725, 0.450776),
- (3, 0.181187, 0.215330, 0.447765),
- (4, 0.181176, 0.215050, 0.446595),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.236347, 0.301491, 0.583495),
- (1, 0.235946, 0.299452, 0.568506),
- (2, 0.235676, 0.298048, 0.559954),
- (3, 0.235782, 0.298448, 0.561808),
- (4, 0.235882, 0.299948, 0.563575),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.355242, 0.589876, 2.134110),
- (1, 1.354939, 0.586215, 2.111487),
- (2, 1.354329, 0.589784, 2.109410),
- (3, 1.355080, 0.586192, 2.122027),
- (4, 1.354042, 0.581133, 2.111260),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.044141, 0.951252, 5.162733),
- (1, 4.043237, 0.954487, 5.147568),
- (2, 4.043888, 0.952179, 5.146153),
- (3, 4.043125, 0.948038, 5.147289),
- (4, 4.043883, 0.943084, 5.147096),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"irgen",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.444049, 0.848918, 4.534581),
- (1, 3.444084, 0.854620, 4.525171),
- (2, 3.444498, 0.862757, 4.598576),
- (3, 3.442347, 0.856215, 4.518719),
- (4, 3.443622, 0.866269, 4.532286),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.065809, 1.034261, 7.390113),
- (1, 6.064420, 1.027780, 7.396403),
- (2, 6.065132, 1.030652, 7.471856),
- (3, 6.060587, 1.031604, 7.337894),
- (4, 6.064466, 1.050338, 7.360592),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 8.960646, 1.236906, 10.456741),
- (1, 8.957264, 1.234577, 10.357447),
- (2, 8.956407, 1.237590, 10.352680),
- (3, 8.957027, 1.241364, 10.398440),
- (4, 8.956120, 1.239588, 10.355988),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.277301, 1.238993, 8.973009),
- (1, 7.277048, 1.246566, 9.027985),
- (2, 7.277032, 1.226791, 8.944300),
- (3, 7.277537, 1.242752, 8.970441),
- (4, 7.278972, 1.238938, 8.989529),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.081783, 1.335714, 11.707981),
- (1, 10.081742, 1.344538, 11.682596),
- (2, 10.079740, 1.330281, 11.681210),
- (3, 10.074737, 1.324856, 11.632253),
- (4, 10.075030, 1.350316, 11.633475),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"all",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.377028, 1.265309, 9.283505),
- (1, 7.376723, 1.253489, 9.102278),
- (2, 7.376104, 1.255404, 9.094650),
- (3, 7.376589, 1.260461, 9.246790),
- (4, 7.377455, 1.255013, 9.095294),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"1",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.172422, 1.355756, 11.797816),
- (1, 10.173442, 1.357210, 11.808185),
- (2, 10.173484, 1.346743, 11.781768),
- (3, 10.170524, 1.352371, 11.749764),
- (4, 10.171428, 1.362057, 11.760581),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"null",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.061930, 0.070826, 0.090142),
- (1, 0.061012, 0.067330, 0.073687),
- (2, 0.060994, 0.067246, 0.073681),
- (3, 0.061099, 0.067234, 0.074369),
- (4, 0.061022, 0.066989, 0.073428),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.061591, 0.069558, 0.083641),
- (1, 0.061059, 0.067184, 0.073565),
- (2, 0.061076, 0.067165, 0.073724),
- (3, 0.061096, 0.066990, 0.073567),
- (4, 0.061062, 0.067199, 0.073221),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"###",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.185243, 0.234231, 0.256557),
- (1, 0.184673, 0.232841, 0.245015),
- (2, 0.184453, 0.232130, 0.244661),
- (3, 0.184370, 0.230836, 0.243152),
- (4, 0.184320, 0.231212, 0.244266),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.239474, 0.325816, 0.314883),
- (1, 0.238393, 0.326431, 0.306354),
- (2, 0.238299, 0.326449, 0.307918),
- (3, 0.237867, 0.325013, 0.305753),
- (4, 0.238329, 0.326355, 0.306446),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.386532, 0.594929, 1.083410),
- (1, 1.385214, 0.591925, 1.071299),
- (2, 1.385670, 0.596527, 1.071159),
- (3, 1.385205, 0.595489, 1.071494),
- (4, 1.385904, 0.590797, 1.067600),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.154845, 0.996239, 2.665919),
- (1, 4.149680, 0.998786, 2.651533),
- (2, 4.150974, 1.006984, 2.655142),
- (3, 4.152007, 1.008280, 2.659809),
- (4, 4.152938, 1.003288, 2.658114),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"irgen",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.644865, 0.892229, 2.404722),
- (1, 3.639556, 0.887595, 2.387664),
- (2, 3.643246, 0.880541, 2.387287),
- (3, 3.643391, 0.883751, 2.401062),
- (4, 3.644145, 0.886052, 2.392286),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.307048, 1.072104, 3.873967),
- (1, 6.313464, 1.064256, 3.870116),
- (2, 6.307031, 1.064902, 3.865455),
- (3, 6.309147, 1.070336, 3.900830),
- (4, 6.307909, 1.066836, 3.868847),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.143474, 1.275600, 5.365390),
- (1, 9.141933, 1.276966, 5.352204),
- (2, 9.141995, 1.270270, 5.353590),
- (3, 9.143375, 1.285837, 5.356607),
- (4, 9.144897, 1.283080, 5.494642),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.533151, 1.293809, 4.718994),
- (1, 7.528865, 1.295241, 4.726586),
- (2, 7.528888, 1.303576, 4.729746),
- (3, 7.525020, 1.295358, 4.716415),
- (4, 7.528346, 1.289752, 4.721087),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.287174, 1.382953, 6.031426),
- (1, 10.283068, 1.389433, 6.021822),
- (2, 10.283543, 1.392869, 6.004187),
- (3, 10.284358, 1.377433, 5.997940),
- (4, 10.289169, 1.391765, 6.007507),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"all",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.619409, 1.304847, 4.862155),
- (1, 7.623702, 1.312795, 4.906194),
- (2, 7.621269, 1.306275, 4.840736),
- (3, 7.621495, 1.319364, 4.862966),
- (4, 7.621999, 1.304611, 4.860783),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"2",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.367482, 1.401449, 6.145377),
- (1, 10.373043, 1.412685, 6.172106),
- (2, 10.373049, 1.398992, 6.103300),
- (3, 10.373781, 1.396096, 6.107375),
- (4, 10.366926, 1.406716, 6.112696),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"null",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.064425, 0.090165, 0.056533),
- (1, 0.062985, 0.083843, 0.047935),
- (2, 0.062983, 0.083616, 0.047921),
- (3, 0.063039, 0.084145, 0.048157),
- (4, 0.063026, 0.084462, 0.048349),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.064141, 0.088108, 0.053766),
- (1, 0.063195, 0.084658, 0.048108),
- (2, 0.063350, 0.085147, 0.049666),
- (3, 0.063052, 0.083725, 0.047925),
- (4, 0.063048, 0.083896, 0.048249),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"###",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.195147, 0.299573, 0.157355),
- (1, 0.193085, 0.296310, 0.156304),
- (2, 0.193189, 0.295669, 0.155085),
- (3, 0.193301, 0.292950, 0.152589),
- (4, 0.193210, 0.292226, 0.154638),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.250242, 0.409797, 0.192336),
- (1, 0.248762, 0.398072, 0.187157),
- (2, 0.248680, 0.433130, 0.196985),
- (3, 0.248853, 0.398547, 0.187603),
- (4, 0.248648, 0.405913, 0.188482),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.451387, 0.687142, 0.597211),
- (1, 1.446637, 0.676693, 0.591064),
- (2, 1.449276, 0.677468, 0.591800),
- (3, 1.444318, 0.671687, 0.589322),
- (4, 1.444476, 0.681194, 0.592248),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.264736, 1.132651, 1.424788),
- (1, 4.261695, 1.143089, 1.416857),
- (2, 4.264731, 1.138831, 1.422684),
- (3, 4.264711, 1.140477, 1.417779),
- (4, 4.260991, 1.147619, 1.419141),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"irgen",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.837203, 1.035623, 1.327415),
- (1, 3.869828, 1.033702, 1.331966),
- (2, 3.878679, 1.043199, 1.336928),
- (3, 3.865577, 1.033086, 1.330496),
- (4, 3.854501, 1.024146, 1.328011),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 6.576067, 1.224910, 2.082887),
- (1, 6.555647, 1.214275, 2.066679),
- (2, 6.564496, 1.225676, 2.082281),
- (3, 6.563023, 1.202289, 2.074234),
- (4, 6.574312, 1.203879, 2.075939),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 9.320291, 1.388042, 2.820785),
- (1, 9.321238, 1.374025, 2.817582),
- (2, 9.312721, 1.370752, 2.815972),
- (3, 9.321560, 1.382464, 2.905396),
- (4, 9.315155, 1.367614, 2.814303),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.799699, 1.445598, 2.532217),
- (1, 7.793440, 1.427494, 2.537293),
- (2, 7.794819, 1.451267, 2.540644),
- (3, 7.802867, 1.449885, 2.537256),
- (4, 7.811558, 1.454217, 2.549762),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.518288, 1.557086, 3.158364),
- (1, 10.524251, 1.541390, 3.138438),
- (2, 10.526541, 1.538375, 3.142480),
- (3, 10.516332, 1.562218, 3.192590),
- (4, 10.526898, 1.540009, 3.152245),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"all",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 7.894470, 1.472428, 2.647063),
- (1, 7.880948, 1.497803, 2.666059),
- (2, 7.877924, 1.457295, 2.623934),
- (3, 7.880090, 1.463151, 2.671976),
- (4, 7.876586, 1.463586, 2.653038),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"4",
- 'pch':"no_pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 10.608510, 1.562882, 3.262625),
- (1, 10.609805, 1.556848, 3.285292),
- (2, 10.618056, 1.550407, 3.276770),
- (3, 10.618343, 1.584988, 3.335703),
- (4, 10.613029, 1.560418, 3.287023),
-]}
-))
-finished = """2009-06-26_10-31"""
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.pdf b/contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.pdf
deleted file mode 100644
index 0bcf4c3..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.pdf
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.png b/contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.png
deleted file mode 100644
index 02a6321..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.png
+++ /dev/null
Binary files differ
diff --git a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.txt b/contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.txt
deleted file mode 100644
index 5e2331c..0000000
--- a/contrib/llvm/tools/clang/www/timing-data/2009-06-26/sketch.txt
+++ /dev/null
@@ -1,803 +0,0 @@
-start = """2009-06-26_10-04"""
-clang = """/Volumes/Data/ddunbar/llvm.install/bin/clang"""
-gcc = """/usr/bin/gcc-4.2"""
-clang_info = """
-clang version 1.0 (https://ddunbar@llvm.org/svn/llvm-project/cfe/trunk 70266M)
-Target: x86_64-apple-darwin10
- "/Volumes/Data/ddunbar/llvm.install/bin/../libexec/clang-cc" "-triple" "x86_64-apple-darwin10" "-S" "-disable-free" "-main-file-name" "null" "--relocation-model" "pic" "-pic-level=1" "--disable-fp-elim" "--unwind-tables=1" "--fmath-errno=0" "-mmacosx-version-min=10.6.0" "-fdiagnostics-show-option" "-o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-/cc-vpL9h3.s" "-x" "c" "/dev/null"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-/cc-qdRbcC.o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-/cc-vpL9h3.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/ld" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.6.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-/cc-qdRbcC.o" "-lSystem" "-lgcc"
-"""
-gcc_info = """
-Using built-in specs.
-Target: i686-apple-darwin10
-Configured with: /var/tmp/gcc/gcc-5646~6/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
-Thread model: posix
-gcc version 4.2.1 (Apple Inc. build 5646)
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1" "-quiet" "-imultilib" "x86_64" "-D__DYNAMIC__" "/dev/null" "-fPIC" "-quiet" "-dumpbase" "null" "-mmacosx-version-min=10.6.0" "-m64" "-mtune=core2" "-auxbase" "null" "-o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-//ccvaleXF.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/as" "-arch" "x86_64" "-force_cpusubtype_ALL" "-o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-//ccV9sWHa.o" "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-//ccvaleXF.s"
- "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-weak_reference_mismatches" "non-weak" "-o" "a.out" "-lcrt1.10.6.o" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" "-L/usr/lib/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1" "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.." "/var/folders/cl/clrOX6SaG+moCeRKEI4PtU+++TI/-Tmp-//ccV9sWHa.o" "-lSystem" "-lgcc" "-lSystem"
-"""
-style = """xcb"""
-runs = []
-runs.append(( { 'cc':"clang_pch",
- 'script':"null",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.454775, 0.429118, 0.894442),
- (1, 0.456816, 0.263663, 0.473584),
- (2, 0.455418, 0.263616, 0.471947),
- (3, 0.457123, 0.264847, 0.476358),
- (4, 0.455484, 0.265836, 0.472721),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.456015, 0.267448, 0.475121),
- (1, 0.457929, 0.266122, 0.474585),
- (2, 0.457145, 0.265216, 0.474808),
- (3, 0.458294, 0.263764, 0.475413),
- (4, 0.457468, 0.262464, 0.475923),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"###",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.486632, 0.345058, 0.560472),
- (1, 0.493027, 0.344064, 0.516340),
- (2, 0.492830, 0.342958, 0.515723),
- (3, 0.490442, 0.345107, 0.516254),
- (4, 0.496280, 0.343245, 0.518030),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.514260, 0.372418, 0.544621),
- (1, 0.513040, 0.372859, 0.536797),
- (2, 0.512094, 0.370682, 0.534324),
- (3, 0.512872, 0.373514, 0.535788),
- (4, 0.514620, 0.371925, 0.536016),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_pch",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.913210, 0.501577, 4.006777),
- (1, 0.887095, 0.443278, 1.071434),
- (2, 0.889139, 0.440980, 1.078436),
- (3, 0.887708, 0.443451, 1.070797),
- (4, 0.890721, 0.442759, 1.079390),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_pch",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.388931, 0.727417, 3.522403),
- (1, 2.383308, 0.731864, 3.460458),
- (2, 2.387928, 0.735731, 3.453216),
- (3, 2.378387, 0.727654, 3.672474),
- (4, 2.381366, 0.724858, 3.474937),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.037409, 0.613406, 1.215209),
- (1, 1.040770, 0.634141, 1.205919),
- (2, 1.034234, 0.618161, 1.210088),
- (3, 1.035743, 0.626183, 1.194313),
- (4, 1.035466, 0.621088, 1.181653),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.151380, 2.414929, 4.130644),
- (1, 3.152197, 2.432369, 4.145959),
- (2, 3.169057, 2.386287, 4.135253),
- (3, 3.146057, 2.403489, 4.493451),
- (4, 3.152363, 2.441579, 4.118788),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"irgen",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.400262, 0.704892, 1.375730),
- (1, 1.404950, 0.676989, 1.295341),
- (2, 1.395974, 0.686132, 1.318555),
- (3, 1.402644, 0.668249, 1.302908),
- (4, 1.394704, 0.675209, 1.326093),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.616115, 0.717480, 1.452331),
- (1, 1.624647, 0.706313, 1.364950),
- (2, 1.621780, 0.711227, 1.364399),
- (3, 1.615129, 0.708090, 1.350312),
- (4, 1.627133, 0.705681, 1.380502),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.021269, 2.613351, 4.403274),
- (1, 3.972482, 2.627701, 4.451196),
- (2, 3.966213, 2.540204, 4.303024),
- (3, 3.951820, 2.599589, 4.339412),
- (4, 3.980372, 2.566508, 4.337338),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.735196, 0.782129, 1.452587),
- (1, 1.739009, 0.764330, 1.425707),
- (2, 1.740858, 0.769880, 1.437086),
- (3, 1.741419, 0.762191, 1.403820),
- (4, 1.747043, 0.780665, 1.420343),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.102902, 2.665367, 4.390574),
- (1, 4.097269, 2.666010, 4.359247),
- (2, 4.147762, 2.644022, 4.382155),
- (3, 4.196482, 2.724179, 4.465809),
- (4, 4.137713, 2.652589, 4.396584),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"all",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.778593, 0.860038, 1.933043),
- (1, 1.783723, 0.779371, 1.463440),
- (2, 1.776279, 0.782745, 1.449608),
- (3, 1.776952, 0.782233, 1.478619),
- (4, 1.770755, 0.782444, 1.652835),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"8",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.133649, 2.666723, 4.502220),
- (1, 4.164545, 2.606363, 4.423237),
- (2, 4.141087, 2.729139, 4.466176),
- (3, 4.186804, 2.692518, 4.448523),
- (4, 4.135804, 2.680580, 4.428858),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"null",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.645824, 0.336540, 1.040349),
- (1, 0.758601, 0.377669, 1.198545),
- (2, 0.802384, 0.385620, 1.256802),
- (3, 0.667186, 0.257789, 0.986552),
- (4, 0.677381, 0.323771, 1.067715),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.654302, 0.326431, 1.043052),
- (1, 0.610937, 0.202433, 0.879312),
- (2, 0.821695, 0.241481, 1.127804),
- (3, 0.633888, 0.315185, 1.009161),
- (4, 0.606823, 0.209530, 0.874705),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"###",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.543719, 0.249359, 0.878529),
- (1, 0.864268, 0.407639, 1.357842),
- (2, 0.505443, 0.253217, 0.842801),
- (3, 1.168525, 0.628933, 1.885143),
- (4, 0.860483, 0.294474, 1.244566),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.730678, 0.350816, 1.158314),
- (1, 0.833076, 0.402332, 1.310570),
- (2, 0.626271, 0.280957, 0.987633),
- (3, 0.705011, 0.360332, 1.149777),
- (4, 0.708342, 0.304606, 1.086816),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_pch",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.243931, 0.544136, 1.943868),
- (1, 1.178064, 0.357476, 1.703040),
- (2, 0.921374, 0.438177, 1.525808),
- (3, 1.153771, 0.486733, 1.796961),
- (4, 0.968192, 0.355170, 1.483673),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_pch",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.493859, 0.712226, 4.011872),
- (1, 2.940300, 0.921172, 4.652497),
- (2, 2.715094, 0.893861, 4.490923),
- (3, 2.610419, 0.709403, 4.118227),
- (4, 2.526798, 0.679792, 3.994116),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.458838, 0.694208, 2.378138),
- (1, 1.817837, 0.740143, 2.805735),
- (2, 1.300085, 0.703071, 2.229211),
- (3, 1.262175, 0.539189, 2.048597),
- (4, 1.191437, 0.497072, 1.923328),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.120749, 1.789574, 5.789810),
- (1, 3.273377, 1.967923, 6.133188),
- (2, 3.037123, 1.733381, 5.596823),
- (3, 3.042984, 1.730581, 5.650857),
- (4, 3.188306, 1.759639, 5.884737),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"irgen",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.542473, 0.612384, 2.425046),
- (1, 1.545307, 0.697333, 2.515996),
- (2, 1.600507, 0.604696, 2.460228),
- (3, 1.632270, 0.718514, 2.592235),
- (4, 1.928976, 0.629692, 2.794199),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.770525, 0.684705, 2.712227),
- (1, 1.887006, 0.676721, 2.808092),
- (2, 1.625953, 0.651827, 2.513331),
- (3, 1.773543, 0.671273, 2.695842),
- (4, 1.601478, 0.621009, 2.649159),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.114128, 2.094426, 7.063334),
- (1, 4.025352, 1.957465, 6.838969),
- (2, 3.821735, 1.946024, 6.632936),
- (3, 3.907138, 2.007547, 7.016114),
- (4, 4.024595, 2.043679, 6.922250),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.056124, 0.710399, 3.025185),
- (1, 1.804336, 0.726053, 2.772563),
- (2, 1.967191, 0.656225, 2.892478),
- (3, 2.201167, 1.485126, 3.955987),
- (4, 1.994297, 0.676570, 2.914002),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.153794, 1.918740, 6.996844),
- (1, 4.211883, 1.937034, 7.076586),
- (2, 4.084567, 1.959342, 6.944548),
- (3, 4.648222, 2.460079, 7.979059),
- (4, 4.136109, 1.985068, 6.960107),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"all",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.028821, 0.718882, 3.022737),
- (1, 1.843870, 0.711606, 2.811073),
- (2, 1.985330, 0.640222, 2.873062),
- (3, 2.060936, 0.694181, 3.004850),
- (4, 1.897412, 0.741471, 2.895000),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"1",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.126488, 1.921937, 7.213964),
- (1, 4.030952, 2.008876, 6.892632),
- (2, 4.003183, 1.903866, 6.818411),
- (3, 4.002316, 1.899865, 6.714604),
- (4, 4.241685, 2.074201, 7.178083),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"null",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.438307, 0.207037, 0.506107),
- (1, 0.443102, 0.205874, 0.504716),
- (2, 0.439711, 0.209035, 0.506141),
- (3, 0.436863, 0.206002, 0.504331),
- (4, 0.439627, 0.206224, 0.505025),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.439477, 0.207192, 0.504912),
- (1, 0.437463, 0.209372, 0.504820),
- (2, 0.437903, 0.206376, 0.506661),
- (3, 0.442930, 0.207493, 0.505236),
- (4, 0.437359, 0.206906, 0.505647),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"###",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.476966, 0.260986, 0.572957),
- (1, 0.478184, 0.263035, 0.573059),
- (2, 0.469230, 0.262187, 0.571016),
- (3, 0.469081, 0.262310, 0.570270),
- (4, 0.487872, 0.261247, 0.573296),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.500065, 0.287104, 0.600696),
- (1, 0.490454, 0.288579, 0.599350),
- (2, 0.489178, 0.290420, 0.595453),
- (3, 0.504358, 0.305761, 0.621200),
- (4, 0.488484, 0.284586, 0.593988),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_pch",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.863838, 0.365213, 1.134056),
- (1, 0.879504, 0.384604, 1.159071),
- (2, 0.865340, 0.363764, 1.135322),
- (3, 0.870478, 0.367344, 1.160674),
- (4, 0.872049, 0.365320, 1.137567),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_pch",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.356240, 0.639645, 3.459472),
- (1, 2.360200, 0.659262, 3.524492),
- (2, 2.357683, 0.643919, 3.503642),
- (3, 2.356418, 0.645647, 3.487224),
- (4, 2.373107, 0.644771, 3.481359),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.020421, 0.527766, 1.342095),
- (1, 1.015704, 0.514000, 1.336929),
- (2, 1.012705, 0.511238, 1.355272),
- (3, 1.017781, 0.525921, 1.395570),
- (4, 1.018256, 0.517513, 1.810392),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.236664, 1.833475, 5.064647),
- (1, 3.116394, 1.846229, 4.585106),
- (2, 3.109082, 1.861524, 4.545915),
- (3, 3.105011, 1.846408, 4.555086),
- (4, 3.098872, 1.865976, 4.564655),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"irgen",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.380699, 0.583314, 1.565867),
- (1, 1.388951, 0.550808, 1.551250),
- (2, 1.413442, 0.605844, 2.090865),
- (3, 1.387903, 0.560118, 1.544868),
- (4, 1.380258, 0.556370, 1.545919),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.594818, 0.585227, 1.667099),
- (1, 1.592606, 0.587092, 1.672961),
- (2, 1.593256, 0.589412, 1.669080),
- (3, 1.593986, 0.587601, 1.669540),
- (4, 1.596080, 0.588672, 1.661919),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.936649, 2.035445, 5.031351),
- (1, 3.945642, 1.975630, 5.060494),
- (2, 3.944102, 1.986388, 5.217065),
- (3, 3.942765, 1.958722, 5.007943),
- (4, 3.942774, 1.998893, 5.220903),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.712580, 0.646710, 1.767951),
- (1, 1.726718, 0.639926, 1.762359),
- (2, 1.715856, 0.663728, 1.801439),
- (3, 1.710717, 0.642142, 1.748022),
- (4, 1.711775, 0.639969, 1.762574),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.100132, 2.051387, 5.193869),
- (1, 4.080168, 2.011265, 5.256560),
- (2, 4.081965, 2.023322, 5.162267),
- (3, 4.095547, 2.044797, 5.131689),
- (4, 4.083693, 2.027487, 5.067421),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"all",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.750192, 0.645773, 1.781508),
- (1, 1.751823, 0.651023, 1.799043),
- (2, 1.746203, 0.648456, 1.799824),
- (3, 1.743422, 0.650594, 1.813096),
- (4, 1.743223, 0.647433, 1.804423),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"2",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.112210, 2.030036, 5.210062),
- (1, 4.134068, 2.036290, 5.134560),
- (2, 4.106223, 2.031620, 5.167160),
- (3, 4.111138, 2.067136, 5.242598),
- (4, 4.114321, 2.105259, 5.219405),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"null",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.450242, 0.234466, 0.468920),
- (1, 0.452251, 0.234237, 0.472734),
- (2, 0.449428, 0.230498, 0.469181),
- (3, 0.451854, 0.234653, 0.471594),
- (4, 0.450034, 0.233853, 0.470746),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"null",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.451976, 0.237066, 0.471837),
- (1, 0.451032, 0.232549, 0.469509),
- (2, 0.450837, 0.235248, 0.469812),
- (3, 0.451435, 0.236156, 0.471181),
- (4, 0.454297, 0.235811, 0.472732),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"###",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.487874, 0.301226, 0.520971),
- (1, 0.485966, 0.302353, 0.522738),
- (2, 0.487933, 0.320309, 0.538211),
- (3, 0.484292, 0.301703, 0.518200),
- (4, 0.485094, 0.300915, 0.519927),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"###",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.507246, 0.328269, 0.538592),
- (1, 0.504679, 0.327246, 0.536575),
- (2, 0.506116, 0.325455, 0.534917),
- (3, 0.504966, 0.325033, 0.535512),
- (4, 0.504264, 0.325877, 0.537850),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_pch",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 0.878871, 0.406325, 1.083290),
- (1, 0.881664, 0.406706, 1.089465),
- (2, 0.879953, 0.403525, 1.089816),
- (3, 0.880059, 0.403838, 1.081420),
- (4, 0.882767, 0.404104, 1.081738),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_pch",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 2.376690, 0.683461, 3.481408),
- (1, 2.371811, 0.678423, 3.554769),
- (2, 2.373430, 0.687361, 3.496073),
- (3, 2.371478, 0.675612, 3.438700),
- (4, 2.377505, 0.688872, 3.424400),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.042312, 0.579073, 1.213381),
- (1, 1.044438, 0.584515, 1.205995),
- (2, 1.038797, 0.582026, 1.219606),
- (3, 1.040786, 0.577159, 1.215521),
- (4, 1.043000, 0.577868, 1.223773),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"syntax",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 3.231130, 2.567647, 4.158387),
- (1, 3.235798, 2.498238, 4.418977),
- (2, 3.238465, 2.529717, 4.211575),
- (3, 3.239709, 2.495562, 4.156266),
- (4, 3.231558, 2.493020, 4.108168),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"irgen",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.421647, 0.642906, 1.341418),
- (1, 1.421549, 0.646429, 1.343189),
- (2, 1.433072, 0.641680, 1.327081),
- (3, 1.428600, 0.639478, 1.332256),
- (4, 1.427077, 0.643784, 1.322933),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.654124, 0.663628, 1.402498),
- (1, 1.643467, 0.662131, 1.386214),
- (2, 1.653972, 0.671458, 1.393807),
- (3, 1.646365, 0.671024, 1.395913),
- (4, 1.651021, 0.662302, 1.404011),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_asm",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.297588, 2.725803, 4.463298),
- (1, 4.286029, 2.678946, 4.487945),
- (2, 4.280374, 2.696217, 4.492516),
- (3, 4.305121, 2.681000, 4.491615),
- (4, 4.290141, 2.697022, 4.485084),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.763493, 0.720256, 1.438810),
- (1, 1.766202, 0.720674, 1.581947),
- (2, 1.766634, 0.722865, 1.439302),
- (3, 1.767231, 0.726466, 1.455122),
- (4, 1.765071, 0.725319, 1.443411),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"only_compile",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.439486, 2.767478, 4.493862),
- (1, 4.450584, 2.723827, 4.523759),
- (2, 4.446754, 2.728436, 4.522514),
- (3, 4.418589, 2.747071, 4.539960),
- (4, 4.449233, 2.763071, 4.578583),
-]}
-))
-runs.append(( { 'cc':"clang_pch",
- 'script':"all",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 1.796239, 0.738339, 1.484091),
- (1, 1.804887, 0.734832, 1.484408),
- (2, 1.799010, 0.745599, 1.487400),
- (3, 1.795834, 0.735356, 1.480006),
- (4, 1.806408, 0.745381, 1.483771),
-]}
-))
-runs.append(( { 'cc':"gcc",
- 'script':"all",
- 'threads':"4",
- 'pch':"pch" },
-{ 'version' : 0,
- 'samples' : [
- (0, 4.450745, 2.820108, 4.598335),
- (1, 4.492508, 2.802745, 4.608004),
- (2, 4.484814, 2.762586, 4.664950),
- (3, 4.428110, 2.724648, 4.700769),
- (4, 4.451598, 2.814003, 4.559797),
-]}
-))
-finished = """2009-06-26_10-19"""
OpenPOWER on IntegriCloud