Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 Nov 2013 16:26:05 +0000 (UTC)
From:      Mark Murray <markm@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r258769 - in projects/random_number_generator: . cddl/contrib/opensolaris/cmd/zdb cddl/contrib/opensolaris/cmd/zpool cddl/contrib/opensolaris/cmd/ztest contrib/gcc contrib/gcc/cp contri...
Message-ID:  <201311301626.rAUGQ5LO014686@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markm
Date: Sat Nov 30 16:26:04 2013
New Revision: 258769
URL: http://svnweb.freebsd.org/changeset/base/258769

Log:
  MFC - tracking commit

Added:
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/range_tree.c
     - copied unchanged from r258768, head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/range_tree.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_reftree.c
     - copied unchanged from r258768, head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_reftree.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/range_tree.h
     - copied unchanged from r258768, head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/range_tree.h
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/space_reftree.h
     - copied unchanged from r258768, head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/space_reftree.h
  projects/random_number_generator/sys/net/sff8472.h
     - copied unchanged from r258768, head/sys/net/sff8472.h
  projects/random_number_generator/sys/powerpc/wii/ios_if.m
     - copied unchanged from r258768, head/sys/powerpc/wii/ios_if.m
Modified:
  projects/random_number_generator/UPDATING
  projects/random_number_generator/cddl/contrib/opensolaris/cmd/zdb/zdb.c
  projects/random_number_generator/cddl/contrib/opensolaris/cmd/zpool/zpool-features.7
  projects/random_number_generator/cddl/contrib/opensolaris/cmd/ztest/ztest.c
  projects/random_number_generator/contrib/gcc/ChangeLog.gcc43
  projects/random_number_generator/contrib/gcc/builtins.c
  projects/random_number_generator/contrib/gcc/c-common.c
  projects/random_number_generator/contrib/gcc/c-decl.c
  projects/random_number_generator/contrib/gcc/c-typeck.c
  projects/random_number_generator/contrib/gcc/cp/ChangeLog.gcc43
  projects/random_number_generator/contrib/gcc/cp/decl.c
  projects/random_number_generator/contrib/gcc/cp/semantics.c
  projects/random_number_generator/contrib/gcc/cp/typeck.c
  projects/random_number_generator/contrib/gcc/doc/extend.texi
  projects/random_number_generator/contrib/gcc/flags.h
  projects/random_number_generator/contrib/gcc/print-tree.c
  projects/random_number_generator/contrib/gcc/toplev.c
  projects/random_number_generator/contrib/gcc/tree.c
  projects/random_number_generator/contrib/gcc/tree.h
  projects/random_number_generator/contrib/gcc/varasm.c
  projects/random_number_generator/contrib/gcclibs/libcpp/charset.c
  projects/random_number_generator/lib/libc/sys/pdfork.2
  projects/random_number_generator/lib/libnetgraph/netgraph.3
  projects/random_number_generator/lib/libstand/libstand.3
  projects/random_number_generator/sbin/fdisk/fdisk.c
  projects/random_number_generator/sbin/ipfw/ipfw2.c
  projects/random_number_generator/sbin/ipfw/ipfw2.h
  projects/random_number_generator/share/man/man4/capsicum.4
  projects/random_number_generator/share/man/man4/netgraph.4
  projects/random_number_generator/share/man/man4/procdesc.4
  projects/random_number_generator/share/misc/committers-src.dot   (contents, props changed)
  projects/random_number_generator/share/mk/bsd.own.mk
  projects/random_number_generator/sys/amd64/conf/GENERIC
  projects/random_number_generator/sys/amd64/vmm/io/ppt.c
  projects/random_number_generator/sys/amd64/vmm/io/vhpet.c
  projects/random_number_generator/sys/amd64/vmm/io/vioapic.c
  projects/random_number_generator/sys/amd64/vmm/io/vioapic.h
  projects/random_number_generator/sys/amd64/vmm/io/vlapic.c
  projects/random_number_generator/sys/amd64/vmm/io/vlapic.h
  projects/random_number_generator/sys/amd64/vmm/vmm_dev.c
  projects/random_number_generator/sys/amd64/vmm/vmm_ktr.h
  projects/random_number_generator/sys/amd64/vmm/vmm_lapic.c
  projects/random_number_generator/sys/amd64/vmm/vmm_lapic.h
  projects/random_number_generator/sys/arm/arm/pmap-v6.c
  projects/random_number_generator/sys/boot/i386/efi/reloc.c
  projects/random_number_generator/sys/cddl/compat/opensolaris/kern/opensolaris_taskq.c
  projects/random_number_generator/sys/cddl/compat/opensolaris/kern/opensolaris_vm.c
  projects/random_number_generator/sys/cddl/compat/opensolaris/sys/vm.h
  projects/random_number_generator/sys/cddl/contrib/opensolaris/common/zfs/zfeature_common.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/common/zfs/zfeature_common.h
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/Makefile.files
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/space_map.h
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfeature.h
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfeature.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
  projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
  projects/random_number_generator/sys/compat/freebsd32/freebsd32_misc.c
  projects/random_number_generator/sys/conf/NOTES
  projects/random_number_generator/sys/conf/files
  projects/random_number_generator/sys/conf/kern.pre.mk
  projects/random_number_generator/sys/conf/options
  projects/random_number_generator/sys/conf/options.amd64
  projects/random_number_generator/sys/dev/cxgbe/t4_sge.c
  projects/random_number_generator/sys/dev/iwn/if_iwn.c
  projects/random_number_generator/sys/dev/nand/nandbus.c
  projects/random_number_generator/sys/dev/usb/wlan/if_run.c
  projects/random_number_generator/sys/dev/usb/wlan/if_runreg.h
  projects/random_number_generator/sys/geom/geom_disk.c
  projects/random_number_generator/sys/geom/geom_dump.c
  projects/random_number_generator/sys/geom/geom_int.h
  projects/random_number_generator/sys/i386/conf/GENERIC
  projects/random_number_generator/sys/ia64/conf/GENERIC
  projects/random_number_generator/sys/kern/kern_descrip.c
  projects/random_number_generator/sys/kern/kern_exit.c
  projects/random_number_generator/sys/kern/kern_fork.c
  projects/random_number_generator/sys/kern/kern_jail.c
  projects/random_number_generator/sys/kern/kern_sig.c
  projects/random_number_generator/sys/kern/subr_taskqueue.c
  projects/random_number_generator/sys/kern/sys_procdesc.c
  projects/random_number_generator/sys/libkern/iconv.c
  projects/random_number_generator/sys/net80211/ieee80211_scan.c
  projects/random_number_generator/sys/net80211/ieee80211_scan_sta.c
  projects/random_number_generator/sys/netinet/sctp_bsd_addr.c
  projects/random_number_generator/sys/netinet/sctp_pcb.c
  projects/random_number_generator/sys/netpfil/ipfw/ip_fw2.c
  projects/random_number_generator/sys/netpfil/ipfw/ip_fw_sockopt.c
  projects/random_number_generator/sys/pc98/conf/GENERIC
  projects/random_number_generator/sys/powerpc/aim/machdep.c
  projects/random_number_generator/sys/powerpc/aim/trap.c
  projects/random_number_generator/sys/powerpc/booke/trap.c
  projects/random_number_generator/sys/powerpc/conf/GENERIC
  projects/random_number_generator/sys/powerpc/ofw/rtas.c
  projects/random_number_generator/sys/powerpc/powermac/grackle.c
  projects/random_number_generator/sys/powerpc/powerpc/cpu.c
  projects/random_number_generator/sys/powerpc/pseries/phyp_console.c
  projects/random_number_generator/sys/sparc64/conf/GENERIC
  projects/random_number_generator/sys/sys/taskqueue.h
  projects/random_number_generator/sys/vm/uma_core.c
  projects/random_number_generator/tools/tools/cxgbetool/Makefile
  projects/random_number_generator/tools/tools/cxgbetool/cxgbetool.c
  projects/random_number_generator/tools/tools/nanobsd/nanobsd.sh
  projects/random_number_generator/usr.sbin/bhyve/acpi.c
  projects/random_number_generator/usr.sbin/bhyve/mptbl.c
  projects/random_number_generator/usr.sbin/bsdconfig/includes/includes
  projects/random_number_generator/usr.sbin/makefs/ffs.c
  projects/random_number_generator/usr.sbin/rwhod/rwhod.c
