mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 05:22:04 +00:00
Sync c++ kaleidoscope tutorial with test.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82572 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -306,7 +306,7 @@ function call to it. Since user-defined operators are just built as normal
|
||||
functions (because the "prototype" boils down to a function with the right
|
||||
name) everything falls into place.</p>
|
||||
|
||||
<p>The final piece of code we are missing, is a bit of top level magic:</p>
|
||||
<p>The final piece of code we are missing, is a bit of top-level magic:</p>
|
||||
|
||||
<div class="doc_code">
|
||||
<pre>
|
||||
@@ -795,7 +795,6 @@ add variable mutation without building SSA in your front-end.</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- *********************************************************************** -->
|
||||
<div class="doc_section"><a name="code">Full Code Listing</a></div>
|
||||
<!-- *********************************************************************** -->
|
||||
@@ -998,7 +997,8 @@ public:
|
||||
};
|
||||
|
||||
/// PrototypeAST - This class represents the "prototype" for a function,
|
||||
/// which captures its argument names as well as if it is an operator.
|
||||
/// 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;
|
||||
@@ -1038,7 +1038,7 @@ public:
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
|
||||
/// token the parser it looking at. getNextToken reads another token from the
|
||||
/// 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() {
|
||||
@@ -1086,9 +1086,9 @@ static ExprAST *ParseIdentifierExpr() {
|
||||
ExprAST *Arg = ParseExpression();
|
||||
if (!Arg) return 0;
|
||||
Args.push_back(Arg);
|
||||
|
||||
|
||||
if (CurTok == ')') break;
|
||||
|
||||
|
||||
if (CurTok != ',')
|
||||
return Error("Expected ')' or ',' in argument list");
|
||||
getNextToken();
|
||||
@@ -1188,7 +1188,6 @@ static ExprAST *ParseForExpr() {
|
||||
return new ForExprAST(IdName, Start, End, Step, Body);
|
||||
}
|
||||
|
||||
|
||||
/// primary
|
||||
/// ::= identifierexpr
|
||||
/// ::= numberexpr
|
||||
@@ -1272,7 +1271,7 @@ static ExprAST *ParseExpression() {
|
||||
static PrototypeAST *ParsePrototype() {
|
||||
std::string FnName;
|
||||
|
||||
unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
|
||||
unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
|
||||
unsigned BinaryPrecedence = 30;
|
||||
|
||||
switch (CurTok) {
|
||||
@@ -1389,7 +1388,6 @@ Value *UnaryExprAST::Codegen() {
|
||||
return Builder.CreateCall(F, OperandV, "unop");
|
||||
}
|
||||
|
||||
|
||||
Value *BinaryExprAST::Codegen() {
|
||||
Value *L = LHS->Codegen();
|
||||
Value *R = RHS->Codegen();
|
||||
@@ -1402,7 +1400,8 @@ Value *BinaryExprAST::Codegen() {
|
||||
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");
|
||||
return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
|
||||
"booltmp");
|
||||
default: break;
|
||||
}
|
||||
|
||||
@@ -1687,7 +1686,7 @@ static void HandleExtern() {
|
||||
}
|
||||
|
||||
static void HandleTopLevelExpression() {
|
||||
// Evaluate a top level expression into an anonymous function.
|
||||
// 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.
|
||||
@@ -1710,7 +1709,7 @@ static void MainLoop() {
|
||||
fprintf(stderr, "ready> ");
|
||||
switch (CurTok) {
|
||||
case tok_eof: return;
|
||||
case ';': getNextToken(); break; // ignore top level semicolons.
|
||||
case ';': getNextToken(); break; // ignore top-level semicolons.
|
||||
case tok_def: HandleDefinition(); break;
|
||||
case tok_extern: HandleExtern(); break;
|
||||
default: HandleTopLevelExpression(); break;
|
||||
@@ -1718,8 +1717,6 @@ static void MainLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// "Library" functions that can be "extern'd" from user code.
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -1743,6 +1740,9 @@ double printd(double X) {
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
int main() {
|
||||
InitializeNativeTarget();
|
||||
LLVMContext &Context = getGlobalContext();
|
||||
|
||||
// Install standard binary operators.
|
||||
// 1 is lowest precedence.
|
||||
BinopPrecedence['<'] = 10;
|
||||
@@ -1755,7 +1755,7 @@ int main() {
|
||||
getNextToken();
|
||||
|
||||
// Make the module, which holds all the code.
|
||||
TheModule = new Module("my cool jit", getGlobalContext());
|
||||
TheModule = new Module("my cool jit", Context);
|
||||
|
||||
ExistingModuleProvider *OurModuleProvider =
|
||||
new ExistingModuleProvider(TheModule);
|
||||
|
||||
Reference in New Issue
Block a user