// 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", "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_dot_import_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_dot_import_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_dot_import_object(no); if (!this->imported_unsafe_) { go_imported_unsafe(); this->imported_unsafe_ = true; } }