Directory Properties:
  projects/random_number_generator/   (props changed)
  projects/random_number_generator/cddl/   (props changed)
  projects/random_number_generator/cddl/contrib/opensolaris/   (props changed)
  projects/random_number_generator/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/print/   (props changed)
  projects/random_number_generator/cddl/contrib/opensolaris/cmd/zfs/   (props changed)
  projects/random_number_generator/cddl/contrib/opensolaris/lib/libzfs/   (props changed)
  projects/random_number_generator/contrib/gcc/   (props changed)
  projects/random_number_generator/lib/libc/   (props changed)
  projects/random_number_generator/sbin/   (props changed)
  projects/random_number_generator/sbin/ipfw/   (props changed)
  projects/random_number_generator/share/man/man4/   (props changed)
  projects/random_number_generator/sys/   (props changed)
  projects/random_number_generator/sys/amd64/vmm/   (props changed)
  projects/random_number_generator/sys/boot/   (props changed)
  projects/random_number_generator/sys/boot/i386/efi/   (props changed)
  projects/random_number_generator/sys/cddl/contrib/opensolaris/   (props changed)
  projects/random_number_generator/sys/conf/   (props changed)
  projects/random_number_generator/usr.sbin/bhyve/   (props changed)

Modified: projects/random_number_generator/UPDATING
==============================================================================
--- projects/random_number_generator/UPDATING	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/UPDATING	Sat Nov 30 16:26:04 2013	(r258769)
@@ -31,13 +31,6 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11
 	disable the most expensive debugging functionality run
 	"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
 
-20131126:
-	WITH_LIB32 has been changed to WITHOUT_LIB32 by default.  You
-	can set WITH_LIB32=yes in make.conf or src.conf, or if you need
-	to do a quick 32 bit library build you can do a 'make build32'
-	and 'make install32' as a separate step AFTER doing a
-	buildworld/installworld.
-
 20131108:
 	The WITHOUT_ATF build knob has been removed and its functionality
 	has been subsumed into the more generic WITHOUT_TESTS.  If you were
@@ -83,7 +76,12 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11
 	BIND has been removed from the base system.  If all you need
 	is a local resolver, simply enable and start the local_unbound
 	service instead.  Otherwise, several versions of BIND are
-	available in the ports tree.
+	available in the ports tree.   The dns/bind99 port is one example.
+
+	With this change, nslookup(1) and dig(1) are no longer in the base
+	system.  Users should instead use host(1) and drill(1) which are
+	in the base system.  Alternatively, nslookup and dig can
+	be obtained by installing the dns/bind-tools port.
 
 20130916:
 	With the addition of unbound(8), a new unbound user is now

Modified: projects/random_number_generator/cddl/contrib/opensolaris/cmd/zdb/zdb.c
==============================================================================
--- projects/random_number_generator/cddl/contrib/opensolaris/cmd/zdb/zdb.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/cddl/contrib/opensolaris/cmd/zdb/zdb.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -242,7 +242,7 @@ const char histo_stars[] = "************
 const int histo_width = sizeof (histo_stars) - 1;
 
 static void
-dump_histogram(const uint64_t *histo, int size)
+dump_histogram(const uint64_t *histo, int size, int offset)
 {
 	int i;
 	int minidx = size - 1;
@@ -263,7 +263,7 @@ dump_histogram(const uint64_t *histo, in
 
 	for (i = minidx; i <= maxidx; i++) {
 		(void) printf("\t\t\t%3u: %6llu %s\n",
-		    i, (u_longlong_t)histo[i],
+		    i + offset, (u_longlong_t)histo[i],
 		    &histo_stars[(max - histo[i]) * histo_width / max]);
 	}
 }
@@ -316,19 +316,19 @@ dump_zap_stats(objset_t *os, uint64_t ob
 	    (u_longlong_t)zs.zs_salt);
 
 	(void) printf("\t\tLeafs with 2^n pointers:\n");
-	dump_histogram(zs.zs_leafs_with_2n_pointers, ZAP_HISTOGRAM_SIZE);
+	dump_histogram(zs.zs_leafs_with_2n_pointers, ZAP_HISTOGRAM_SIZE, 0);
 
 	(void) printf("\t\tBlocks with n*5 entries:\n");
-	dump_histogram(zs.zs_blocks_with_n5_entries, ZAP_HISTOGRAM_SIZE);
+	dump_histogram(zs.zs_blocks_with_n5_entries, ZAP_HISTOGRAM_SIZE, 0);
 
 	(void) printf("\t\tBlocks n/10 full:\n");
-	dump_histogram(zs.zs_blocks_n_tenths_full, ZAP_HISTOGRAM_SIZE);
+	dump_histogram(zs.zs_blocks_n_tenths_full, ZAP_HISTOGRAM_SIZE, 0);
 
 	(void) printf("\t\tEntries with n chunks:\n");
-	dump_histogram(zs.zs_entries_using_n_chunks, ZAP_HISTOGRAM_SIZE);
+	dump_histogram(zs.zs_entries_using_n_chunks, ZAP_HISTOGRAM_SIZE, 0);
 
 	(void) printf("\t\tBuckets with n entries:\n");
-	dump_histogram(zs.zs_buckets_with_n_entries, ZAP_HISTOGRAM_SIZE);
+	dump_histogram(zs.zs_buckets_with_n_entries, ZAP_HISTOGRAM_SIZE, 0);
 }
 
 /*ARGSUSED*/
