Commit 0c24ed8a81
Changed files (10)
doc/vim/syntax/zig.vim
@@ -8,7 +8,7 @@ if exists("b:current_syntax")
endif
syn keyword zigOperator as
-syn keyword zigStorage const var extern volatile export pub restrict
+syn keyword zigStorage const var extern volatile export pub noalias
syn keyword zigStructure struct enum type
syn keyword zigStatement goto break return continue asm
syn keyword zigConditional if else match
doc/langref.md
@@ -68,11 +68,11 @@ CompilerFnExpr : token(NumberSign) token(Symbol) token(LParen) Expression token(
CompilerFnType : token(NumberSign) token(Symbol) token(LParen) Type token(RParen)
-PointerType : token(Ampersand) option(token(Const)) option(token(Restrict)) Type
+PointerType : token(Ampersand) option(token(Const)) option(token(NoAlias)) Type
MaybeType : token(Question) Type
-ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) option(token(Restrict)) Type
+ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) option(token(NoAlias)) Type
Block : token(LBrace) list(option(Statement), token(Semicolon)) token(RBrace)
src/analyze.cpp
@@ -135,8 +135,8 @@ static TypeTableEntry *get_number_literal_type_unsigned(CodeGen *g, uint64_t x)
return g->num_lit_types[get_number_literal_kind_unsigned(x)];
}
-TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool is_const, bool is_restrict) {
- TypeTableEntry **parent_pointer = &child_type->pointer_parent[(is_const ? 1 : 0)][(is_restrict ? 1 : 0)];
+TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool is_const, bool is_noalias) {
+ TypeTableEntry **parent_pointer = &child_type->pointer_parent[(is_const ? 1 : 0)][(is_noalias ? 1 : 0)];
if (*parent_pointer) {
return *parent_pointer;
} else {
@@ -151,7 +151,7 @@ TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool
entry->size_in_bits, entry->align_in_bits, buf_ptr(&entry->name));
entry->data.pointer.child_type = child_type;
entry->data.pointer.is_const = is_const;
- entry->data.pointer.is_restrict = is_restrict;
+ entry->data.pointer.is_noalias = is_noalias;
*parent_pointer = entry;
return entry;
@@ -240,9 +240,9 @@ static TypeTableEntry *get_array_type(CodeGen *g, ImportTableEntry *import,
}
static TypeTableEntry *get_unknown_size_array_type(CodeGen *g, ImportTableEntry *import,
- TypeTableEntry *child_type, bool is_const, bool is_restrict)
+ TypeTableEntry *child_type, bool is_const, bool is_noalias)
{
- TypeTableEntry **parent_pointer = &child_type->unknown_size_array_parent[(is_const ? 1 : 0)][(is_restrict ? 1 : 0)];
+ TypeTableEntry **parent_pointer = &child_type->unknown_size_array_parent[(is_const ? 1 : 0)][(is_noalias ? 1 : 0)];
if (*parent_pointer) {
return *parent_pointer;
} else {
@@ -252,7 +252,7 @@ static TypeTableEntry *get_unknown_size_array_type(CodeGen *g, ImportTableEntry
buf_appendf(&entry->name, "[]%s", buf_ptr(&child_type->name));
entry->type_ref = LLVMStructCreateNamed(LLVMGetGlobalContext(), buf_ptr(&entry->name));
- TypeTableEntry *pointer_type = get_pointer_to_type(g, child_type, is_const, is_restrict);
+ TypeTableEntry *pointer_type = get_pointer_to_type(g, child_type, is_const, is_noalias);
unsigned element_count = 2;
LLVMTypeRef element_types[] = {
@@ -428,7 +428,7 @@ static TypeTableEntry *eval_const_expr(CodeGen *g, BlockContext *context,
}
static TypeTableEntry *resolve_type(CodeGen *g, AstNode *node, ImportTableEntry *import,
- BlockContext *context, bool restrict_allowed)
+ BlockContext *context, bool noalias_allowed)
{
assert(node->type == NodeTypeType);
alloc_codegen_node(node);
@@ -449,13 +449,13 @@ static TypeTableEntry *resolve_type(CodeGen *g, AstNode *node, ImportTableEntry
}
case AstNodeTypeTypePointer:
{
- bool use_restrict = false;
- if (node->data.type.is_restrict) {
- if (!restrict_allowed) {
+ bool use_noalias = false;
+ if (node->data.type.is_noalias) {
+ if (!noalias_allowed) {
add_node_error(g, node,
- buf_create_from_str("invalid restrict qualifier"));
+ buf_create_from_str("invalid noalias qualifier"));
} else {
- use_restrict = true;
+ use_noalias = true;
}
}
@@ -471,7 +471,7 @@ static TypeTableEntry *resolve_type(CodeGen *g, AstNode *node, ImportTableEntry
type_node->entry = child_type;
return child_type;
} else {
- type_node->entry = get_pointer_to_type(g, child_type, node->data.type.is_const, use_restrict);
+ type_node->entry = get_pointer_to_type(g, child_type, node->data.type.is_const, use_noalias);
return type_node->entry;
}
}
@@ -479,13 +479,13 @@ static TypeTableEntry *resolve_type(CodeGen *g, AstNode *node, ImportTableEntry
{
AstNode *size_node = node->data.type.array_size;
- bool use_restrict = false;
- if (node->data.type.is_restrict) {
- if (!restrict_allowed || size_node) {
+ bool use_noalias = false;
+ if (node->data.type.is_noalias) {
+ if (!noalias_allowed || size_node) {
add_node_error(g, node,
- buf_create_from_str("invalid restrict qualifier"));
+ buf_create_from_str("invalid noalias qualifier"));
} else {
- use_restrict = true;
+ use_noalias = true;
}
}
@@ -524,7 +524,7 @@ static TypeTableEntry *resolve_type(CodeGen *g, AstNode *node, ImportTableEntry
return type_node->entry;
} else {
type_node->entry = get_unknown_size_array_type(g, import, child_type,
- node->data.type.is_const, use_restrict);
+ node->data.type.is_const, use_noalias);
return type_node->entry;
}
@@ -1221,7 +1221,7 @@ static TypeTableEntry *resolve_type_compatibility(CodeGen *g, BlockContext *cont
return expected_type;
}
- // implicit non-const to const and ignore restrict
+ // implicit non-const to const and ignore noalias
if (expected_type->id == TypeTableEntryIdPointer &&
actual_type->id == TypeTableEntryIdPointer &&
(!actual_type->data.pointer.is_const || expected_type->data.pointer.is_const))
src/analyze.hpp
@@ -23,7 +23,7 @@ struct StructValExprNode;
struct TypeTableEntryPointer {
TypeTableEntry *child_type;
bool is_const;
- bool is_restrict;
+ bool is_noalias;
};
struct TypeTableEntryInt {
@@ -98,8 +98,8 @@ struct TypeTableEntry {
} data;
// use these fields to make sure we don't duplicate type table entries for the same type
- TypeTableEntry *pointer_parent[2][2]; // 0 - const. 1 - restrict
- TypeTableEntry *unknown_size_array_parent[2][2]; // 0 - const. 1 - restrict
+ TypeTableEntry *pointer_parent[2][2]; // 0 - const. 1 - noalias
+ TypeTableEntry *unknown_size_array_parent[2][2]; // 0 - const. 1 - noalias
HashMap<uint64_t, TypeTableEntry *, uint64_hash, uint64_eq> arrays_by_size;
TypeTableEntry *maybe_parent;
@@ -391,7 +391,7 @@ void semantic_analyze(CodeGen *g);
void add_node_error(CodeGen *g, AstNode *node, Buf *msg);
void alloc_codegen_node(AstNode *node);
TypeTableEntry *new_type_table_entry(TypeTableEntryId id);
-TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool is_const, bool is_restrict);
+TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool is_const, bool is_noalias);
VariableTableEntry *find_variable(BlockContext *context, Buf *name);
BlockContext *new_block_context(AstNode *node, BlockContext *parent);
src/codegen.cpp
@@ -1840,7 +1840,7 @@ static void do_code_gen(CodeGen *g) {
TypeTableEntry *param_type = fn_proto_type_from_type_node(g, type_node);
LLVMValueRef argument_val = LLVMGetParam(fn, gen_param_index);
if (param_type->id == TypeTableEntryIdPointer &&
- param_type->data.pointer.is_restrict)
+ param_type->data.pointer.is_noalias)
{
LLVMAddAttribute(argument_val, LLVMNoAliasAttribute);
} else if (param_type->id == TypeTableEntryIdPointer &&
src/parser.cpp
@@ -225,8 +225,8 @@ void ast_print(AstNode *node, int indent) {
case AstNodeTypeTypePointer:
{
const char *const_or_mut_str = node->data.type.is_const ? "const " : "";
- const char *restrict_or_not_str = node->data.type.is_restrict ? "restrict " : "";
- fprintf(stderr, "%s%s PointerType\n", const_or_mut_str, restrict_or_not_str);
+ const char *noalias_or_not_str = node->data.type.is_noalias ? "noalias " : "";
+ fprintf(stderr, "%s%s PointerType\n", const_or_mut_str, noalias_or_not_str);
ast_print(node->data.type.child_type, indent + 2);
break;
@@ -234,8 +234,8 @@ void ast_print(AstNode *node, int indent) {
case AstNodeTypeTypeArray:
{
const char *const_or_mut_str = node->data.type.is_const ? "const " : "";
- const char *restrict_or_not_str = node->data.type.is_restrict ? "restrict " : "";
- fprintf(stderr, "%s%s ArrayType\n", const_or_mut_str, restrict_or_not_str);
+ const char *noalias_or_not_str = node->data.type.is_noalias ? "noalias " : "";
+ fprintf(stderr, "%s%s ArrayType\n", const_or_mut_str, noalias_or_not_str);
if (node->data.type.array_size)
ast_print(node->data.type.array_size, indent + 2);
ast_print(node->data.type.child_type, indent + 2);
@@ -1024,12 +1024,12 @@ static void ast_parse_type_assume_amp(ParseContext *pc, int *token_index, AstNod
node->data.type.is_const = true;
*token_index += 1;
first_type_token = &pc->tokens->at(*token_index);
- if (first_type_token->id == TokenIdKeywordRestrict) {
- node->data.type.is_restrict = true;
+ if (first_type_token->id == TokenIdKeywordNoAlias) {
+ node->data.type.is_noalias = true;
*token_index += 1;
}
- } else if (first_type_token->id == TokenIdKeywordRestrict) {
- node->data.type.is_restrict = true;
+ } else if (first_type_token->id == TokenIdKeywordNoAlias) {
+ node->data.type.is_noalias = true;
*token_index += 1;
}
@@ -1088,8 +1088,8 @@ static AstNode *ast_parse_compiler_fn_call(ParseContext *pc, int *token_index, b
/*
Type : token(Symbol) | token(Unreachable) | token(Void) | PointerType | ArrayType | MaybeType | CompilerFnExpr
-PointerType : token(Ampersand) option(token(Const)) option(token(Restrict)) Type
-ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) option(token(Restrict)) Type
+PointerType : token(Ampersand) option(token(Const)) option(token(NoAlias)) Type
+ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) option(token(NoAlias)) Type
*/
static AstNode *ast_parse_type(ParseContext *pc, int *token_index) {
Token *token = &pc->tokens->at(*token_index);
@@ -1140,13 +1140,13 @@ static AstNode *ast_parse_type(ParseContext *pc, int *token_index) {
node->data.type.is_const = true;
Token *next_tok = &pc->tokens->at(*token_index);
- if (next_tok->id == TokenIdKeywordRestrict) {
+ if (next_tok->id == TokenIdKeywordNoAlias) {
*token_index += 1;
- node->data.type.is_restrict = true;
+ node->data.type.is_noalias = true;
}
- } else if (const_tok->id == TokenIdKeywordRestrict) {
+ } else if (const_tok->id == TokenIdKeywordNoAlias) {
*token_index += 1;
- node->data.type.is_restrict = true;
+ node->data.type.is_noalias = true;
}
node->data.type.child_type = ast_parse_type(pc, token_index);
src/parser.hpp
@@ -110,7 +110,7 @@ struct AstNodeType {
AstNode *child_type;
AstNode *array_size; // can be null
bool is_const;
- bool is_restrict;
+ bool is_noalias;
AstNode *compiler_expr;
};
src/tokenizer.cpp
@@ -243,8 +243,8 @@ static void end_token(Tokenize *t) {
t->cur_tok->id = TokenIdKeywordBreak;
} else if (mem_eql_str(token_mem, token_len, "null")) {
t->cur_tok->id = TokenIdKeywordNull;
- } else if (mem_eql_str(token_mem, token_len, "restrict")) {
- t->cur_tok->id = TokenIdKeywordRestrict;
+ } else if (mem_eql_str(token_mem, token_len, "noalias")) {
+ t->cur_tok->id = TokenIdKeywordNoAlias;
}
t->cur_tok = nullptr;
@@ -1025,7 +1025,7 @@ static const char * token_name(Token *token) {
case TokenIdKeywordContinue: return "Continue";
case TokenIdKeywordBreak: return "Break";
case TokenIdKeywordNull: return "Null";
- case TokenIdKeywordRestrict: return "Restrict";
+ case TokenIdKeywordNoAlias: return "NoAlias";
case TokenIdLParen: return "LParen";
case TokenIdRParen: return "RParen";
case TokenIdComma: return "Comma";
src/tokenizer.hpp
@@ -36,7 +36,7 @@ enum TokenId {
TokenIdKeywordContinue,
TokenIdKeywordBreak,
TokenIdKeywordNull,
- TokenIdKeywordRestrict,
+ TokenIdKeywordNoAlias,
TokenIdLParen,
TokenIdRParen,
TokenIdComma,
std/builtin.zig
@@ -10,7 +10,7 @@ export fn memset(dest: &u8, c: u8, n: usize) -> &u8 {
return dest;
}
-export fn memcpy(dest: &restrict u8, src: &const restrict u8, n: usize) -> &u8 {
+export fn memcpy(dest: &noalias u8, src: &const noalias u8, n: usize) -> &u8 {
var index : #typeof(n) = 0;
while (index != n) {
dest[index] = src[index];