diff options
Diffstat (limited to 'gcc-4.9/gcc/go/gofrontend/unsafe.cc')
-rw-r--r-- | gcc-4.9/gcc/go/gofrontend/unsafe.cc | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/go/gofrontend/unsafe.cc b/gcc-4.9/gcc/go/gofrontend/unsafe.cc new file mode 100644 index 000000000..e7c61f023 --- /dev/null +++ b/gcc-4.9/gcc/go/gofrontend/unsafe.cc @@ -0,0 +1,96 @@ +// unsafe.cc -- Go frontend builtin unsafe package. + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "go-system.h" + +#include "go-c.h" +#include "types.h" +#include "gogo.h" + +// Set up the builtin unsafe package. This should probably be driven +// by a table. + +void +Gogo::import_unsafe(const std::string& local_name, bool is_local_name_exported, + Location location) +{ + Location bloc = Linemap::predeclared_location(); + + bool add_to_globals; + Package* package = this->add_imported_package("unsafe", local_name, + is_local_name_exported, + "unsafe", location, + &add_to_globals); + + if (package == NULL) + { + go_assert(saw_errors()); + return; + } + + package->set_location(location); + package->set_is_imported(); + + this->imports_.insert(std::make_pair("unsafe", package)); + + Bindings* bindings = package->bindings(); + + // The type may have already been created by an import. + Named_object* no = package->bindings()->lookup("Pointer"); + if (no == NULL) + { + Type* type = Type::make_pointer_type(Type::make_void_type()); + no = bindings->add_type("Pointer", package, type, + Linemap::unknown_location()); + } + else + { + go_assert(no->package() == package); + go_assert(no->is_type()); + go_assert(no->type_value()->is_unsafe_pointer_type()); + no->type_value()->set_is_visible(); + } + Named_type* pointer_type = no->type_value(); + if (add_to_globals) + this->add_named_type(pointer_type); + + Type* uintptr_type = Type::lookup_integer_type("uintptr"); + + // Sizeof. + Typed_identifier_list* results = new Typed_identifier_list; + results->push_back(Typed_identifier("", uintptr_type, bloc)); + Function_type* fntype = Type::make_function_type(NULL, NULL, results, bloc); + fntype->set_is_builtin(); + no = bindings->add_function_declaration("Sizeof", package, fntype, bloc); + if (add_to_globals) + this->add_named_object(no); + + // Offsetof. + results = new Typed_identifier_list; + results->push_back(Typed_identifier("", uintptr_type, bloc)); + fntype = Type::make_function_type(NULL, NULL, results, bloc); + fntype->set_is_varargs(); + fntype->set_is_builtin(); + no = bindings->add_function_declaration("Offsetof", package, fntype, bloc); + if (add_to_globals) + this->add_named_object(no); + + // Alignof. + results = new Typed_identifier_list; + results->push_back(Typed_identifier("", uintptr_type, bloc)); + fntype = Type::make_function_type(NULL, NULL, results, bloc); + fntype->set_is_varargs(); + fntype->set_is_builtin(); + no = bindings->add_function_declaration("Alignof", package, fntype, bloc); + if (add_to_globals) + this->add_named_object(no); + + if (!this->imported_unsafe_) + { + go_imported_unsafe(); + this->imported_unsafe_ = true; + } +} |