@@ -517,26 +517,85 @@ dump_zpldir(objset_t *os, uint64_t objec
 	zap_cursor_fini(&zc);
 }
 
+int
+get_dtl_refcount(vdev_t *vd)
+{
+	int refcount = 0;
+
+	if (vd->vdev_ops->vdev_op_leaf) {
+		space_map_t *sm = vd->vdev_dtl_sm;
+
+		if (sm != NULL &&
+		    sm->sm_dbuf->db_size == sizeof (space_map_phys_t))
+			return (1);
+		return (0);
+	}
+
+	for (int c = 0; c < vd->vdev_children; c++)
+		refcount += get_dtl_refcount(vd->vdev_child[c]);
+	return (refcount);
+}
+
+int
+get_metaslab_refcount(vdev_t *vd)
+{
+	int refcount = 0;
+
+	if (vd->vdev_top == vd) {
+		for (int m = 0; m < vd->vdev_ms_count; m++) {
+			space_map_t *sm = vd->vdev_ms[m]->ms_sm;
+
+			if (sm != NULL &&
+			    sm->sm_dbuf->db_size == sizeof (space_map_phys_t))
+				refcount++;
+		}
+	}
+	for (int c = 0; c < vd->vdev_children; c++)
+		refcount += get_metaslab_refcount(vd->vdev_child[c]);
+
+	return (refcount);
+}
+
+static int
+verify_spacemap_refcounts(spa_t *spa)
+{
+	int expected_refcount, actual_refcount;
+
+	expected_refcount = spa_feature_get_refcount(spa,
+	    &spa_feature_table[SPA_FEATURE_SPACEMAP_HISTOGRAM]);
+	actual_refcount = get_dtl_refcount(spa->spa_root_vdev);
+	actual_refcount += get_metaslab_refcount(spa->spa_root_vdev);
+
+	if (expected_refcount != actual_refcount) {
+		(void) printf("space map refcount mismatch: expected %d != "
+		    "actual %d\n", expected_refcount, actual_refcount);
+		return (2);
+	}
+	return (0);
+}
+
 static void
