From patchwork Fri Apr 20 20:11:50 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Lance Taylor X-Patchwork-Id: 154135 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 06828B6FBB for ; Sat, 21 Apr 2012 06:12:42 +1000 (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=1335557563; 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=/OZuu8YdDdCvyRYLjXGSbZd+Rrc=; b=g/RYThzgLRDqPvZ 6PtXHtFpHxllfHS/tOQ0gvi5oYgeLV4FwKFAY8z3IVTnodg7hDhu9WPN+Y1Fg6FT wzC0alGRdr/hrBvYzKbc14ls0PbUQYBwd9PvdwxBew2JVmvbvaVIztqo57imAN7a MaFH4/qXeDGBAWTRb8QoBInWpa1U= 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:X-Google-DKIM-Signature:Received:Received:Received:From:To:Subject:Date:Message-ID:User-Agent:MIME-Version:Content-Type:X-Gm-Message-State:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=HHXyBwlJcOuo8MPwnJypTtsV9sm78snI62jv8ktSRp+kSV8NPC1gqfLD/nnJap gEaQ2eWUrcC6j+/jDgSyqCZLoo65L5rwUrKbjZcn/aFQKXEAKp024ps+tpZLxsIl 5DvJ5AH3kD9v++WJ2N+A1NajS41m+euKwV1DMS53rtFQ4=; Received: (qmail 2621 invoked by alias); 20 Apr 2012 20:12:23 -0000 Received: (qmail 2092 invoked by uid 22791); 20 Apr 2012 20:12:18 -0000 X-SWARE-Spam-Status: No, hits=-4.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, KHOP_RCVD_TRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE, TW_LR, T_RP_MATCHES_RCVD, T_TVD_MIME_NO_HEADERS X-Spam-Check-By: sourceware.org Received: from mail-yx0-f175.google.com (HELO mail-yx0-f175.google.com) (209.85.213.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 20 Apr 2012 20:12:01 +0000 Received: by yenm3 with SMTP id m3so5848734yen.20 for ; Fri, 20 Apr 2012 13:12:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:subject:date:message-id:user-agent:mime-version :content-type:x-gm-message-state; bh=rbajpZJIEEwmEswX/I/brCD67AQkqEWSoHSi0rwxzqQ=; b=GvC+Kaa11sjuY/mwiGwKgLtq1qzWioSRGVXYjWnaFXQSUVyRX7ZiikC/d+qKYugG5c Fs7VwtYJF9Qmb/YZSH/6paBg27KmEF8MCDG7qMAPm+o+DfiqDNfwHoHoBqYixxS5NJ4g zYkiMBvBBbS7EO8SyGjUDCAJqILhMa63IU/GTuHAFWessJmlv/dgyOyVRUYx5As5zqtE y69NrYQID+hb/wB3pwv9dPyReKBQ8OcSISk24BHUyW9Epjix1X/Ni7JrCV9dF6DxXEXe 7oehpWa25tcyQAveCZFVmQ0AAJeryqmNy4eWRKtMDU2Mtp2pLRiQvUSLFdnQsYNA+Jhl C8wQ== Received: by 10.50.159.196 with SMTP id xe4mr206271igb.17.1334952720787; Fri, 20 Apr 2012 13:12:00 -0700 (PDT) Received: by 10.50.159.196 with SMTP id xe4mr206257igb.17.1334952720625; Fri, 20 Apr 2012 13:12:00 -0700 (PDT) Received: from coign.google.com ([2620:0:1000:2301:f2de:f1ff:fe40:72a8]) by mx.google.com with ESMTPS id gf4sm4565879igb.14.2012.04.20.13.11.51 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 20 Apr 2012 13:11:52 -0700 (PDT) From: Ian Lance Taylor To: gcc-patches@gcc.gnu.org, gofrontend-dev@googlegroups.com Subject: libgo patch committed: Use native endianness for GNU/Linux netlink Date: Fri, 20 Apr 2012 13:11:50 -0700 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 X-Gm-Message-State: ALoCoQl2+Poa7KgYeaZTq+uxSVvMCuq7dSGVF4f9JjgoZnLYEKtmj3Zc5y/RbMWjYAqYTISwULvwMA4HZicyw+A833+7NLjM0QE6ht0mtGoewBbewzMKGOAzngV9/cBaFOtHGXRI5JL/Depp0Rhy1voxDZxEIoX9MfSdo7qkTAkGeU9UDVRo670= 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 This patch to libgo changes the way that GNU/Linux netlink code is handled on big-endian systems. Rather than test whether the system is big- or little-endian, this code simply uses the native endianness, whatever it is, via the unsafe package. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu and powerpc64-unknown-linux-gnu. Committed to mainline and 4.7 branch. Ian Index: libgo/configure.ac =================================================================== --- libgo/configure.ac (revision 186144) +++ libgo/configure.ac (working copy) @@ -400,12 +400,6 @@ dnl Test if -lrt is required for sched_y AC_SEARCH_LIBS([sched_yield], [rt]) AC_C_BIGENDIAN -case $ac_cv_c_bigendian in - yes) GO_BIGENDIAN=true ;; - no) GO_BIGENDIAN=false ;; - *) AC_MSG_ERROR([unknown endianness]) ;; -esac -AC_SUBST(GO_BIGENDIAN) GCC_CHECK_UNWIND_GETIPINFO Index: libgo/go/net/interface_linux.go =================================================================== --- libgo/go/net/interface_linux.go (revision 186123) +++ libgo/go/net/interface_linux.go (working copy) @@ -64,11 +64,7 @@ func newLink(ifim *syscall.IfInfomsg, at case syscall.IFLA_IFNAME: ifi.Name = string(a.Value[:len(a.Value)-1]) case syscall.IFLA_MTU: - if syscall.BigEndian { - ifi.MTU = int(uint32(a.Value[0])<<24 | uint32(a.Value[1])<<16 | uint32(a.Value[2])<<8 | uint32(a.Value[3])) - } else { - ifi.MTU = int(uint32(a.Value[3])<<24 | uint32(a.Value[2])<<16 | uint32(a.Value[1])<<8 | uint32(a.Value[0])) - } + ifi.MTU = int(*(*uint32)(unsafe.Pointer(&a.Value[:4][0]))) } } return ifi @@ -197,15 +193,14 @@ func parseProcNetIGMP(path string, ifi * name = f[1] case len(f[0]) == 8: if ifi == nil || name == ifi.Name { + // The Linux kernel puts the IP + // address in /proc/net/igmp in native + // endianness. for i := 0; i+1 < len(f[0]); i += 2 { b[i/2], _ = xtoi2(f[0][i:i+2], 0) } - var ifma IPAddr - if syscall.BigEndian { - ifma = IPAddr{IP: IPv4(b[0], b[1], b[2], b[3])} - } else { - ifma = IPAddr{IP: IPv4(b[3], b[2], b[1], b[0])} - } + i := *(*uint32)(unsafe.Pointer(&b[:4][0])) + ifma := IPAddr{IP: IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i))} ifmat = append(ifmat, ifma.toAddr()) } } Index: libgo/go/syscall/netlink_linux.go =================================================================== --- libgo/go/syscall/netlink_linux.go (revision 186123) +++ libgo/go/syscall/netlink_linux.go (working copy) @@ -30,43 +30,12 @@ type NetlinkRouteRequest struct { func (rr *NetlinkRouteRequest) toWireFormat() []byte { b := make([]byte, rr.Header.Len) - if BigEndian { - b[0] = byte(rr.Header.Len >> 24) - b[1] = byte(rr.Header.Len >> 16) - b[2] = byte(rr.Header.Len >> 8) - b[3] = byte(rr.Header.Len) - b[4] = byte(rr.Header.Type >> 8) - b[5] = byte(rr.Header.Type) - b[6] = byte(rr.Header.Flags >> 8) - b[7] = byte(rr.Header.Flags) - b[8] = byte(rr.Header.Seq >> 24) - b[9] = byte(rr.Header.Seq >> 16) - b[10] = byte(rr.Header.Seq >> 8) - b[11] = byte(rr.Header.Seq) - b[12] = byte(rr.Header.Pid >> 24) - b[13] = byte(rr.Header.Pid >> 16) - b[14] = byte(rr.Header.Pid >> 8) - b[15] = byte(rr.Header.Pid) - b[16] = byte(rr.Data.Family) - } else { - b[0] = byte(rr.Header.Len) - b[1] = byte(rr.Header.Len >> 8) - b[2] = byte(rr.Header.Len >> 16) - b[3] = byte(rr.Header.Len >> 24) - b[4] = byte(rr.Header.Type) - b[5] = byte(rr.Header.Type >> 8) - b[6] = byte(rr.Header.Flags) - b[7] = byte(rr.Header.Flags >> 8) - b[8] = byte(rr.Header.Seq) - b[9] = byte(rr.Header.Seq >> 8) - b[10] = byte(rr.Header.Seq >> 16) - b[11] = byte(rr.Header.Seq >> 24) - b[12] = byte(rr.Header.Pid) - b[13] = byte(rr.Header.Pid >> 8) - b[14] = byte(rr.Header.Pid >> 16) - b[15] = byte(rr.Header.Pid >> 24) - b[16] = byte(rr.Data.Family) - } + *(*uint32)(unsafe.Pointer(&b[0:4][0])) = rr.Header.Len + *(*uint16)(unsafe.Pointer(&b[4:6][0])) = rr.Header.Type + *(*uint16)(unsafe.Pointer(&b[6:8][0])) = rr.Header.Flags + *(*uint32)(unsafe.Pointer(&b[8:12][0])) = rr.Header.Seq + *(*uint32)(unsafe.Pointer(&b[12:16][0])) = rr.Header.Pid + b[16] = byte(rr.Data.Family) return b } Index: libgo/Makefile.am =================================================================== --- libgo/Makefile.am (revision 186123) +++ libgo/Makefile.am (working copy) @@ -1559,7 +1559,6 @@ s-syscall_arch: Makefile echo "package syscall" > syscall_arch.go.tmp echo 'const ARCH = "'$(GOARCH)'"' >> syscall_arch.go.tmp echo 'const OS = "'$(GOOS)'"' >> syscall_arch.go.tmp - echo 'const BigEndian = $(GO_BIGENDIAN)' >> syscall_arch.go.tmp $(SHELL) $(srcdir)/../move-if-change syscall_arch.go.tmp syscall_arch.go $(STAMP) $@