From patchwork Tue Feb 7 19:26:33 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Ian Lance Taylor X-Patchwork-Id: 140000 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 427CAB71C1 for ; Wed, 8 Feb 2012 06:27:05 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1329247626; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:Received:From:To:Subject:Date:Message-ID:User-Agent: MIME-Version:Content-Type:Mailing-List:Precedence:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=v4lMIWlmjNR1IT9WkEIlSZyCTsY=; b=UjNWxuj3ipPwySO lgwYVbSqbkmu4MwZFEolEi6wxr6C1/VWCiKABQaZFiINcGy4yuUrJW1QuEIBHJco lJN1IcBDr6ThRRZyYRoyzCG037OZ2NQk3AFPNslbhzOqaQ+nyrRayUh6eN6Sghux fRxfyJnTpYh6mr0M2Co8AJ1iz57A= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Received:Received:From:To:Subject:Date:Message-ID:User-Agent:MIME-Version:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=FZZDHJRBQXDmBcemdP/LltoJUdqI1/9ZClOCqc9Zp6kY+UYWPnOR0zWGsj4f8E dBjvkUrKV+2tDwG7NrdyvK+gArk5A5zD0P2eO5M99S1oM4hIl5gD/ku4e74qMdON Kq0fEJlWB7PlWTlqoVEspYsSDm9ZeZydnhBfB6bbnaEJk=; Received: (qmail 13019 invoked by alias); 7 Feb 2012 19:26:59 -0000 Received: (qmail 12995 invoked by uid 22791); 7 Feb 2012 19:26:55 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_LOW, TW_CC, TW_CF, TW_FN, TW_PW, TW_TP, TW_WU, T_RP_MATCHES_RCVD, T_TVD_MIME_NO_HEADERS X-Spam-Check-By: sourceware.org Received: from mail-pz0-f47.google.com (HELO mail-pz0-f47.google.com) (209.85.210.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 07 Feb 2012 19:26:37 +0000 Received: by daln34 with SMTP id n34so3411405dal.20 for ; Tue, 07 Feb 2012 11:26:36 -0800 (PST) Received: by 10.68.219.234 with SMTP id pr10mr53553073pbc.11.1328642796628; Tue, 07 Feb 2012 11:26:36 -0800 (PST) Received: by 10.68.219.234 with SMTP id pr10mr53553055pbc.11.1328642796538; Tue, 07 Feb 2012 11:26:36 -0800 (PST) Received: from coign.google.com ([216.239.45.130]) by mx.google.com with ESMTPS id a5sm48585787pbh.15.2012.02.07.11.26.34 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 07 Feb 2012 11:26:35 -0800 (PST) From: Ian Lance Taylor To: gcc-patches@gcc.gnu.org, gofrontend-dev@googlegroups.com Subject: Go patch committed: Support //extern comments instead of __asm__ Date: Tue, 07 Feb 2012 11:26:33 -0800 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org The Go compiler currently supports using __asm__ in Go code to set the externally visible name of a function declaration. This is used to permit Go code to call C code directly. The problem with __asm__ is that it is not supported by the gofmt program, which means that Go code that uses can not be formatted automatically. This patch adds a new feature to gccgo: a function declaration may now be preceded by a comment "//extern NAME" which sets the external name of the function declaration. Those comments are otherwise ignored. This permits the code to be run through gofmt without any trouble. The existing __asm__ syntax remains as there is code out there which uses it. It will be removed in the future. This patch changes the compiler to support //extern and changes libgo to use it. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline. Ian 2012-02-07 Ian Lance Taylor * gccgo.texi (Function Names): Document //extern instead of __asm__. Index: gcc/go/gccgo.texi =================================================================== --- gcc/go/gccgo.texi (revision 183650) +++ gcc/go/gccgo.texi (working copy) @@ -304,14 +304,20 @@ function is still using it. @node Function Names @section Function Names -@cindex @code{__asm__} +@cindex @code{extern} +@cindex external names Go code can call C functions directly using a Go extension implemented -in @command{gccgo}: a function declaration may be followed by -@code{__asm__ ("@var{name}")}. For example, here is how the C function -@code{open} can be declared in Go: +in @command{gccgo}: a function declaration may be preceded by a +comment giving the external name. The comment must be at the +beginning of the line and must start with @code{//extern}. This must +be followed by a space and then the external name of the function. +The function declaration must be on the line immediately after the +comment. For example, here is how the C function @code{open} can be +declared in Go: @smallexample -func c_open(name *byte, mode int, perm int) int __asm__ ("open"); +//extern open +func c_open(name *byte, mode int, perm int) int @end smallexample The C function naturally expects a nul terminated string, which in Go @@ -333,7 +339,7 @@ present the name of a Go function that d @option{-fgo-prefix} option used when the package is compiled; if the option is not used, the default is simply @code{go}. To call the function from C you must set the name using the @command{gcc} -extension similar to the @command{gccgo} extension. +@code{__asm__} extension. @smallexample extern int go_function(int) __asm__ ("myprefix.mypackage.Function"); Index: gcc/go/gofrontend/parse.cc =================================================================== --- gcc/go/gofrontend/parse.cc (revision 183814) +++ gcc/go/gofrontend/parse.cc (working copy) @@ -2093,17 +2093,19 @@ Parse::simple_var_decl_or_assignment(con // FunctionDecl = "func" identifier Signature [ Block ] . // MethodDecl = "func" Receiver identifier Signature [ Block ] . -// gcc extension: +// Deprecated gcc extension: // FunctionDecl = "func" identifier Signature // __asm__ "(" string_lit ")" . // This extension means a function whose real name is the identifier -// inside the asm. +// inside the asm. This extension will be removed at some future +// date. It has been replaced with //extern comments. void Parse::function_decl() { go_assert(this->peek_token()->is_keyword(KEYWORD_FUNC)); Location location = this->location(); + std::string extern_name = this->lex_->extern_name(); const Token* token = this->advance_token(); Typed_identifier* rec = NULL; @@ -2173,10 +2175,20 @@ Parse::function_decl() { if (named_object == NULL && !Gogo::is_sink_name(name)) { - if (fntype != NULL) - this->gogo_->declare_function(name, fntype, location); - else + if (fntype == NULL) this->gogo_->add_erroneous_name(name); + else + { + named_object = this->gogo_->declare_function(name, fntype, + location); + if (!extern_name.empty() + && named_object->is_function_declaration()) + { + Function_declaration* fd = + named_object->func_declaration_value(); + fd->set_asm_name(extern_name); + } + } } } else Index: gcc/go/gofrontend/lex.cc =================================================================== --- gcc/go/gofrontend/lex.cc (revision 183650) +++ gcc/go/gofrontend/lex.cc (working copy) @@ -442,7 +442,7 @@ Token::print(FILE* file) const Lex::Lex(const char* input_file_name, FILE* input_file, Linemap* linemap) : input_file_name_(input_file_name), input_file_(input_file), linemap_(linemap), linebuf_(NULL), linebufsize_(120), linesize_(0), - lineoff_(0), lineno_(0), add_semi_at_eol_(false) + lineoff_(0), lineno_(0), add_semi_at_eol_(false), extern_() { this->linebuf_ = new char[this->linebufsize_]; this->linemap_->start_file(input_file_name, 0); @@ -541,6 +541,7 @@ Lex::earlier_location(int chars) const Token Lex::next_token() { + bool saw_cpp_comment = false; while (true) { if (!this->require_line()) @@ -552,6 +553,10 @@ Lex::next_token() return this->make_eof_token(); } + if (!saw_cpp_comment) + this->extern_.clear(); + saw_cpp_comment = false; + const char* p = this->linebuf_ + this->lineoff_; const char* pend = this->linebuf_ + this->linesize_; @@ -588,6 +593,7 @@ Lex::next_token() p = pend; if (p[-1] == '\n' && this->add_semi_at_eol_) --p; + saw_cpp_comment = true; } else if (p[1] == '*') { @@ -1606,6 +1612,10 @@ Lex::skip_c_comment() void Lex::skip_cpp_comment() { + // Ensure that if EXTERN_ is set, it means that we just saw a + // //extern comment. + this->extern_.clear(); + const char* p = this->linebuf_ + this->lineoff_; const char* pend = this->linebuf_ + this->linesize_; @@ -1648,12 +1658,35 @@ Lex::skip_cpp_comment() } } + // As a special gccgo extension, a C++ comment at the start of the + // line of the form + // //extern NAME + // which immediately precedes a function declaration means that the + // external name of the function declaration is NAME. This is + // normally used to permit Go code to call a C function. + if (this->lineoff_ == 2 + && pend - p > 7 + && memcmp(p, "extern ", 7) == 0) + { + p += 7; + while (p < pend && (*p == ' ' || *p == '\t')) + ++p; + const char* plend = pend; + while (plend > p + && (plend[-1] == ' ' || plend[-1] == '\t' || plend[-1] == '\n')) + --plend; + if (plend > p) + this->extern_ = std::string(p, plend - p); + } + while (p < pend) { this->lineoff_ = p - this->linebuf_; unsigned int c; bool issued_error; p = this->advance_one_utf8_char(p, &c, &issued_error); + if (issued_error) + this->extern_.clear(); } } Index: gcc/go/gofrontend/lex.h =================================================================== --- gcc/go/gofrontend/lex.h (revision 183650) +++ gcc/go/gofrontend/lex.h (working copy) @@ -344,6 +344,11 @@ class Lex Token next_token(); + // Return the contents of any current //extern comment. + const std::string& + extern_name() const + { return this->extern_; } + // Return whether the identifier NAME should be exported. NAME is a // mangled name which includes only ASCII characters. static bool @@ -474,6 +479,9 @@ class Lex size_t lineno_; // Whether to add a semicolon if we see a newline now. bool add_semi_at_eol_; + // The external name to use for a function declaration, from a magic + // //extern comment. + std::string extern_; }; #endif // !defined(GO_LEX_H) Index: libgo/go/os/dir_regfile.go =================================================================== --- libgo/go/os/dir_regfile.go (revision 183650) +++ libgo/go/os/dir_regfile.go (working copy) @@ -9,4 +9,5 @@ package os import "syscall" -func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) syscall.Errno __asm__ ("readdir_r") +// extern readdir_r +func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) syscall.Errno Index: libgo/go/os/dir_largefile.go =================================================================== --- libgo/go/os/dir_largefile.go (revision 183650) +++ libgo/go/os/dir_largefile.go (working copy) @@ -9,4 +9,5 @@ package os import "syscall" -func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) syscall.Errno __asm__ ("readdir64_r") +//extern readdir64_r +func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) syscall.Errno Index: libgo/go/os/dir.go =================================================================== --- libgo/go/os/dir.go (revision 183650) +++ libgo/go/os/dir.go (working copy) @@ -10,12 +10,15 @@ import ( "unsafe" ) -func libc_dup(fd int) int __asm__ ("dup") -func libc_opendir(*byte) *syscall.DIR __asm__ ("opendir") -func libc_closedir(*syscall.DIR) int __asm__ ("closedir") +//extern opendir +func libc_opendir(*byte) *syscall.DIR + +//extern closedir +func libc_closedir(*syscall.DIR) int // FIXME: pathconf returns long, not int. -func libc_pathconf(*byte, int) int __asm__ ("pathconf") +//extern pathconf +func libc_pathconf(*byte, int) int func clen(n []byte) int { for i := 0; i < len(n); i++ { @@ -26,14 +29,14 @@ func clen(n []byte) int { return len(n) } -var elen int; +var elen int func (file *File) readdirnames(n int) (names []string, err error) { if elen == 0 { - var dummy syscall.Dirent; + var dummy syscall.Dirent elen = (unsafe.Offsetof(dummy.Name) + - libc_pathconf(syscall.StringBytePtr(file.name), syscall.PC_NAME_MAX) + - 1); + libc_pathconf(syscall.StringBytePtr(file.name), syscall.PC_NAME_MAX) + + 1) } if file.dirinfo == nil { @@ -55,7 +58,7 @@ func (file *File) readdirnames(n int) (n dir := file.dirinfo.dir if dir == nil { return names, NewSyscallError("opendir", syscall.GetErrno()) - } + } for n != 0 { var result *syscall.Dirent @@ -67,7 +70,7 @@ func (file *File) readdirnames(n int) (n break // EOF } var name = string(result.Name[0:clen(result.Name[0:])]) - if name == "." || name == ".." { // Useless names + if name == "." || name == ".." { // Useless names continue } names = append(names, name) Index: libgo/go/os/user/lookup_unix.go =================================================================== --- libgo/go/os/user/lookup_unix.go (revision 183650) +++ libgo/go/os/user/lookup_unix.go (working copy) @@ -26,8 +26,11 @@ static int mygetpwuid_r(int uid, struct } */ -func libc_getpwnam_r(name *byte, pwd *syscall.Passwd, buf *byte, buflen syscall.Size_t, result **syscall.Passwd) int __asm__ ("getpwnam_r") -func libc_getpwuid_r(uid syscall.Uid_t, pwd *syscall.Passwd, buf *byte, buflen syscall.Size_t, result **syscall.Passwd) int __asm__ ("getpwuid_r") +//extern getpwnam_r +func libc_getpwnam_r(name *byte, pwd *syscall.Passwd, buf *byte, buflen syscall.Size_t, result **syscall.Passwd) int + +//extern getpwuid_r +func libc_getpwuid_r(uid syscall.Uid_t, pwd *syscall.Passwd, buf *byte, buflen syscall.Size_t, result **syscall.Passwd) int // bytePtrToString takes a NUL-terminated array of bytes and convert // it to a Go string. Index: libgo/go/math/mod.go =================================================================== --- libgo/go/math/mod.go (revision 183650) +++ libgo/go/math/mod.go (working copy) @@ -18,7 +18,10 @@ package math // Mod(x, 0) = NaN // Mod(x, ±Inf) = x // Mod(x, NaN) = NaN -func libc_fmod(float64, float64) float64 __asm__("fmod") + +//extern fmod +func libc_fmod(float64, float64) float64 + func Mod(x, y float64) float64 { return libc_fmod(x, y) } Index: libgo/go/math/log.go =================================================================== --- libgo/go/math/log.go (revision 183650) +++ libgo/go/math/log.go (working copy) @@ -77,7 +77,10 @@ package math // Log(0) = -Inf // Log(x < 0) = NaN // Log(NaN) = NaN -func libc_log(float64) float64 __asm__("log") + +//extern log +func libc_log(float64) float64 + func Log(x float64) float64 { return libc_log(x) } Index: libgo/go/math/atan.go =================================================================== --- libgo/go/math/atan.go (revision 183650) +++ libgo/go/math/atan.go (working copy) @@ -51,7 +51,10 @@ func satan(arg float64) float64 { // Special cases are: // Atan(±0) = ±0 // Atan(±Inf) = ±Pi/2 -func libc_atan(float64) float64 __asm__("atan") + +//extern atan +func libc_atan(float64) float64 + func Atan(x float64) float64 { return libc_atan(x) } Index: libgo/go/math/sin.go =================================================================== --- libgo/go/math/sin.go (revision 183650) +++ libgo/go/math/sin.go (working copy) @@ -114,7 +114,10 @@ var _cos = [...]float64{ // Special cases are: // Cos(±Inf) = NaN // Cos(NaN) = NaN -func libc_cos(float64) float64 __asm__("cos") + +//extern cos +func libc_cos(float64) float64 + func Cos(x float64) float64 { return libc_cos(x) } @@ -176,7 +179,10 @@ func cos(x float64) float64 { // Sin(±0) = ±0 // Sin(±Inf) = NaN // Sin(NaN) = NaN -func libc_sin(float64) float64 __asm__("sin") + +//extern sin +func libc_sin(float64) float64 + func Sin(x float64) float64 { return libc_sin(x) } Index: libgo/go/math/sqrt.go =================================================================== --- libgo/go/math/sqrt.go (revision 183650) +++ libgo/go/math/sqrt.go (working copy) @@ -11,7 +11,10 @@ package math // Sqrt(±0) = ±0 // Sqrt(x < 0) = NaN // Sqrt(NaN) = NaN -func libc_sqrt(float64) float64 __asm__("sqrt") + +//extern sqrt +func libc_sqrt(float64) float64 + func Sqrt(x float64) float64 { return libc_sqrt(x) } Index: libgo/go/math/expm1.go =================================================================== --- libgo/go/math/expm1.go (revision 183650) +++ libgo/go/math/expm1.go (working copy) @@ -121,7 +121,10 @@ package math // Expm1(-Inf) = -1 // Expm1(NaN) = NaN // Very large values overflow to -1 or +Inf. -func libc_expm1(float64) float64 __asm__("expm1") + +//extern expm1 +func libc_expm1(float64) float64 + func Expm1(x float64) float64 { return libc_expm1(x) } Index: libgo/go/math/exp.go =================================================================== --- libgo/go/math/exp.go (revision 183650) +++ libgo/go/math/exp.go (working copy) @@ -11,7 +11,10 @@ package math // Exp(NaN) = NaN // Very large values overflow to 0 or +Inf. // Very small values underflow to 1. -func libc_exp(float64) float64 __asm__("exp") + +//extern exp +func libc_exp(float64) float64 + func Exp(x float64) float64 { return libc_exp(x) } Index: libgo/go/math/abs.go =================================================================== --- libgo/go/math/abs.go (revision 183650) +++ libgo/go/math/abs.go (working copy) @@ -9,7 +9,10 @@ package math // Special cases are: // Abs(±Inf) = +Inf // Abs(NaN) = NaN -func libc_fabs(float64) float64 __asm__("fabs") + +//extern fabs +func libc_fabs(float64) float64 + func Abs(x float64) float64 { return libc_fabs(x) } Index: libgo/go/math/ldexp.go =================================================================== --- libgo/go/math/ldexp.go (revision 183650) +++ libgo/go/math/ldexp.go (working copy) @@ -11,7 +11,10 @@ package math // Ldexp(±0, exp) = ±0 // Ldexp(±Inf, exp) = ±Inf // Ldexp(NaN, exp) = NaN -func libc_ldexp(float64, int) float64 __asm__("ldexp") + +//extern ldexp +func libc_ldexp(float64, int) float64 + func Ldexp(frac float64, exp int) float64 { return libc_ldexp(frac, exp) } Index: libgo/go/math/floor.go =================================================================== --- libgo/go/math/floor.go (revision 183650) +++ libgo/go/math/floor.go (working copy) @@ -10,7 +10,10 @@ package math // Floor(±0) = ±0 // Floor(±Inf) = ±Inf // Floor(NaN) = NaN -func libc_floor(float64) float64 __asm__("floor") + +//extern floor +func libc_floor(float64) float64 + func Floor(x float64) float64 { return libc_floor(x) } @@ -38,7 +41,10 @@ func floor(x float64) float64 { // Ceil(±0) = ±0 // Ceil(±Inf) = ±Inf // Ceil(NaN) = NaN -func libc_ceil(float64) float64 __asm__("ceil") + +//extern ceil +func libc_ceil(float64) float64 + func Ceil(x float64) float64 { return libc_ceil(x) } @@ -53,7 +59,10 @@ func ceil(x float64) float64 { // Trunc(±0) = ±0 // Trunc(±Inf) = ±Inf // Trunc(NaN) = NaN -func libc_trunc(float64) float64 __asm__("trunc") + +//extern trunc +func libc_trunc(float64) float64 + func Trunc(x float64) float64 { return libc_trunc(x) } Index: libgo/go/math/tan.go =================================================================== --- libgo/go/math/tan.go (revision 183650) +++ libgo/go/math/tan.go (working copy) @@ -79,7 +79,10 @@ var _tanQ = [...]float64{ // Tan(±0) = ±0 // Tan(±Inf) = NaN // Tan(NaN) = NaN -func libc_tan(float64) float64 __asm__("tan") + +//extern tan +func libc_tan(float64) float64 + func Tan(x float64) float64 { return libc_tan(x) } Index: libgo/go/math/log10.go =================================================================== --- libgo/go/math/log10.go (revision 183650) +++ libgo/go/math/log10.go (working copy) @@ -6,7 +6,10 @@ package math // Log10 returns the decimal logarithm of x. // The special cases are the same as for Log. -func libc_log10(float64) float64 __asm__("log10") + +//extern log10 +func libc_log10(float64) float64 + func Log10(x float64) float64 { return libc_log10(x) } @@ -17,7 +20,10 @@ func log10(x float64) float64 { // Log2 returns the binary logarithm of x. // The special cases are the same as for Log. -func libc_log2(float64) float64 __asm__("log2") + +//extern log2 +func libc_log2(float64) float64 + func Log2(x float64) float64 { return libc_log2(x) } Index: libgo/go/math/log1p.go =================================================================== --- libgo/go/math/log1p.go (revision 183650) +++ libgo/go/math/log1p.go (working copy) @@ -92,7 +92,10 @@ package math // Log1p(-1) = -Inf // Log1p(x < -1) = NaN // Log1p(NaN) = NaN -func libc_log1p(float64) float64 __asm__("log1p") + +//extern log1p +func libc_log1p(float64) float64 + func Log1p(x float64) float64 { return libc_log1p(x) } Index: libgo/go/math/asin.go =================================================================== --- libgo/go/math/asin.go (revision 183650) +++ libgo/go/math/asin.go (working copy) @@ -16,7 +16,10 @@ package math // Special cases are: // Asin(±0) = ±0 // Asin(x) = NaN if x < -1 or x > 1 -func libc_asin(float64) float64 __asm__("asin") + +//extern asin +func libc_asin(float64) float64 + func Asin(x float64) float64 { return libc_asin(x) } @@ -51,7 +54,10 @@ func asin(x float64) float64 { // // Special case is: // Acos(x) = NaN if x < -1 or x > 1 -func libc_acos(float64) float64 __asm__("acos") + +//extern acos +func libc_acos(float64) float64 + func Acos(x float64) float64 { return libc_acos(x) } Index: libgo/go/math/atan2.go =================================================================== --- libgo/go/math/atan2.go (revision 183650) +++ libgo/go/math/atan2.go (working copy) @@ -26,7 +26,10 @@ package math // Atan2(y<0, -Inf) = -Pi // Atan2(+Inf, x) = +Pi/2 // Atan2(-Inf, x) = -Pi/2 -func libc_atan2(float64, float64) float64 __asm__("atan2") + +//extern atan2 +func libc_atan2(float64, float64) float64 + func Atan2(y, x float64) float64 { return libc_atan2(y, x) } Index: libgo/go/exp/terminal/util.go =================================================================== --- libgo/go/exp/terminal/util.go (revision 183650) +++ libgo/go/exp/terminal/util.go (working copy) @@ -60,7 +60,8 @@ func Restore(fd int, state *State) error return err } -func ioctl(int, int, unsafe.Pointer) int __asm__("ioctl") +//extern ioctl +func ioctl(int, int, unsafe.Pointer) int // GetSize returns the dimensions of the given terminal. func GetSize(fd int) (width, height int, err error) { Index: libgo/go/net/cgo_unix.go =================================================================== --- libgo/go/net/cgo_unix.go (revision 183650) +++ libgo/go/net/cgo_unix.go (working copy) @@ -21,9 +21,14 @@ import ( "unsafe" ) -func libc_getaddrinfo(node *byte, service *byte, hints *syscall.Addrinfo, res **syscall.Addrinfo) int __asm__ ("getaddrinfo") -func libc_freeaddrinfo(res *syscall.Addrinfo) __asm__ ("freeaddrinfo") -func libc_gai_strerror(errcode int) *byte __asm__ ("gai_strerror") +//extern getaddrinfo +func libc_getaddrinfo(node *byte, service *byte, hints *syscall.Addrinfo, res **syscall.Addrinfo) int + +//extern freeaddrinfo +func libc_freeaddrinfo(res *syscall.Addrinfo) + +//extern gai_strerror +func libc_gai_strerror(errcode int) *byte // bytePtrToString takes a NUL-terminated array of bytes and convert // it to a Go string. Index: libgo/go/syscall/mksyscall.awk =================================================================== --- libgo/go/syscall/mksyscall.awk (revision 183650) +++ libgo/go/syscall/mksyscall.awk (working copy) @@ -96,8 +96,8 @@ BEGIN { cfnresult = line printf("// Automatically generated wrapper for %s/%s\n", gofnname, cfnname) - printf("func c_%s(%s) %s%s__asm__(\"%s\")\n", - cfnname, cfnparams, cfnresult, cfnresult == "" ? "" : " ", cfnname) + printf("//extern %s\n", cfnname) + printf("func c_%s(%s) %s\n", cfnname, cfnparams, cfnresult) printf("func %s(%s) %s%s%s%s{\n", gofnname, gofnparams, gofnresults == "" ? "" : "(", gofnresults, gofnresults == "" ? "" : ")", gofnresults == "" ? "" : " ") Index: libgo/go/syscall/syscall_unix.go =================================================================== --- libgo/go/syscall/syscall_unix.go (revision 183650) +++ libgo/go/syscall/syscall_unix.go (working copy) @@ -18,8 +18,11 @@ var ( Stderr = 2 ) -func c_syscall32(trap int32, a1, a2, a3, a4, a5, a6 int32) int32 __asm__ ("syscall"); -func c_syscall64(trap int64, a1, a2, a3, a4, a5, a6 int64) int64 __asm__ ("syscall"); +//extern syscall +func c_syscall32(trap int32, a1, a2, a3, a4, a5, a6 int32) int32 + +//extern syscall +func c_syscall64(trap int64, a1, a2, a3, a4, a5, a6 int64) int64 const darwinAMD64 = runtime.GOOS == "darwin" && runtime.GOARCH == "amd64" @@ -46,7 +49,7 @@ func Syscall6(trap, a1, a2, a3, a4, a5, var r uintptr if unsafe.Sizeof(r) == 4 { r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3), - int32(a4), int32(a5), int32(a6)) + int32(a4), int32(a5), int32(a6)) r = uintptr(r1) } else { r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3), @@ -75,7 +78,7 @@ func RawSyscall6(trap, a1, a2, a3, a4, a var r uintptr if unsafe.Sizeof(r) == 4 { r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3), - int32(a4), int32(a5), int32(a6)) + int32(a4), int32(a5), int32(a6)) r = uintptr(r1) } else { r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3),