-dump_spacemap(objset_t *os, space_map_obj_t *smo, space_map_t *sm)
+dump_spacemap(objset_t *os, space_map_t *sm)
 {
 	uint64_t alloc, offset, entry;
-	uint8_t mapshift = sm->sm_shift;
-	uint64_t mapstart = sm->sm_start;
 	char *ddata[] = { "ALLOC", "FREE", "CONDENSE", "INVALID",
 			    "INVALID", "INVALID", "INVALID", "INVALID" };
 
-	if (smo->smo_object == 0)
+	if (sm == NULL)
 		return;
 
 	/*
 	 * Print out the freelist entries in both encoded and decoded form.
 	 */
 	alloc = 0;
-	for (offset = 0; offset < smo->smo_objsize; offset += sizeof (entry)) {
-		VERIFY3U(0, ==, dmu_read(os, smo->smo_object, offset,
+	for (offset = 0; offset < space_map_length(sm);
+	    offset += sizeof (entry)) {
+		uint8_t mapshift = sm->sm_shift;
+
+		VERIFY0(dmu_read(os, space_map_object(sm), offset,
 		    sizeof (entry), &entry, DMU_READ_PREFETCH));
 		if (SM_DEBUG_DECODE(entry)) {
+
 			(void) printf("\t    [%6llu] %s: txg %llu, pass %llu\n",
 			    (u_longlong_t)(offset / sizeof (entry)),
 			    ddata[SM_DEBUG_ACTION_DECODE(entry)],
@@ -548,10 +607,10 @@ dump_spacemap(objset_t *os, space_map_ob
 			    (u_longlong_t)(offset / sizeof (entry)),
 			    SM_TYPE_DECODE(entry) == SM_ALLOC ? 'A' : 'F',
 			    (u_longlong_t)((SM_OFFSET_DECODE(entry) <<
-			    mapshift) + mapstart),
+			    mapshift) + sm->sm_start),
 			    (u_longlong_t)((SM_OFFSET_DECODE(entry) <<
-			    mapshift) + mapstart + (SM_RUN_DECODE(entry) <<
-			    mapshift)),
+			    mapshift) + sm->sm_start +
+			    (SM_RUN_DECODE(entry) << mapshift)),
 			    (u_longlong_t)(SM_RUN_DECODE(entry) << mapshift));
 			if (SM_TYPE_DECODE(entry) == SM_ALLOC)
 				alloc += SM_RUN_DECODE(entry) << mapshift;
@@ -559,10 +618,10 @@ dump_spacemap(objset_t *os, space_map_ob
 				alloc -= SM_RUN_DECODE(entry) << mapshift;
 		}
 	}
-	if (alloc != smo->smo_alloc) {
+	if (alloc != space_map_allocated(sm)) {
 		(void) printf("space_map_object alloc (%llu) INCONSISTENT "
 		    "with space map summary (%llu)\n",
-		    (u_longlong_t)smo->smo_alloc, (u_longlong_t)alloc);
+		    (u_longlong_t)space_map_allocated(sm), (u_longlong_t)alloc);
 	}
 }
 
@@ -570,15 +629,17 @@ static void
 dump_metaslab_stats(metaslab_t *msp)
 {
 	char maxbuf[32];
-	space_map_t *sm = msp->ms_map;
-	avl_tree_t *t = sm->sm_pp_root;
-	int free_pct = sm->sm_space * 100 / sm->sm_size;
+	range_tree_t *rt = msp->ms_tree;
+	avl_tree_t *t = &msp->ms_size_tree;
+	int free_pct = range_tree_space(rt) * 100 / msp->ms_size;
 
-	zdb_nicenum(space_map_maxsize(sm), maxbuf);
+	zdb_nicenum(metaslab_block_maxsize(msp), maxbuf);
 
 	(void) printf("\t %25s %10lu   %7s  %6s   %4s %4d%%\n",
 	    "segments", avl_numnodes(t), "maxsize", maxbuf,
 	    "freepct", free_pct);
+	(void) printf("\tIn-memory histogram:\n");
+	dump_histogram(rt->rt_histogram, RANGE_TREE_HISTOGRAM_SIZE, 0);
 }
 
 static void
@@ -586,33 +647,45 @@ dump_metaslab(metaslab_t *msp)
 {
 	vdev_t *vd = msp->ms_group->mg_vd;
 	spa_t *spa = vd->vdev_spa;
-	space_map_t *sm = msp->ms_map;
-	space_map_obj_t *smo = &msp->ms_smo;
+	space_map_t *sm = msp->ms_sm;
 	char freebuf[32];
 
-	zdb_nicenum(sm->sm_size - smo->smo_alloc, freebuf);
+	zdb_nicenum(msp->ms_size - space_map_allocated(sm), freebuf);
 
 	(void) printf(
 	    "\tmetaslab %6llu   offset %12llx   spacemap %6llu   free    %5s\n",
-	    (u_longlong_t)(sm->sm_start / sm->sm_size),
-	    (u_longlong_t)sm->sm_start, (u_longlong_t)smo->smo_object, freebuf);
+	    (u_longlong_t)msp->ms_id, (u_longlong_t)msp->ms_start,
+	    (u_longlong_t)space_map_object(sm), freebuf);
 
-	if (dump_opt['m'] > 1 && !dump_opt['L']) {
+	if (dump_opt['m'] > 2 && !dump_opt['L']) {
 		mutex_enter(&msp->ms_lock);
-		space_map_load_wait(sm);
-		if (!sm->sm_loaded)
-			VERIFY(space_map_load(sm, zfs_metaslab_ops,
-			    SM_FREE, smo, spa->spa_meta_objset) == 0);
+		metaslab_load_wait(msp);
+		if (!msp->ms_loaded) {
+			VERIFY0(metaslab_load(msp));
+			range_tree_stat_verify(msp->ms_tree);
+		}
 		dump_metaslab_stats(msp);
-		space_map_unload(sm);
+		metaslab_unload(msp);
 		mutex_exit(&msp->ms_lock);
 	}
 
-	if (dump_opt['d'] > 5 || dump_opt['m'] > 2) {
-		ASSERT(sm->sm_size == (1ULL << vd->vdev_ms_shift));
+	if (dump_opt['m'] > 1 && sm != NULL &&
+	    spa_feature_is_active(spa,
+	    &spa_feature_table[SPA_FEATURE_SPACEMAP_HISTOGRAM])) {
+		/*
+		 * The space map histogram represents free space in chunks
+		 * of sm_shift (i.e. bucket 0 refers to 2^sm_shift).
+		 */
+		(void) printf("\tOn-disk histogram:\n");
+		dump_histogram(sm->sm_phys->smp_histogram,
+		    SPACE_MAP_HISTOGRAM_SIZE(sm), sm->sm_shift);
+	}
+
+	if (dump_opt['d'] > 5 || dump_opt['m'] > 3) {
+		ASSERT(msp->ms_size == (1ULL << vd->vdev_ms_shift));
 
 		mutex_enter(&msp->ms_lock);
-		dump_spacemap(spa->spa_meta_objset, smo, sm);
+		dump_spacemap(spa->spa_meta_objset, msp->ms_sm);
 		mutex_exit(&msp->ms_lock);
 	}
 }
@@ -801,9 +874,9 @@ dump_all_ddts(spa_t *spa)
 }
 
 static void
-dump_dtl_seg(space_map_t *sm, uint64_t start, uint64_t size)
+dump_dtl_seg(void *arg, uint64_t start, uint64_t size)
 {
-	char *prefix = (void *)sm;
+	char *prefix = arg;
 
 	(void) printf("%s [%llu,%llu) length %llu\n",
 	    prefix,
@@ -833,17 +906,16 @@ dump_dtl(vdev_t *vd, int indent)
 	    required ? "DTL-required" : "DTL-expendable");
 
 	for (int t = 0; t < DTL_TYPES; t++) {
-		space_map_t *sm = &vd->vdev_dtl[t];
-		if (sm->sm_space == 0)
+		range_tree_t *rt = vd->vdev_dtl[t];
+		if (range_tree_space(rt) == 0)
 			continue;
 		(void) snprintf(prefix, sizeof (prefix), "\t%*s%s",
 		    indent + 2, "", name[t]);
-		mutex_enter(sm->sm_lock);
-		space_map_walk(sm, dump_dtl_seg, (void *)prefix);
-		mutex_exit(sm->sm_lock);
+		mutex_enter(rt->rt_lock);
+		range_tree_walk(rt, dump_dtl_seg, prefix);
+		mutex_exit(rt->rt_lock);
 		if (dump_opt['d'] > 5 && vd->vdev_children == 0)
-			dump_spacemap(spa->spa_meta_objset,
-			    &vd->vdev_dtl_smo, sm);
+			dump_spacemap(spa->spa_meta_objset, vd->vdev_dtl_sm);
 	}
 
 	for (int c = 0; c < vd->vdev_children; c++)
@@ -2172,39 +2244,17 @@ zdb_blkptr_cb(spa_t *spa, zilog_t *zilog
 }
 
 static void
-zdb_leak(space_map_t *sm, uint64_t start, uint64_t size)
+zdb_leak(void *arg, uint64_t start, uint64_t size)
 {
-	vdev_t *vd = sm->sm_ppd;
+	vdev_t *vd = arg;
 
 	(void) printf("leaked space: vdev %llu, offset 0x%llx, size %llu\n",
 	    (u_longlong_t)vd->vdev_id, (u_longlong_t)start, (u_longlong_t)size);
 }
 
-/* ARGSUSED */
-static void
-zdb_space_map_load(space_map_t *sm)
-{
-}
-
-static void
-zdb_space_map_unload(space_map_t *sm)
-{
-	space_map_vacate(sm, zdb_leak, sm);
-}
-
-/* ARGSUSED */
-static void
-zdb_space_map_claim(space_map_t *sm, uint64_t start, uint64_t size)
-{
-}
-
-static space_map_ops_t zdb_space_map_ops = {
-	zdb_space_map_load,
-	zdb_space_map_unload,
+static metaslab_ops_t zdb_metaslab_ops = {
 	NULL,	/* alloc */
-	zdb_space_map_claim,
-	NULL,	/* free */
-	NULL	/* maxsize */
+	NULL	/* fragmented */
 };
 
 static void
@@ -2259,11 +2309,21 @@ zdb_leak_init(spa_t *spa, zdb_cb_t *zcb)
 			for (int m = 0; m < vd->vdev_ms_count; m++) {
 				metaslab_t *msp = vd->vdev_ms[m];
 				mutex_enter(&msp->ms_lock);
-				space_map_unload(msp->ms_map);
-				VERIFY(space_map_load(msp->ms_map,
-				    &zdb_space_map_ops, SM_ALLOC, &msp->ms_smo,
-				    spa->spa_meta_objset) == 0);
-				msp->ms_map->sm_ppd = vd;
+				metaslab_unload(msp);
+
+				/*
+				 * For leak detection, we overload the metaslab
+				 * ms_tree to contain allocated segments
+				 * instead of free segments. As a result,
+				 * we can't use the normal metaslab_load/unload
+				 * interfaces.
+				 */
+				if (msp->ms_sm != NULL) {
+					msp->ms_ops = &zdb_metaslab_ops;
+					VERIFY0(space_map_load(msp->ms_sm,
+					    msp->ms_tree, SM_ALLOC));
+					msp->ms_loaded = B_TRUE;
+				}
 				mutex_exit(&msp->ms_lock);
 			}
 		}
@@ -2286,7 +2346,20 @@ zdb_leak_fini(spa_t *spa)
 			for (int m = 0; m < vd->vdev_ms_count; m++) {
 				metaslab_t *msp = vd->vdev_ms[m];
 				mutex_enter(&msp->ms_lock);
-				space_map_unload(msp->ms_map);
+
+				/*
+				 * The ms_tree has been overloaded to
+				 * contain allocated segments. Now that we
+				 * finished traversing all blocks, any
+				 * block that remains in the ms_tree
+				 * represents an allocated block that we
+				 * did not claim during the traversal.
+				 * Claimed blocks would have been removed
+				 * from the ms_tree.
+				 */
+				range_tree_vacate(msp->ms_tree, zdb_leak, vd);
+				msp->ms_loaded = B_FALSE;
+
 				mutex_exit(&msp->ms_lock);
 			}
 		}
@@ -2489,7 +2562,7 @@ dump_block_stats(spa_t *spa)
 					    "(in 512-byte sectors): "
 					    "number of blocks\n");
 					dump_histogram(zb->zb_psize_histogram,
-					    PSIZE_HISTO_SIZE);
+					    PSIZE_HISTO_SIZE, 0);
 				}
 			}
 		}
