Permalink
Browse files

Merge branch 'fix/27/pre_release_fixes' into develop

* fix/27/pre_release_fixes:
  Renames llvm_types.ll -> Core.ll
  Calls strerror with strict std:: prefix
  Fixes correct padding in Image::readObject():byteObject
  Removes trailing whitespaces
  Prettifies memory.h

Issue: #27
  • Loading branch information...
0x7CFE committed Nov 13, 2013
2 parents f0f2ee6 + d89390f commit b16a2c4fb536602c68776b0874c133f0e93233b4
View
@@ -22,7 +22,7 @@ if (LLVM)
execute_process(COMMAND ${CONFIG_COMMAND} --libs all
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE LLVM_LIBS)
add_definitions(-DLLVM)
endif()
View
@@ -30,7 +30,7 @@ NL \n
<STRING>{NL}+ m_buf += yytext; yylloc->lines(yyleng);
<STRING>"'" BEGIN(INITIAL); RETURN_B(STRING);
"." RETURN( DOT );
"." RETURN( DOT );
";" RETURN( CASCADE );
"^" RETURN( RET );
"|" RETURN( PIPE );
@@ -57,7 +57,7 @@ NL \n
"*" RETURN( MUL );
"/" RETURN( DIV );
"isNil" RETURN( ISNIL );
"isNil" RETURN( ISNIL );
"notNil" RETURN( NOTNIL );
"not" RETURN( NOT );
"and:" RETURN( AND );
@@ -69,10 +69,10 @@ NL \n
"whileTrue" RETURN( UNARY_WHILETRUE );
"whileFalse" RETURN( UNARY_WHILEFALSE );
true RETURN(TRUE);
false RETURN(FALSE);
nil RETURN(NIL);
self RETURN(SELF);
true RETURN(TRUE);
false RETURN(FALSE);
nil RETURN(NIL);
self RETURN(SELF);
super RETURN(SUPER);
@@ -85,13 +85,13 @@ super RETURN(SUPER);
PushError(yylloc, "symbol is too long");
RETURN(SYMBOL);
}
\:[a-zA-Z_][a-zA-Z0-9_]* {
if(strlen(yytext) > 128)
PushError(yylloc, "argument identifier is too long");
RETURN(ARGUMENT);
}
[a-zA-Z_][a-zA-Z0-9_]\:* {
if(strlen(yytext) > 128)
PushError(yylloc, "selector is too long");
@@ -104,8 +104,8 @@ super RETURN(SUPER);
RETURN(IDENTIFIER);
}
%%
View
@@ -53,7 +53,7 @@
%token NENE "~~"
/* arithmetics */
%token MINUS "-"
%token MINUS "-"
%token PLUS "+"
%token MUL "*"
%token DIV "/"
@@ -80,7 +80,7 @@
%left UNARY_MESSAGE
%left "("
%left UNARY_MINUS
%left UNARY_MINUS
%nonassoc PRIMITIVE
%%
@@ -94,25 +94,25 @@ image_contents : /* empty image */
| method_definition
;
image : image_contents initial_method;
image : image_contents initial_method;
id : IDENTIFIER;
arg_id : ARGUMENT;
id_list_tail : /* empty tail */
| id id_list_tail;
id_list : id id_list_tail;
comment : COMMENT;
class_definition :
class_definition :
CLASS id id id_list "\n"
| error "\n"
;
rawclass_definition :
rawclass_definition :
RAWCLASS id id id id_list "\n"
/* | error "\n" */
;
@@ -126,7 +126,7 @@ arg_list_tail : /* empty */
arg_list : arg_id arg_list_tail;
arguments :
arguments :
arg_list "|"
| error "|" /* error recovery */
;
@@ -136,24 +136,24 @@ block_body :
| arguments statements
;
block :
block :
"[" block_body "]"
| "[" error "]" /* error recovery */
;
selector : SELECTOR;
selector : SELECTOR;
selector_value_pair: selector expression;
key_message_tail : /* empty */
| selector_value_pair key_message_tail;
key_message : selector_value_pair key_message_tail;
message :
message :
/* simple unary message identifier */
id %prec UNARY_MESSAGE
id %prec UNARY_MESSAGE
/* a set of selector-value pairs */
| key_message %prec KEY_MESSAGE
;
@@ -172,7 +172,7 @@ string : STRING;
symbol : SYMBOL;
number : INTEGER;
char : CHARACTER;
array :
array :
"#(" literals ")"
| "#(" error ")" /* error recovery */
;
@@ -183,18 +183,18 @@ literal:
| number /* number literal */
| char /* character literal $x */
| array /* inline literal array #( ) */
| "-" number %prec UNARY_MINUS
;
subexpression:
"(" expression ")"
| "(" error ")" /* error recovery */
;
receiver :
receiver :
id /* global, temporary or instance variable identifier */
| literal /* inline literal object */
| literal /* inline literal object */
| TRUE
| FALSE
| NIL
@@ -205,13 +205,13 @@ receiver :
;
assignment : id "<-" expression;
expression :
expression :
receiver
| receiver message_chain
| assignment
| expression "+" expression
| expression "-" expression
| expression "*" expression
@@ -224,69 +224,69 @@ expression :
| expression ">" expression
| expression "<=" expression
| expression ">=" expression
| expression "isNil" %prec UNARY_MESSAGE
| expression "notNil" %prec UNARY_MESSAGE
| expression "not" %prec UNARY_MESSAGE
| expression "and:" block %prec SPECIAL_MESSAGE
| expression "or:" block %prec SPECIAL_MESSAGE
| expression "ifTrue:" block %prec SPECIAL_MESSAGE
| expression "ifFalse:" block %prec SPECIAL_MESSAGE
| expression "ifTrue:" block "ifFalse:" block %prec SPECIAL_MESSAGE
| expression "ifFalse:" block "ifTrue:" block %prec SPECIAL_MESSAGE
/* TODO #to:do: #to:by:do: */
| block "whileTrue:" block %prec SPECIAL_MESSAGE
| block "whileFalse:" block %prec SPECIAL_MESSAGE
| block "whileTrue" %prec UNARY_MESSAGE
| block "whileFalse" %prec UNARY_MESSAGE
;
return:
return:
"^" expression
| "^" primitive
;
primitive_params : /* empty */
| receiver primitive_params;
primitive :
primitive :
"<" number primitive_params ">" %prec PRIMITIVE
| "<" error ">" /* error recovery */
;
statement :
statement :
expression
| primitive
| return
;
statements : /* empty */
statements : /* empty */
| statement "." statements
| statement /* last one in a block */
| error "." /* error recovery till end of a statement */
;
method_body : statements;
temporaries :
temporaries :
"|" id_list "|"
| "|" error "|" /* error recovery */
;
method_interface_tail : /* empty */
| selector id;
method_interface :
method_interface :
id /* simple unary method name */
| selector id method_interface_tail /* parametrized method */
;
method :
method :
method_interface method_body "!"
| method_interface temporaries method_body "!"
| error "!" /* error recovery till end of a method */
View
@@ -23,12 +23,12 @@ extern "C" TObject* sendMessage(TContext* callingContext, TSymbol* message, TObj
Function* methodFunction = m_methodCompiler->compileMethod(method, previousContext);
TMethodFunction compiledMethodFunction = 0;
compiledMethodFunction = reinterpret_cast<TMethodFunction>(m_executionEngine->getPointerToFunction(methodFunction));
3. Вызываем скомпилируемый метод, куда передаём новосозданный контекст:
TObject* result = compiledMethodFunction(newContext);
return result;
Во время компиляции метода создаётся функция вида "ClassName>>methodName" с аргументом TContext*,
создаётся первый BB - preable (преамбула), в которой мы создаём 2 переменные - pContext и pSelf,
которые являются зарученными (gc root) значениями контекста-аргумента и объекта, которому послали вызов.
@@ -94,8 +94,8 @@ TObject* 'MyClass>>myMethod'(TContext* context) {
return e.value;
}
}
Данный пример не совсем корректен с точки зрения кодогенерации LLVM IR, но хорошо иллюстрирует
Данный пример не совсем корректен с точки зрения кодогенерации LLVM IR, но хорошо иллюстрирует
реализацию опкода blockReturn.
Данная архитектура позволяет нам корректно обработать JIT опкод blockReturn даже внутри софтовой версии:
@@ -145,9 +145,9 @@ TDeferredValue реализует ленивый доступ к определ
loadArgument,
loadTemporary,
loadLiteral,
// result of message sent
// or pushed block
// result of message sent
// or pushed block
loadHolder
};
@@ -210,7 +210,7 @@ LLVM инструкция phi:
3: branchIfFalse 6 ------
4: pushArgument 2 <--| |
-- 5: branch 7 |
|-> 6: pushArgument 3 <----
|-> 6: pushArgument 3 <----
|-> 7: markArguments 2
Два перехода от 3-го опкода (branchIfFalse 6) происходят явно: на 4 и на 6 опкод.
@@ -233,6 +233,6 @@ LLVM инструкция phi:
результат функции возвращается как попнутое значение
• Если в стеке одного из рефереров не хватает значения, то либо это ошибка
либо код реферера находится ниже по коду метода. Надо запомнить это место
и впоследствии добавить к фи функции еще один кейс для значения на вершине стека
и впоследствии добавить к фи функции еще один кейс для значения на вершине стека
перед бранчем на блок с φ функцией.
Oops, something went wrong.

0 comments on commit b16a2c4

Please sign in to comment.