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...
Mark Murray
markm at FreeBSD.org
Sat Nov 30 16:26:09 UTC 2013
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 at 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 at 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 at 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 at google.com>
+2007-04-16 Lawrence Crowl <crowl at 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 at gmail.com>
+2007-03-12 Seongbae Park <seongbae.park at 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 at 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 at 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 at 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 at 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 at 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 at 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:
+ at 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.
+ at item aligned (@var{alignment})
+ at 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
+ at 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 ***
More information about the svn-src-projects
mailing list