@@ -2659,6 +2732,9 @@ dump_zpool(spa_t *spa)
 	if (dump_opt['b'] || dump_opt['c'])
 		rc = dump_block_stats(spa);
 
+	if (rc == 0)
+		rc = verify_spacemap_refcounts(spa);
+
 	if (dump_opt['s'])
 		show_pool_stats(spa);
 

Modified: projects/random_number_generator/cddl/contrib/opensolaris/cmd/zpool/zpool-features.7
==============================================================================
--- projects/random_number_generator/cddl/contrib/opensolaris/cmd/zpool/zpool-features.7	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/cddl/contrib/opensolaris/cmd/zpool/zpool-features.7	Sat Nov 30 16:26:04 2013	(r258769)
@@ -23,7 +23,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd September 20, 2013
+.Dd October 08, 2013
 .Dt ZPOOL-FEATURES 7
 .Os
 .Sh NAME
@@ -251,6 +251,24 @@ configuration.
 .\" .Xr dumpon 8
 .\" command to configure a
 .\" dump device on a pool comprised of multiple vdevs.
+.It Sy spacemap_histogram
+.Bl -column "READ\-ONLY COMPATIBLE" "com.delphix:spacemap_histogram"
+.It GUID Ta com.delphix:spacemap_histogram
+.It READ\-ONLY COMPATIBLE Ta yes
+.It DEPENDENCIES Ta none
+.El
+.Pp
+This features allows ZFS to maintain more information about how free space
+is organized within the pool. If this feature is 
+.Sy enabled ,
+ZFS will
+set this feature to
+.Sy active
+when a new space map object is created or
+an existing space map is upgraded to the new format.
+Once the feature is
+.Sy active ,
+it will remain in that state until the pool is destroyed.
 .El
 .Sh SEE ALSO
 .Xr zpool 8

Modified: projects/random_number_generator/cddl/contrib/opensolaris/cmd/ztest/ztest.c
==============================================================================
--- projects/random_number_generator/cddl/contrib/opensolaris/cmd/ztest/ztest.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/cddl/contrib/opensolaris/cmd/ztest/ztest.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -5339,7 +5339,7 @@ ztest_deadman_thread(void *arg)
 		 * vdev_deadman() discovers that there hasn't been any recent
 		 * I/Os then it will end up aborting the tests.
 		 */
