* [patch, libfortran] Fix PR 36302
@ 2008-05-22 17:14 Thomas Koenig
2008-05-22 19:23 ` Tobias Burnus
0 siblings, 1 reply; 7+ messages in thread
From: Thomas Koenig @ 2008-05-22 17:14 UTC (permalink / raw)
To: fortran; +Cc: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 865 bytes --]
Hello world,
this fixes RP 36302, which I just stumbled across when reading through
some intrinsics source code.
This looks pretty obvious and compiles on i686-pc-linux-gnu, and the
tests are properly ignored. Could somebody test it on a 64-bit-integer
capable system?
OK for trunk if that's been done?
Thomas
2008-05-22 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libgfortran/36302
* gfortran.map: Add _gfortran_eoshift0_16,
_gfortran_eoshift0_16_char, _gfortran_eoshift2_16,
_gfortran_eoshift2_16_char,_gfortran_cshift0_16,
_gfortran_cshift0_16_char.
* intrinsics/eoshift0.c: Add function for kind=16 integer.
* intrinsics/eoshift2.c: Likewise.
* intrinsics/cshift0.c: Likewise.
2008-05-22 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libgfortran/36302
* gfortran.dg/cshift_large_1.f90: New test.
* gfortran.dg/eoshift_large_1.f90: New test.
[-- Attachment #2: cshift_large_1.f90 --]
[-- Type: text/x-fortran, Size: 2041 bytes --]
! { dg-do run }
! { dg-require-effective-target fortran_large_int }
! Program to test the cshift intrinsic for kind=16 integers
program intrinsic_cshift
integer, parameter :: k=16
integer(kind=k), dimension(3_k, 3_k) :: a
integer(kind=k), dimension(3_k, 3_k, 2_k) :: b
! Scalar shift
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = cshift (a, 1_k, 1_k)
if (any (a .ne. reshape ((/2_k, 3_k, 1_k, 5_k, 6_k, 4_k, 8_k, 9_k, 7_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = cshift (a, -2_k, dim = 2_k)
if (any (a .ne. reshape ((/4_k, 5_k, 6_k, 7_k, 8_k, 9_k, 1_k, 2_k, 3_k/), (/3_k, 3_k/)))) &
call abort
! Array shift
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = cshift (a, (/1_k, 0_k, -1_k/))
if (any (a .ne. reshape ((/2_k, 3_k, 1_k, 4_k, 5_k, 6_k, 9_k, 7_k, 8_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = cshift (a, (/2_k, -2_k, 0_k/), dim = 2_k)
if (any (a .ne. reshape ((/7_k, 5_k, 3_k, 1_k, 8_k, 6_k, 4_k, 2_k, 9_k/), (/3_k, 3_k/)))) &
call abort
! Test arrays > rank 2
b = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k, 11_k, 12_k, 13_k, 14_k, 15_k, 16_k, 17_k,&
18_k, 19_k/), (/3_k, 3_k, 2_k/))
b = cshift (b, 1_k)
if (any (b .ne. reshape ((/2_k, 3_k, 1_k, 5_k, 6_k, 4_k, 8_k, 9_k, 7_k, 12_k, 13_k, 11_k, 15_k,&
16_k, 14_k, 18_k, 19_k, 17_k/), (/3_k, 3_k, 2_k/)))) &
call abort
b = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k, 11_k, 12_k, 13_k, 14_k, 15_k, 16_k, 17_k,&
18_k, 19_k/), (/3_k, 3_k, 2_k/))
b = cshift (b, reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/)), 3_k)
if (any (b .ne. reshape ((/11_k, 2_k, 13_k, 4_k, 15_k, 6_k, 17_k, 8_k, 19_k, 1_k, 12_k, 3_k,&
14_k, 5_k, 16_k, 7_k, 18_k, 9_k/), (/3_k, 3_k, 2_k/)))) &
call abort
end program
[-- Attachment #3: eoshift_large_1.f90 --]
[-- Type: text/x-fortran, Size: 4888 bytes --]
! { dg-do run }
! { dg-require-effective-target fortran_large_int }
! Program to test the eoshift intrinsic for kind=16_k integers
!
program intrinsic_eoshift
integer, parameter :: k=16
integer(kind=k), dimension(3_k, 3_k) :: a
integer(kind=k), dimension(3_k, 3_k, 2_k) :: b
integer(kind=k), dimension(3_k) :: bo, sh
! Scalar shift and scalar bound.
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, 1_k, 99_k, 1_k)
if (any (a .ne. reshape ((/2_k, 3_k, 99_k, 5_k, 6_k, 99_k, 8_k, 9_k, 99_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, 9999_k, 99_k, 1_k)
if (any (a .ne. 99_k)) call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, -2_k, dim = 2_k)
if (any (a .ne. reshape ((/0_k, 0_k, 0_k, 0_k, 0_k, 0_k, 1_k, 2_k, 3_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, -9999_k, 99_k, 1_k)
if (any (a .ne. 99_k)) call abort
! Array shift and scalar bound.
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, (/1_k, 0_k, -1_k/), 99_k, 1_k)
if (any (a .ne. reshape ((/2_k, 3_k, 99_k, 4_k, 5_k, 6_k, 99_k, 7_k, 8_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, (/9999_k, 0_k, -9999_k/), 99_k, 1_k)
if (any (a .ne. reshape ((/99_k, 99_k, 99_k, 4_k, 5_k, 6_k, 99_k, 99_k, 99_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, (/2_k, -2_k, 0_k/), dim = 2_k)
if (any (a .ne. reshape ((/7_k, 0_k, 3_k, 0_k, 0_k, 6_k, 0_k, 2_k, 9_k/), (/3_k, 3_k/)))) &
call abort
! Scalar shift and array bound.
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, 1_k, (/99_k, -1_k, 42_k/), 1_k)
if (any (a .ne. reshape ((/2_k, 3_k, 99_k, 5_k, 6_k, -1_k, 8_k, 9_k, 42_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, 9999_k, (/99_k, -1_k, 42_k/), 1_k)
if (any (a .ne. reshape ((/99_k, 99_k, 99_k, -1_k, -1_k, -1_k, 42_k, 42_k, 42_k/), &
(/3_k, 3_k/)))) call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, -9999_k, (/99_k, -1_k, 42_k/), 1_k)
if (any (a .ne. reshape ((/99_k, 99_k, 99_k, -1_k, -1_k, -1_k, 42_k, 42_k, 42_k/), &
(/3_k, 3_k/)))) call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, -2_k, (/99_k, -1_k, 42_k/), 2_k)
if (any (a .ne. reshape ((/99_k, -1_k, 42_k, 99_k, -1_k, 42_k, 1_k, 2_k, 3_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
bo = (/99_k, -1_k, 42_k/)
a = eoshift (a, -2_k, bo, 2_k)
if (any (a .ne. reshape ((/99_k, -1_k, 42_k, 99_k, -1_k, 42_k, 1_k, 2_k, 3_k/), (/3_k, 3_k/)))) &
call abort
! Array shift and array bound.
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, (/1_k, 0_k, -1_k/), (/99_k, -1_k, 42_k/), 1_k)
if (any (a .ne. reshape ((/2_k, 3_k, 99_k, 4_k, 5_k, 6_k, 42_k, 7_k, 8_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, (/2_k, -2_k, 0_k/), (/99_k, -1_k, 42_k/), 2_k)
if (any (a .ne. reshape ((/7_k, -1_k, 3_k, 99_k, -1_k, 6_k, 99_k, 2_k, 9_k/), (/3_k, 3_k/)))) &
call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
sh = (/ 3_k, -1_k, -3_k /)
bo = (/-999_k, -99_k, -9_k /)
a = eoshift(a, shift=sh, boundary=bo)
if (any (a .ne. reshape ((/ -999_k, -999_k, -999_k, -99_k, 4_k, 5_k, -9_k, -9_k, -9_k /), &
shape(a)))) call abort
a = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
a = eoshift (a, (/9999_k, -9999_k, 0_k/), (/99_k, -1_k, 42_k/), 2_k)
if (any (a .ne. reshape ((/99_k, -1_k, 3_k, 99_k, -1_k, 6_k, 99_k, -1_k, 9_k/), (/3_k, 3_k/)))) &
call abort
! Test arrays > rank 2
b(:, :, 1_k) = reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
b(:, :, 2_k) = 10_k + reshape ((/1_k, 2_k, 3_k, 4_k, 5_k, 6_k, 7_k, 8_k, 9_k/), (/3_k, 3_k/))
b = eoshift (b, 1_k, 99_k, 1_k)
if (any (b(:, :, 1_k) .ne. reshape ((/2_k, 3_k, 99_k, 5_k, 6_k, 99_k, 8_k, 9_k, 99_k/), (/3_k, 3_k/)))) &
call abort
if (any (b(:, :, 2_k) .ne. reshape ((/12_k, 13_k, 99_k, 15_k, 16_k, 99_k, 18_k, 19_k, 99_k/), (/3_k, 3_k/)))) &
call abort
! TODO: Test array sections
end program
[-- Attachment #4: kind16.diff --]
[-- Type: text/x-patch, Size: 1515 bytes --]
Index: intrinsics/cshift0.c
===================================================================
--- intrinsics/cshift0.c (revision 135512)
+++ intrinsics/cshift0.c (working copy)
@@ -340,3 +340,6 @@ DEFINE_CSHIFT (1);
DEFINE_CSHIFT (2);
DEFINE_CSHIFT (4);
DEFINE_CSHIFT (8);
+#ifdef HAVE_GFC_INTEGER_16
+DEFINE_CSHIFT (16);
+#endif
Index: intrinsics/eoshift0.c
===================================================================
--- intrinsics/eoshift0.c (revision 135512)
+++ intrinsics/eoshift0.c (working copy)
@@ -251,3 +251,6 @@ DEFINE_EOSHIFT (1);
DEFINE_EOSHIFT (2);
DEFINE_EOSHIFT (4);
DEFINE_EOSHIFT (8);
+#ifdef HAVE_GFC_INTEGER_16
+DEFINE_EOSHIFT (16);
+#endif
Index: intrinsics/eoshift2.c
===================================================================
--- intrinsics/eoshift2.c (revision 135512)
+++ intrinsics/eoshift2.c (working copy)
@@ -272,3 +272,6 @@ DEFINE_EOSHIFT (1);
DEFINE_EOSHIFT (2);
DEFINE_EOSHIFT (4);
DEFINE_EOSHIFT (8);
+#ifdef HAVE_GFC_INTEGER_16
+DEFINE_EOSHIFT (16);
+#endif
Index: gfortran.map
===================================================================
--- gfortran.map (revision 135512)
+++ gfortran.map (working copy)
@@ -1060,6 +1060,12 @@ GFORTRAN_1.1 {
_gfortran_pack_s_char4;
_gfortran_unpack0_char4;
_gfortran_unpack1_char4;
+ _gfortran_eoshift0_16;
+ _gfortran_eoshift0_16_char;
+ _gfortran_eoshift2_16;
+ _gfortran_eoshift2_16_char;
+ _gfortran_cshift0_16;
+ _gfortran_cshift0_16_char;
} GFORTRAN_1.0;
F2C_1.0 {
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch, libfortran] Fix PR 36302
2008-05-22 17:14 [patch, libfortran] Fix PR 36302 Thomas Koenig
@ 2008-05-22 19:23 ` Tobias Burnus
2008-05-22 21:31 ` Toon Moene
2008-05-22 22:25 ` Thomas Koenig
0 siblings, 2 replies; 7+ messages in thread
From: Tobias Burnus @ 2008-05-22 19:23 UTC (permalink / raw)
To: Thomas Koenig; +Cc: fortran, gcc-patches
Thomas Koenig wrote:
> this fixes RP 36302, which I just stumbled across when reading through
> some intrinsics source code.
>
> This looks pretty obvious and compiles on i686-pc-linux-gnu, and the
> tests are properly ignored. Could somebody test it on a 64-bit-integer
> capable system?
> OK for trunk if that's been done?
>
Bootstapping and compiling the two test cases worked on x86-64/Linux.
OK for the trunk.
Tobias
PS: gfortran seems to be one of the very few compilers which supports
INTEGER(16) - all my other compilers don't. I really wonder why.
> 2008-05-22 Thomas Koenig <tkoenig@gcc.gnu.org>
>
> PR libgfortran/36302
> * gfortran.map: Add _gfortran_eoshift0_16,
> _gfortran_eoshift0_16_char, _gfortran_eoshift2_16,
> _gfortran_eoshift2_16_char,_gfortran_cshift0_16,
> _gfortran_cshift0_16_char.
> * intrinsics/eoshift0.c: Add function for kind=16 integer.
> * intrinsics/eoshift2.c: Likewise.
> * intrinsics/cshift0.c: Likewise.
>
> 2008-05-22 Thomas Koenig <tkoenig@gcc.gnu.org>
>
> PR libgfortran/36302
> * gfortran.dg/cshift_large_1.f90: New test.
> * gfortran.dg/eoshift_large_1.f90: New test
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch, libfortran] Fix PR 36302
2008-05-22 19:23 ` Tobias Burnus
@ 2008-05-22 21:31 ` Toon Moene
2008-05-22 22:25 ` Thomas Koenig
1 sibling, 0 replies; 7+ messages in thread
From: Toon Moene @ 2008-05-22 21:31 UTC (permalink / raw)
To: Tobias Burnus; +Cc: Thomas Koenig, fortran, gcc-patches
Tobias Burnus wrote:
> PS: gfortran seems to be one of the very few compilers which supports
> INTEGER(16) - all my other compilers don't. I really wonder why.
You bet ! Try this one:
integer*16 i, j, k, n
integer*16 ipf(3,30)
character*80 arg
call getarg(1, arg)
read(arg, '(i40)') n
ipf = 0
i = 1
k = n
j = 1
do while (k .ge. i**2)
if (mod(k,i) .eq. 0 .and. i .gt. 1) then
ipf(1, j) = i
ipf(2, j) = ipf(2, j) + 1
k = k / i
else
i = i + 1
if (ipf(2,j) .gt. 0) j = j + 1
endif
enddo
if (ipf(2, j) .gt. 0 .and. ipf(1, j) .ne. k) j = j + 1
ipf(1, j) = k
ipf(2, j) = ipf(2, j) + 1
print*,(ipf(2,i),' factoren',ipf(1,i),i=1,j)
print*,'Aantal delers =',product(ipf(2,:) + 1)
print*,1_16
do while ( any(ipf(3,:) .ne. ipf(2,:)) )
do i = 1, j
if (ipf(3,i) .eq. ipf(2,i)) then
ipf(3,i) = 0
else
ipf(3,i) = ipf(3,i) + 1
exit
endif
enddo
print*,product(ipf(1,:) ** ipf(3,:))
enddo
end
and feed it a 30 digit number ...
--
Toon Moene - e-mail: toon@moene.indiv.nluug.nl - phone: +31 346 214290
Saturnushof 14, 3738 XG Maartensdijk, The Netherlands
At home: http://moene.indiv.nluug.nl/~toon/
Progress of GNU Fortran: http://gcc.gnu.org/ml/gcc/2008-01/msg00009.html
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch, libfortran] Fix PR 36302
2008-05-22 19:23 ` Tobias Burnus
2008-05-22 21:31 ` Toon Moene
@ 2008-05-22 22:25 ` Thomas Koenig
2008-05-23 15:46 ` H.J. Lu
1 sibling, 1 reply; 7+ messages in thread
From: Thomas Koenig @ 2008-05-22 22:25 UTC (permalink / raw)
To: Tobias Burnus; +Cc: fortran, gcc-patches
On Thu, 2008-05-22 at 20:29 +0200, Tobias Burnus wrote:
> Thomas Koenig wrote:
> > this fixes RP 36302, which I just stumbled across when reading through
> > some intrinsics source code.
> >
> > This looks pretty obvious and compiles on i686-pc-linux-gnu, and the
> > tests are properly ignored. Could somebody test it on a 64-bit-integer
> > capable system?
> > OK for trunk if that's been done?
> >
> Bootstapping and compiling the two test cases worked on x86-64/Linux.
>
> OK for the trunk.
Thanks for the review. Committed as rev. 135777.
Following Janne's off-list advice, I also sorted the symbols
in gfortran.map for GFORTRAN_1.1 alphabetically.
Thomas
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch, libfortran] Fix PR 36302
2008-05-22 22:25 ` Thomas Koenig
@ 2008-05-23 15:46 ` H.J. Lu
2008-05-23 16:24 ` Tobias Burnus
0 siblings, 1 reply; 7+ messages in thread
From: H.J. Lu @ 2008-05-23 15:46 UTC (permalink / raw)
To: Thomas Koenig; +Cc: Tobias Burnus, fortran, gcc-patches
Hi
It doesn't work on Linux/x86-64:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36314
It may be a 64bit target problem.
H.J.
On Thu, May 22, 2008 at 2:58 PM, Thomas Koenig <tkoenig@netcologne.de> wrote:
> On Thu, 2008-05-22 at 20:29 +0200, Tobias Burnus wrote:
>> Thomas Koenig wrote:
>> > this fixes RP 36302, which I just stumbled across when reading through
>> > some intrinsics source code.
>> >
>> > This looks pretty obvious and compiles on i686-pc-linux-gnu, and the
>> > tests are properly ignored. Could somebody test it on a 64-bit-integer
>> > capable system?
>> > OK for trunk if that's been done?
>> >
>> Bootstapping and compiling the two test cases worked on x86-64/Linux.
>>
>> OK for the trunk.
>
> Thanks for the review. Committed as rev. 135777.
>
> Following Janne's off-list advice, I also sorted the symbols
> in gfortran.map for GFORTRAN_1.1 alphabetically.
>
> Thomas
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch, libfortran] Fix PR 36302
2008-05-23 15:46 ` H.J. Lu
@ 2008-05-23 16:24 ` Tobias Burnus
2008-05-25 19:22 ` Thomas Koenig
0 siblings, 1 reply; 7+ messages in thread
From: Tobias Burnus @ 2008-05-23 16:24 UTC (permalink / raw)
To: H.J. Lu; +Cc: Thomas Koenig, fortran, gcc-patches
H.J. Lu wrote:
> It doesn't work on Linux/x86-64:
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36314
> It may be a 64bit target problem.
>
The problem were two tabs which sneaked in (which gives no warning by
default, but the testsuite is run with -pedantic). It only showed up on
64bit systems as integer(16) is not supported on 32bit x86 systems.
Fixed in Revision 135817
Tobias
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch, libfortran] Fix PR 36302
2008-05-23 16:24 ` Tobias Burnus
@ 2008-05-25 19:22 ` Thomas Koenig
0 siblings, 0 replies; 7+ messages in thread
From: Thomas Koenig @ 2008-05-25 19:22 UTC (permalink / raw)
To: Tobias Burnus; +Cc: H.J. Lu, fortran, gcc-patches
On Fri, 2008-05-23 at 17:11 +0200, Tobias Burnus wrote:
> Fixed in Revision 135817
Thanks for the fast fix.
I was travelling this (extended) week-end, so I couldn't attend to this
myself.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-05-25 18:58 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-22 17:14 [patch, libfortran] Fix PR 36302 Thomas Koenig
2008-05-22 19:23 ` Tobias Burnus
2008-05-22 21:31 ` Toon Moene
2008-05-22 22:25 ` Thomas Koenig
2008-05-23 15:46 ` H.J. Lu
2008-05-23 16:24 ` Tobias Burnus
2008-05-25 19:22 ` Thomas Koenig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).