-		if (spa_suspended(spa)) {
+		if (spa_suspended(spa) || spa->spa_root_vdev == NULL) {
 			fatal(0, "aborting test after %llu seconds because "
 			    "pool has transitioned to a suspended state.",
 			    zfs_deadman_synctime_ms / 1000);

Modified: projects/random_number_generator/contrib/gcc/ChangeLog.gcc43
==============================================================================
--- projects/random_number_generator/contrib/gcc/ChangeLog.gcc43	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/ChangeLog.gcc43	Sat Nov 30 16:26:04 2013	(r258769)
@@ -4,6 +4,47 @@
 	* config/arm/unwind-arm.h (__gnu_Unwind_Backtrace): New.
 	* config/arm/unwind-arm.c (__gnu_Unwind_Backtrace): New.
 
+2007-07-12  Geoffrey Keating  <geoffk@apple.com> (r126588)
+
+	* builtins.c (get_pointer_alignment): Honor DECL_ALIGN on a
+	FUNCTION_DECL.
+	* tree.c (build_decl_stat): Move code from here...
+	(make_node_stat): ... to here.  Don't uselessly clear DECL_USER_ALIGN.
+	(expr_align): Honor DECL_ALIGN on a FUNCTION_DECL.  Add comment
+	about using DECL_ALIGN of LABEL_DECL and CONST_DECL.
+	* tree.h (DECL_USER_ALIGN): Fix misplaced comment.
+	* varasm.c (assemble_start_function): Use DECL_ALIGN instead of
+	FUNCTION_BOUNDARY.
+
+2007-07-09  Geoffrey Keating  <geoffk@apple.com> (r126529)
+
+	PR 32617
+	* c-common.c (c_alignof_expr): Look at DECL_ALIGN of
+	FUNCTION_DECLs.
+	(handle_aligned_attribute): Allow use on FUNCTION_DECLs.
+	* varasm.c (assemble_start_function): Honor DECL_ALIGN
+	for FUNCTION_DECLs.  Don't use align_functions_log if
+	DECL_USER_ALIGN.
+	* print-tree.c (print_node): Print DECL_ALIGN and DECL_USER_ALIGN
+	even for FUNCTION_DECLs.
+	* c-decl.c (merge_decls): Propagate DECL_ALIGN even for
+	FUNCTION_DECLs.
+	* tree.h (DECL_ALIGN): Update for new location of 'align'.
+	(DECL_FUNCTION_CODE): Update for new location and name of
+	'function_code'.
+	(DECL_OFFSET_ALIGN): Update for new location of 'off_align'.
+	(struct tree_decl_common): Move 'align' and 'off_align' out
+	of union, ensure they're still on a 32-bit boundary.  Remove
+	other fields in union 'u1'.
+	(struct tree_function_decl): Add field 'function_code' replacing
+	'u1.f' in tree_decl_common.
+	* tree.c (build_decl_stat): Set initial value of DECL_ALIGN.
+	* doc/extend.texi (Function Attributes): Add 'aligned' attribute.
+	(Variable Attributes): Cross-reference 'aligned' attribute
+	to Function Attributes.
+	* flags.h (force_align_functions_log): Delete.
+	* toplev.c (force_align_functions_log): Delete.
+
 2007-06-05  Joerg Wunsch  <j.gnu@uriah.heep.sax.de> (r125346)
 
 	PR preprocessor/23479
@@ -60,7 +101,7 @@
 	alignment for amdfam10 architecture. Increasing the max loop
 	alignment to 24 bytes.
 
-2007-04-16  Lawrence Crowl  <crowl@google.com>
+2007-04-16  Lawrence Crowl  <crowl@google.com> (r123909)
 
 	* doc/invoke.texi (Debugging Options): Add documentation for the
 	-femit-struct-debug options -femit-struct-debug-baseonly,
@@ -139,7 +180,7 @@
 	* config/i386/i386.c (override_options): Likewise.
 	* doc/invoke.texi: Likewise.
 
-2007-03-12  Seongbae Park <seongbae.park@gmail.com>
+2007-03-12  Seongbae Park <seongbae.park@gmail.com> (r122851)
 
 	* c-decl.c (warn_variable_length_array): New function.
 	Refactored from grokdeclarator to handle warn_vla
@@ -340,6 +381,16 @@
 
 	* config.gcc: Support core2 processor.
 
+2007-01-05  Manuel Lopez-Ibanez  <manu@gcc.gnu.org> (r120505)
+
+	PR c/19978
+	* tree.h (TREE_OVERFLOW_P): New.
+	* c-typeck.c (parser_build_unary_op): Warn only if result
+	overflowed and operands did not.
+	(parser_build_binary_op): Likewise.
+	(convert_for_assignment): Remove redundant overflow_warning.
+	* c-common.c (overflow_warning): Don't check or set TREE_OVERFLOW.
+
 2006-12-13  Ian Lance Taylor  <iant@google.com> (r119855)
 
 	PR c++/19564

Modified: projects/random_number_generator/contrib/gcc/builtins.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/builtins.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/builtins.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -315,9 +315,7 @@ get_pointer_alignment (tree exp, unsigne
 	      else if (offset)
 		inner = MIN (inner, BITS_PER_UNIT);
 	    }
-	  if (TREE_CODE (exp) == FUNCTION_DECL)
-	    align = FUNCTION_BOUNDARY;
-	  else if (DECL_P (exp))
+	  if (DECL_P (exp))
 	    align = MIN (inner, DECL_ALIGN (exp));
 #ifdef CONSTANT_ALIGNMENT
 	  else if (CONSTANT_CLASS_P (exp))

Modified: projects/random_number_generator/contrib/gcc/c-common.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/c-common.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/c-common.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -916,39 +916,45 @@ constant_expression_warning (tree value)
     pedwarn ("overflow in constant expression");
 }
 
-/* Print a warning if an expression had overflow in folding.
+/* Print a warning if an expression had overflow in folding and its
+   operands hadn't.
+
    Invoke this function on every expression that
    (1) appears in the source code, and
-   (2) might be a constant expression that overflowed, and
+   (2) is a constant expression that overflowed, and
    (3) is not already checked by convert_and_check;
-   however, do not invoke this function on operands of explicit casts.  */
+   however, do not invoke this function on operands of explicit casts
+   or when the expression is the result of an operator and any operand
+   already overflowed.  */
 
 void
 overflow_warning (tree value)
 {
-  if ((TREE_CODE (value) == INTEGER_CST
-       || (TREE_CODE (value) == COMPLEX_CST
-	   && TREE_CODE (TREE_REALPART (value)) == INTEGER_CST))
-      && TREE_OVERFLOW (value))
-    {
-      TREE_OVERFLOW (value) = 0;
-      if (skip_evaluation == 0)
-	warning (OPT_Woverflow, "integer overflow in expression");
-    }
-  else if ((TREE_CODE (value) == REAL_CST
-	    || (TREE_CODE (value) == COMPLEX_CST
-		&& TREE_CODE (TREE_REALPART (value)) == REAL_CST))
-	   && TREE_OVERFLOW (value))
-    {
-      TREE_OVERFLOW (value) = 0;
-      if (skip_evaluation == 0)
-	warning (OPT_Woverflow, "floating point overflow in expression");
-    }
-  else if (TREE_CODE (value) == VECTOR_CST && TREE_OVERFLOW (value))
-    {
-      TREE_OVERFLOW (value) = 0;
-      if (skip_evaluation == 0)
-	warning (OPT_Woverflow, "vector overflow in expression");
+  if (skip_evaluation) return;
+
+  switch (TREE_CODE (value))
+    {
+    case INTEGER_CST:
+      warning (OPT_Woverflow, "integer overflow in expression");
+      break;
+      
+    case REAL_CST:
+      warning (OPT_Woverflow, "floating point overflow in expression");
+      break;
+      
+    case VECTOR_CST:
+      warning (OPT_Woverflow, "vector overflow in expression");
+      break;
+      
+    case COMPLEX_CST:
+      if (TREE_CODE (TREE_REALPART (value)) == INTEGER_CST)
+	warning (OPT_Woverflow, "complex integer overflow in expression");
+      else if (TREE_CODE (TREE_REALPART (value)) == REAL_CST)
+	warning (OPT_Woverflow, "complex floating point overflow in expression");
+      break;
+
+    default:
+      break;
     }
 }
 
@@ -2989,16 +2995,16 @@ c_sizeof_or_alignof_type (tree type, boo
 }
 
 /* Implement the __alignof keyword: Return the minimum required
-   alignment of EXPR, measured in bytes.  For VAR_DECL's and
-   FIELD_DECL's return DECL_ALIGN (which can be set from an
-   "aligned" __attribute__ specification).  */
+   alignment of EXPR, measured in bytes.  For VAR_DECLs,
+   FUNCTION_DECLs and FIELD_DECLs return DECL_ALIGN (which can be set
+   from an "aligned" __attribute__ specification).  */
 
 tree
 c_alignof_expr (tree expr)
 {
   tree t;
 
-  if (TREE_CODE (expr) == VAR_DECL)
+  if (VAR_OR_FUNCTION_DECL_P (expr))
     t = size_int (DECL_ALIGN_UNIT (expr));
 
   else if (TREE_CODE (expr) == COMPONENT_REF
@@ -4803,12 +4809,24 @@ handle_aligned_attribute (tree *node, tr
       TYPE_ALIGN (*type) = (1 << i) * BITS_PER_UNIT;
       TYPE_USER_ALIGN (*type) = 1;
     }
-  else if (TREE_CODE (decl) != VAR_DECL
+  else if (! VAR_OR_FUNCTION_DECL_P (decl)
 	   && TREE_CODE (decl) != FIELD_DECL)
     {
       error ("alignment may not be specified for %q+D", decl);
       *no_add_attrs = true;
     }
+  else if (TREE_CODE (decl) == FUNCTION_DECL
+	   && DECL_ALIGN (decl) > (1 << i) * BITS_PER_UNIT)
+    {
+      if (DECL_USER_ALIGN (decl))
+	error ("alignment for %q+D was previously specified as %d "
+	       "and may not be decreased", decl,
+	       DECL_ALIGN (decl) / BITS_PER_UNIT);
+      else
+	error ("alignment for %q+D must be at least %d", decl,
+	       DECL_ALIGN (decl) / BITS_PER_UNIT);
+      *no_add_attrs = true;
+    }
   else
     {
       DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT;

Modified: projects/random_number_generator/contrib/gcc/c-decl.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/c-decl.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/c-decl.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -1690,12 +1690,11 @@ merge_decls (tree newdecl, tree olddecl,
       DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
       DECL_SIZE_UNIT (newdecl) = DECL_SIZE_UNIT (olddecl);
       DECL_MODE (newdecl) = DECL_MODE (olddecl);
-      if (TREE_CODE (olddecl) != FUNCTION_DECL)
-	if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
-	  {
-	    DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl);
-	    DECL_USER_ALIGN (newdecl) |= DECL_ALIGN (olddecl);
-	  }
+      if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
+	{
+	  DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl);
+	  DECL_USER_ALIGN (newdecl) |= DECL_ALIGN (olddecl);
+	}
     }
 
 

Modified: projects/random_number_generator/contrib/gcc/c-typeck.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/c-typeck.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/c-typeck.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -2616,7 +2616,10 @@ parser_build_unary_op (enum tree_code co
 
   result.original_code = ERROR_MARK;
   result.value = build_unary_op (code, arg.value, 0);
-  overflow_warning (result.value);
+  
+  if (TREE_OVERFLOW_P (result.value) && !TREE_OVERFLOW_P (arg.value))
+    overflow_warning (result.value);
+
   return result;
 }
 
@@ -2660,7 +2663,10 @@ parser_build_binary_op (enum tree_code c
     warning (OPT_Waddress, 
              "comparison with string literal results in unspecified behaviour");
 
-  overflow_warning (result.value);
+  if (TREE_OVERFLOW_P (result.value) 
+      && !TREE_OVERFLOW_P (arg1.value) 
+      && !TREE_OVERFLOW_P (arg2.value))
+    overflow_warning (result.value);
 
   return result;
 }
@@ -3847,10 +3853,7 @@ convert_for_assignment (tree type, tree 
     }
 
   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype))
-    {
-      overflow_warning (rhs);
-      return rhs;
-    }
+    return rhs;
 
   if (coder == VOID_TYPE)
     {

Modified: projects/random_number_generator/contrib/gcc/cp/ChangeLog.gcc43
==============================================================================
--- projects/random_number_generator/contrib/gcc/cp/ChangeLog.gcc43	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/cp/ChangeLog.gcc43	Sat Nov 30 16:26:04 2013	(r258769)
@@ -1,3 +1,12 @@
+2007-07-09  Geoffrey Keating  <geoffk@apple.com>
+
+	PR 32617
+	* decl.c (cxx_init_decl_processing): Don't set
+	force_align_functions_log.
+	(grokfndecl): Honour ptrmemfunc_vbit_in_pfn.
+	* typeck.c (cxx_alignof_expr): When alignof is used on a plain
+	FUNCTION_DECL, return its alignment.
+
 2007-06-28  Geoffrey Keating  <geoffk@apple.com> (r126080)
 
 	* decl2.c (start_objects): Mark constructor-runnning function
@@ -20,6 +29,12 @@
 	TREE_OVERFLOW_P is true for the result and not for any of the
 	operands.
 	
+2007-01-05  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
+
+	PR c/19978
+	* semantics.c (finish_unary_op_expr): Warn only if result
+	overflowed and operands did not.
+
 2006-10-31  Geoffrey Keating  <geoffk@apple.com> (r118360)
 
 	* name-lookup.c (get_anonymous_namespace_name): New.

Modified: projects/random_number_generator/contrib/gcc/cp/decl.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/cp/decl.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/cp/decl.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -3158,12 +3158,6 @@ cxx_init_decl_processing (void)
   if (flag_inline_functions)
     flag_inline_trees = 2;
 
-  /* Force minimum function alignment if using the least significant
-     bit of function pointers to store the virtual bit.  */
-  if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
-      && force_align_functions_log < 1)
-    force_align_functions_log = 1;
-
   /* Initially, C.  */
   current_lang_name = lang_name_c;
 
@@ -6065,6 +6059,14 @@ grokfndecl (tree ctype,
   if (TYPE_VOLATILE (type))
     TREE_THIS_VOLATILE (decl) = 1;
 
+  /* If pointers to member functions use the least significant bit to
+     indicate whether a function is virtual, ensure a pointer
+     to this function will have that bit clear.  */
+  if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
+      && TREE_CODE (type) == METHOD_TYPE
+      && DECL_ALIGN (decl) < 2 * BITS_PER_UNIT)
+    DECL_ALIGN (decl) = 2 * BITS_PER_UNIT;
+
   if (friendp
       && TREE_CODE (orig_declarator) == TEMPLATE_ID_EXPR)
     {

Modified: projects/random_number_generator/contrib/gcc/cp/semantics.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/cp/semantics.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/cp/semantics.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -2012,7 +2012,9 @@ finish_unary_op_expr (enum tree_code cod
       result = copy_node (result);
       TREE_NEGATED_INT (result) = 1;
     }
-  overflow_warning (result);
+  if (TREE_OVERFLOW_P (result) && !TREE_OVERFLOW_P (expr))
+    overflow_warning (result);
+
   return result;
 }
 

Modified: projects/random_number_generator/contrib/gcc/cp/typeck.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/cp/typeck.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/cp/typeck.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -1358,7 +1358,10 @@ cxx_alignof_expr (tree e)
     {
       pedwarn ("ISO C++ forbids applying %<__alignof%> to an expression of "
 	       "function type");
-      t = size_one_node;
+      if (TREE_CODE (e) == FUNCTION_DECL)
+	t = size_int (DECL_ALIGN_UNIT (e));
+      else
+	t = size_one_node;
     }
   else if (type_unknown_p (e))
     {

Modified: projects/random_number_generator/contrib/gcc/doc/extend.texi
==============================================================================
--- projects/random_number_generator/contrib/gcc/doc/extend.texi	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/doc/extend.texi	Sat Nov 30 16:26:04 2013	(r258769)
@@ -1577,6 +1577,7 @@ The keyword @code{__attribute__} allows 
 attributes when making a declaration.  This keyword is followed by an
 attribute specification inside double parentheses.  The following
 attributes are currently defined for functions on all targets:
+@code{aligned},
 @code{noreturn}, @code{returns_twice}, @code{noinline}, @code{always_inline},
 @code{flatten}, @code{pure}, @code{const}, @code{nothrow}, @code{sentinel},
 @code{format}, @code{format_arg}, @code{no_instrument_function},
@@ -1615,6 +1616,27 @@ is not defined in the same translation u
 
 Not all target machines support this attribute.
 
+@item aligned (@var{alignment})
+@cindex @code{aligned} attribute
+This attribute specifies a minimum alignment for the function,
+measured in bytes.
+
+You cannot use this attribute to decrease the alignment of a function,
+only to increase it.  However, when you explicitly specify a function
+alignment this will override the effect of the
+@option{-falign-functions} (@pxref{Optimize Options}) option for this
+function.
+
+Note that the effectiveness of @code{aligned} attributes may be
+limited by inherent limitations in your linker.  On many systems, the
+linker is only able to arrange for functions to be aligned up to a
+certain maximum alignment.  (For some linkers, the maximum supported
+alignment may be very very small.)  See your linker documentation for
+further information.
+
+The @code{aligned} attribute can also be used for variables and fields
+(@pxref{Variable Attributes}.)
+
 @item always_inline
 @cindex @code{always_inline} function attribute
 Generally, functions are not inlined unless optimization is specified.
@@ -3044,6 +3066,9 @@ up to a maximum of 8 byte alignment, the
 in an @code{__attribute__} will still only provide you with 8 byte
 alignment.  See your linker documentation for further information.
 
+The @code{aligned} attribute can also be used for functions 
+(@pxref{Function Attributes}.)
+
 @item cleanup (@var{cleanup_function})
 @cindex @code{cleanup} attribute
 The @code{cleanup} attribute runs a function when the variable goes

Modified: projects/random_number_generator/contrib/gcc/flags.h
==============================================================================
--- projects/random_number_generator/contrib/gcc/flags.h	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/flags.h	Sat Nov 30 16:26:04 2013	(r258769)
@@ -261,10 +261,6 @@ extern int align_labels_log;
 extern int align_labels_max_skip;
 extern int align_functions_log;
 
-/* Like align_functions_log above, but used by front-ends to force the
-   minimum function alignment.  Zero means no alignment is forced.  */
-extern int force_align_functions_log;
-
 /* Nonzero if we dump in VCG format, not plain text.  */
 extern int dump_for_graph;
 

Modified: projects/random_number_generator/contrib/gcc/print-tree.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/print-tree.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/print-tree.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -439,17 +439,15 @@ print_node (FILE *file, const char *pref
 	      || DECL_INLINE (node) || DECL_BUILT_IN (node))
 	    indent_to (file, indent + 3);
 	  
-	  if (TREE_CODE (node) != FUNCTION_DECL)
-	    {
-	      if (DECL_USER_ALIGN (node))
-		fprintf (file, " user");
-	      
-	      fprintf (file, " align %d", DECL_ALIGN (node));
-	      if (TREE_CODE (node) == FIELD_DECL)
-		fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED,
-			 DECL_OFFSET_ALIGN (node));
-	    }
-	  else if (DECL_BUILT_IN (node))
+	  if (DECL_USER_ALIGN (node))
+	    fprintf (file, " user");
+	  
+	  fprintf (file, " align %d", DECL_ALIGN (node));
+	  if (TREE_CODE (node) == FIELD_DECL)
+	    fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED,
+		     DECL_OFFSET_ALIGN (node));
+
+	  if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node))
 	    {
 	      if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
 		fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node));

Modified: projects/random_number_generator/contrib/gcc/toplev.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/toplev.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/toplev.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -369,10 +369,6 @@ int align_labels_log;
 int align_labels_max_skip;
 int align_functions_log;
 
-/* Like align_functions_log above, but used by front-ends to force the
-   minimum function alignment.  Zero means no alignment is forced.  */
-int force_align_functions_log;
-
 typedef struct
 {
   const char *const string;

Modified: projects/random_number_generator/contrib/gcc/tree.c
==============================================================================
--- projects/random_number_generator/contrib/gcc/tree.c	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/tree.c	Sat Nov 30 16:26:04 2013	(r258769)
@@ -541,9 +541,13 @@ make_node_stat (enum tree_code code MEM_
 	DECL_IN_SYSTEM_HEADER (t) = in_system_header;
       if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
 	{
-	  if (code != FUNCTION_DECL)
+	  if (code == FUNCTION_DECL)
+	    {
+	      DECL_ALIGN (t) = FUNCTION_BOUNDARY;
+	      DECL_MODE (t) = FUNCTION_MODE;
+	    }
+	  else
 	    DECL_ALIGN (t) = 1;
-	  DECL_USER_ALIGN (t) = 0;	  
 	  /* We have not yet computed the alias set for this declaration.  */
 	  DECL_POINTER_ALIAS_SET (t) = -1;
 	}
@@ -1881,14 +1885,13 @@ expr_align (tree t)
       align1 = expr_align (TREE_OPERAND (t, 2));
       return MIN (align0, align1);
 
+      /* FIXME: LABEL_DECL and CONST_DECL never have DECL_ALIGN set
+	 meaningfully, it's always 1.  */
     case LABEL_DECL:     case CONST_DECL:
     case VAR_DECL:       case PARM_DECL:   case RESULT_DECL:
-      if (DECL_ALIGN (t) != 0)
-	return DECL_ALIGN (t);
-      break;
-
     case FUNCTION_DECL:
-      return FUNCTION_BOUNDARY;
+      gcc_assert (DECL_ALIGN (t) != 0);
+      return DECL_ALIGN (t);
 
     default:
       break;
@@ -3174,8 +3177,6 @@ build_decl_stat (enum tree_code code, tr
 
   if (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
     layout_decl (t, 0);
-  else if (code == FUNCTION_DECL)
-    DECL_MODE (t) = FUNCTION_MODE;
 
   return t;
 }

Modified: projects/random_number_generator/contrib/gcc/tree.h
==============================================================================
--- projects/random_number_generator/contrib/gcc/tree.h	Sat Nov 30 15:08:35 2013	(r258768)
+++ projects/random_number_generator/contrib/gcc/tree.h	Sat Nov 30 16:26:04 2013	(r258769)
@@ -2426,13 +2426,11 @@ struct tree_struct_field_tag GTY(())
 /* Likewise for the size in bytes.  */
 #define DECL_SIZE_UNIT(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.size_unit)
 /* Holds the alignment required for the datum, in bits.  */
-#define DECL_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.u1.a.align)
+#define DECL_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.align)
 /* The alignment of NODE, in bytes.  */
 #define DECL_ALIGN_UNIT(NODE) (DECL_ALIGN (NODE) / BITS_PER_UNIT)
-/* For FIELD_DECLs, off_align holds the number of low-order bits of
-   DECL_FIELD_OFFSET which are known to be always zero.
-   DECL_OFFSET_ALIGN thus returns the alignment that DECL_FIELD_OFFSET
-   has.  */
+/* Set if the alignment of this DECL has been set by the user, for
+   example with an 'aligned' attribute.  */
 #define DECL_USER_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.user_align)
 /* Holds the machine mode corresponding to the declaration of a variable or

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201311301626.rAUGQ5LO014686>