* function.c has unprotected call to FUNCTION_ARG_PASS_BY_REFERENCE @ 2004-07-08 0:10 Alexandre Oliva 2004-07-08 1:06 ` Richard Henderson 0 siblings, 1 reply; 5+ messages in thread From: Alexandre Oliva @ 2004-07-08 0:10 UTC (permalink / raw) To: gcc-patches [-- Attachment #1: Type: text/plain, Size: 262 bytes --] ... unlike the call presumably copied from calls.c. Machines that don't have FUNCTION_ARG_PASS_BY_REFERENCE lose. This patch fixes it. Installed as obviously correct. Hmm... Maybe it should be defined to 0 in defaults.h? Ok to make this additional change? [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: function-arg-by-ref-if-defined.patch --] [-- Type: text/x-patch, Size: 996 bytes --] Index: gcc/ChangeLog from Alexandre Oliva <aoliva@redhat.com> * function.c (assign_parm_find_data_types): Call FUNCTION_ARG_PASS_BY_REFERENCE only if it's defined. Index: gcc/function.c =================================================================== RCS file: /cvs/uberbaum/gcc/function.c,v retrieving revision 1.547 diff -u -p -r1.547 function.c --- gcc/function.c 7 Jul 2004 18:40:02 -0000 1.547 +++ gcc/function.c 7 Jul 2004 22:59:37 -0000 @@ -2246,8 +2246,11 @@ assign_parm_find_data_types (struct assi the machine requires these objects be passed that way. */ if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (passed_type)) || TREE_ADDRESSABLE (passed_type) +#ifdef FUNCTION_ARG_PASS_BY_REFERENCE || FUNCTION_ARG_PASS_BY_REFERENCE (all->args_so_far, passed_mode, - passed_type, data->named_arg)) + passed_type, data->named_arg) +#endif + ) { passed_type = nominal_type = build_pointer_type (passed_type); data->passed_pointer = true; [-- Attachment #3: Type: text/plain, Size: 188 bytes --] -- Alexandre Oliva http://www.ic.unicamp.br/~oliva/ Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org} Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org} ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: function.c has unprotected call to FUNCTION_ARG_PASS_BY_REFERENCE 2004-07-08 0:10 function.c has unprotected call to FUNCTION_ARG_PASS_BY_REFERENCE Alexandre Oliva @ 2004-07-08 1:06 ` Richard Henderson 2004-07-08 6:57 ` Alexandre Oliva 0 siblings, 1 reply; 5+ messages in thread From: Richard Henderson @ 2004-07-08 1:06 UTC (permalink / raw) To: Alexandre Oliva; +Cc: gcc-patches On Wed, Jul 07, 2004 at 08:02:56PM -0300, Alexandre Oliva wrote: > Hmm... Maybe it should be defined to 0 in defaults.h? I had planned to put this in expr.h with the other related macros. r~ ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: function.c has unprotected call to FUNCTION_ARG_PASS_BY_REFERENCE 2004-07-08 1:06 ` Richard Henderson @ 2004-07-08 6:57 ` Alexandre Oliva 2004-07-08 7:17 ` Richard Henderson 0 siblings, 1 reply; 5+ messages in thread From: Alexandre Oliva @ 2004-07-08 6:57 UTC (permalink / raw) To: Richard Henderson; +Cc: gcc-patches [-- Attachment #1: Type: text/plain, Size: 495 bytes --] On Jul 7, 2004, Richard Henderson <rth@redhat.com> wrote: > On Wed, Jul 07, 2004 at 08:02:56PM -0300, Alexandre Oliva wrote: >> Hmm... Maybe it should be defined to 0 in defaults.h? > I had planned to put this in expr.h with the other related macros. I went ahead and handled a few other macros that looked easy. Then I commented them out from i386.h and verified it built. Then I put them back in and started a bootstrap. Will have results in a while. Ok to install if it bootstraps? [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: gcc-expr-func-macro-defaults.patch --] [-- Type: text/x-patch, Size: 6707 bytes --] Index: gcc/ChangeLog from Alexandre Oliva <aoliva@redhat.com> * expr.h (FUNCTION_ARG_PARTIAL_NREGS): Default to 0. (FUNCTION_ARG_PASS_BY_REFERENCE): Likewise. (FUNCTION_ARG_CALLEE_COPIES): Likewise. * calls.c: Remove ifdefs of macros above. * functions.c: Likewise. * expr.c: Likewise. Index: gcc/calls.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/calls.c,v retrieving revision 1.344 diff -u -p -r1.344 calls.c --- gcc/calls.c 8 Jul 2004 05:58:35 -0000 1.344 +++ gcc/calls.c 8 Jul 2004 06:26:35 -0000 @@ -975,16 +975,13 @@ initialize_argument_information (int num /* See if this argument should be passed by invisible reference. */ if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (type)) || TREE_ADDRESSABLE (type) -#ifdef FUNCTION_ARG_PASS_BY_REFERENCE || FUNCTION_ARG_PASS_BY_REFERENCE (*args_so_far, TYPE_MODE (type), type, argpos < n_named_args) -#endif ) { /* If we're compiling a thunk, pass through invisible references instead of making a copy. */ if (call_from_thunk_p -#ifdef FUNCTION_ARG_CALLEE_COPIES || (FUNCTION_ARG_CALLEE_COPIES (*args_so_far, TYPE_MODE (type), type, argpos < n_named_args) /* If it's in a register, we must make a copy of it too. */ @@ -992,7 +989,6 @@ initialize_argument_information (int num && !(TREE_CODE (args[i].tree_value) == VAR_DECL && REG_P (DECL_RTL (args[i].tree_value))) && ! TREE_ADDRESSABLE (type)) -#endif ) { /* C++ uses a TARGET_EXPR to indicate that we want to make a @@ -1095,12 +1091,10 @@ initialize_argument_information (int num args[i].tail_call_reg = args[i].reg; #endif -#ifdef FUNCTION_ARG_PARTIAL_NREGS if (args[i].reg) args[i].partial = FUNCTION_ARG_PARTIAL_NREGS (*args_so_far, mode, type, argpos < n_named_args); -#endif args[i].pass_on_stack = MUST_PASS_IN_STACK (mode, type); @@ -3541,10 +3535,8 @@ emit_library_call_value_1 (int retval, r argvec[count].partial = 0; argvec[count].reg = FUNCTION_ARG (args_so_far, Pmode, NULL_TREE, 1); -#ifdef FUNCTION_ARG_PARTIAL_NREGS if (FUNCTION_ARG_PARTIAL_NREGS (args_so_far, Pmode, NULL_TREE, 1)) abort (); -#endif locate_and_pad_parm (Pmode, NULL_TREE, #ifdef STACK_PARMS_IN_REG_PARM_AREA @@ -3582,15 +3574,12 @@ emit_library_call_value_1 (int retval, r && ! (CONSTANT_P (val) && LEGITIMATE_CONSTANT_P (val))) val = force_operand (val, NULL_RTX); -#ifdef FUNCTION_ARG_PASS_BY_REFERENCE if (FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far, mode, NULL_TREE, 1)) { rtx slot; int must_copy = 1 -#ifdef FUNCTION_ARG_CALLEE_COPIES && ! FUNCTION_ARG_CALLEE_COPIES (args_so_far, mode, NULL_TREE, 1) -#endif ; /* loop.c won't look at CALL_INSN_FUNCTION_USAGE of const/pure @@ -3643,19 +3632,14 @@ emit_library_call_value_1 (int retval, r mode = Pmode; val = force_operand (XEXP (slot, 0), NULL_RTX); } -#endif argvec[count].value = val; argvec[count].mode = mode; argvec[count].reg = FUNCTION_ARG (args_so_far, mode, NULL_TREE, 1); -#ifdef FUNCTION_ARG_PARTIAL_NREGS argvec[count].partial = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, mode, NULL_TREE, 1); -#else - argvec[count].partial = 0; -#endif locate_and_pad_parm (mode, NULL_TREE, #ifdef STACK_PARMS_IN_REG_PARM_AREA Index: gcc/expr.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/expr.c,v retrieving revision 1.672 diff -u -p -r1.672 expr.c --- gcc/expr.c 7 Jul 2004 21:26:28 -0000 1.672 +++ gcc/expr.c 8 Jul 2004 06:26:42 -0000 @@ -1423,11 +1423,9 @@ block_move_libcall_safe_for_call_parm (v rtx tmp = FUNCTION_ARG (args_so_far, mode, NULL_TREE, 1); if (!tmp || !REG_P (tmp)) return false; -#ifdef FUNCTION_ARG_PARTIAL_NREGS if (FUNCTION_ARG_PARTIAL_NREGS (args_so_far, mode, NULL_TREE, 1)) return false; -#endif FUNCTION_ARG_ADVANCE (args_so_far, mode, NULL_TREE, 1); } } Index: gcc/expr.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/expr.h,v retrieving revision 1.160 diff -u -p -r1.160 expr.h --- gcc/expr.h 7 Jul 2004 19:23:58 -0000 1.160 +++ gcc/expr.h 8 Jul 2004 06:26:43 -0000 @@ -203,6 +203,18 @@ do { \ #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) PARM_BOUNDARY #endif +#ifndef FUNCTION_ARG_PARTIAL_NREGS +#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0 +#endif + +#ifndef FUNCTION_ARG_PASS_BY_REFERENCE +#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) 0 +#endif + +#ifndef FUNCTION_ARG_CALLEE_COPIES +#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) 0 +#endif + tree split_complex_types (tree); tree split_complex_values (tree); Index: gcc/function.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/function.c,v retrieving revision 1.548 diff -u -p -r1.548 function.c --- gcc/function.c 7 Jul 2004 23:02:22 -0000 1.548 +++ gcc/function.c 8 Jul 2004 06:26:47 -0000 @@ -2246,10 +2246,8 @@ assign_parm_find_data_types (struct assi the machine requires these objects be passed that way. */ if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (passed_type)) || TREE_ADDRESSABLE (passed_type) -#ifdef FUNCTION_ARG_PASS_BY_REFERENCE || FUNCTION_ARG_PASS_BY_REFERENCE (all->args_so_far, passed_mode, passed_type, data->named_arg) -#endif ) { passed_type = nominal_type = build_pointer_type (passed_type); @@ -2366,7 +2364,6 @@ assign_parm_find_entry_rtl (struct assig if (MUST_PASS_IN_STACK (data->promoted_mode, data->passed_type)) entry_parm = 0; -#ifdef FUNCTION_ARG_PARTIAL_NREGS if (entry_parm) { int partial; @@ -2409,7 +2406,6 @@ assign_parm_find_entry_rtl (struct assig all->extra_pretend_bytes = all->pretend_args_size; } } -#endif locate_and_pad_parm (data->promoted_mode, data->passed_type, in_regs, entry_parm ? data->partial : 0, current_function_decl, @@ -2854,7 +2850,6 @@ assign_parm_setup_reg (struct assign_par data->stack_parm = NULL; } -#ifdef FUNCTION_ARG_CALLEE_COPIES /* If we are passed an arg by reference and it is our responsibility to make a copy, do it now. PASSED_TYPE and PASSED mode now refer to the pointer, not the @@ -2899,7 +2894,6 @@ assign_parm_setup_reg (struct assign_par did_conversion = true; } } -#endif /* FUNCTION_ARG_CALLEE_COPIES */ /* Mark the register as eliminable if we did no conversion and it was copied from memory at a fixed offset, and the arg pointer was not [-- Attachment #3: Type: text/plain, Size: 188 bytes --] -- Alexandre Oliva http://www.ic.unicamp.br/~oliva/ Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org} Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org} ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: function.c has unprotected call to FUNCTION_ARG_PASS_BY_REFERENCE 2004-07-08 6:57 ` Alexandre Oliva @ 2004-07-08 7:17 ` Richard Henderson 2004-07-08 18:33 ` Alexandre Oliva 0 siblings, 1 reply; 5+ messages in thread From: Richard Henderson @ 2004-07-08 7:17 UTC (permalink / raw) To: Alexandre Oliva; +Cc: gcc-patches On Thu, Jul 08, 2004 at 03:35:29AM -0300, Alexandre Oliva wrote: > * expr.h (FUNCTION_ARG_PARTIAL_NREGS): Default to 0. > (FUNCTION_ARG_PASS_BY_REFERENCE): Likewise. > (FUNCTION_ARG_CALLEE_COPIES): Likewise. > * calls.c: Remove ifdefs of macros above. > * functions.c: Likewise. > * expr.c: Likewise. Ok. > int must_copy = 1 > -#ifdef FUNCTION_ARG_CALLEE_COPIES > && ! FUNCTION_ARG_CALLEE_COPIES (args_so_far, mode, > NULL_TREE, 1) > -#endif Tidy up the "1 && foo" ? r~ ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: function.c has unprotected call to FUNCTION_ARG_PASS_BY_REFERENCE 2004-07-08 7:17 ` Richard Henderson @ 2004-07-08 18:33 ` Alexandre Oliva 0 siblings, 0 replies; 5+ messages in thread From: Alexandre Oliva @ 2004-07-08 18:33 UTC (permalink / raw) To: Richard Henderson; +Cc: gcc-patches [-- Attachment #1: Type: text/plain, Size: 286 bytes --] On Jul 8, 2004, Richard Henderson <rth@redhat.com> wrote: >> int must_copy = 1 >> -#ifdef FUNCTION_ARG_CALLEE_COPIES >> && ! FUNCTION_ARG_CALLEE_COPIES (args_so_far, mode, >> NULL_TREE, 1) >> -#endif > Tidy up the "1 && foo" ? Ah, good catch, thanks. Here's what I'm checking in. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: gcc-expr-func-macro-defaults.patch --] [-- Type: text/x-patch, Size: 6871 bytes --] Index: gcc/ChangeLog from Alexandre Oliva <aoliva@redhat.com> * expr.h (FUNCTION_ARG_PARTIAL_NREGS): Default to 0. (FUNCTION_ARG_PASS_BY_REFERENCE): Likewise. (FUNCTION_ARG_CALLEE_COPIES): Likewise. * calls.c: Remove ifdefs of macros above. * functions.c: Likewise. * expr.c: Likewise. Index: gcc/expr.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/expr.h,v retrieving revision 1.160 diff -u -p -r1.160 expr.h --- gcc/expr.h 7 Jul 2004 19:23:58 -0000 1.160 +++ gcc/expr.h 8 Jul 2004 16:53:14 -0000 @@ -203,6 +203,18 @@ do { \ #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) PARM_BOUNDARY #endif +#ifndef FUNCTION_ARG_PARTIAL_NREGS +#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0 +#endif + +#ifndef FUNCTION_ARG_PASS_BY_REFERENCE +#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) 0 +#endif + +#ifndef FUNCTION_ARG_CALLEE_COPIES +#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) 0 +#endif + tree split_complex_types (tree); tree split_complex_values (tree); Index: gcc/expr.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/expr.c,v retrieving revision 1.674 diff -u -p -r1.674 expr.c --- gcc/expr.c 8 Jul 2004 08:44:04 -0000 1.674 +++ gcc/expr.c 8 Jul 2004 16:53:39 -0000 @@ -1424,11 +1424,9 @@ block_move_libcall_safe_for_call_parm (v rtx tmp = FUNCTION_ARG (args_so_far, mode, NULL_TREE, 1); if (!tmp || !REG_P (tmp)) return false; -#ifdef FUNCTION_ARG_PARTIAL_NREGS if (FUNCTION_ARG_PARTIAL_NREGS (args_so_far, mode, NULL_TREE, 1)) return false; -#endif FUNCTION_ARG_ADVANCE (args_so_far, mode, NULL_TREE, 1); } } Index: gcc/calls.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/calls.c,v retrieving revision 1.345 diff -u -p -r1.345 calls.c --- gcc/calls.c 8 Jul 2004 07:45:32 -0000 1.345 +++ gcc/calls.c 8 Jul 2004 16:53:48 -0000 @@ -975,16 +975,13 @@ initialize_argument_information (int num /* See if this argument should be passed by invisible reference. */ if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (type)) || TREE_ADDRESSABLE (type) -#ifdef FUNCTION_ARG_PASS_BY_REFERENCE || FUNCTION_ARG_PASS_BY_REFERENCE (*args_so_far, TYPE_MODE (type), type, argpos < n_named_args) -#endif ) { /* If we're compiling a thunk, pass through invisible references instead of making a copy. */ if (call_from_thunk_p -#ifdef FUNCTION_ARG_CALLEE_COPIES || (FUNCTION_ARG_CALLEE_COPIES (*args_so_far, TYPE_MODE (type), type, argpos < n_named_args) /* If it's in a register, we must make a copy of it too. */ @@ -992,7 +989,6 @@ initialize_argument_information (int num && !(TREE_CODE (args[i].tree_value) == VAR_DECL && REG_P (DECL_RTL (args[i].tree_value))) && ! TREE_ADDRESSABLE (type)) -#endif ) { /* C++ uses a TARGET_EXPR to indicate that we want to make a @@ -1095,12 +1091,10 @@ initialize_argument_information (int num args[i].tail_call_reg = args[i].reg; #endif -#ifdef FUNCTION_ARG_PARTIAL_NREGS if (args[i].reg) args[i].partial = FUNCTION_ARG_PARTIAL_NREGS (*args_so_far, mode, type, argpos < n_named_args); -#endif args[i].pass_on_stack = MUST_PASS_IN_STACK (mode, type); @@ -3525,10 +3519,8 @@ emit_library_call_value_1 (int retval, r argvec[count].partial = 0; argvec[count].reg = FUNCTION_ARG (args_so_far, Pmode, NULL_TREE, 1); -#ifdef FUNCTION_ARG_PARTIAL_NREGS if (FUNCTION_ARG_PARTIAL_NREGS (args_so_far, Pmode, NULL_TREE, 1)) abort (); -#endif locate_and_pad_parm (Pmode, NULL_TREE, #ifdef STACK_PARMS_IN_REG_PARM_AREA @@ -3566,16 +3558,11 @@ emit_library_call_value_1 (int retval, r && ! (CONSTANT_P (val) && LEGITIMATE_CONSTANT_P (val))) val = force_operand (val, NULL_RTX); -#ifdef FUNCTION_ARG_PASS_BY_REFERENCE if (FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far, mode, NULL_TREE, 1)) { rtx slot; - int must_copy = 1 -#ifdef FUNCTION_ARG_CALLEE_COPIES - && ! FUNCTION_ARG_CALLEE_COPIES (args_so_far, mode, - NULL_TREE, 1) -#endif - ; + int must_copy = ! FUNCTION_ARG_CALLEE_COPIES (args_so_far, mode, + NULL_TREE, 1); /* loop.c won't look at CALL_INSN_FUNCTION_USAGE of const/pure functions, so we have to pretend this isn't such a function. */ @@ -3627,19 +3614,14 @@ emit_library_call_value_1 (int retval, r mode = Pmode; val = force_operand (XEXP (slot, 0), NULL_RTX); } -#endif argvec[count].value = val; argvec[count].mode = mode; argvec[count].reg = FUNCTION_ARG (args_so_far, mode, NULL_TREE, 1); -#ifdef FUNCTION_ARG_PARTIAL_NREGS argvec[count].partial = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, mode, NULL_TREE, 1); -#else - argvec[count].partial = 0; -#endif locate_and_pad_parm (mode, NULL_TREE, #ifdef STACK_PARMS_IN_REG_PARM_AREA Index: gcc/function.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/function.c,v retrieving revision 1.550 diff -u -p -r1.550 function.c --- gcc/function.c 8 Jul 2004 07:45:39 -0000 1.550 +++ gcc/function.c 8 Jul 2004 16:54:07 -0000 @@ -2241,10 +2241,8 @@ assign_parm_find_data_types (struct assi the machine requires these objects be passed that way. */ if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (passed_type)) || TREE_ADDRESSABLE (passed_type) -#ifdef FUNCTION_ARG_PASS_BY_REFERENCE || FUNCTION_ARG_PASS_BY_REFERENCE (all->args_so_far, passed_mode, passed_type, data->named_arg) -#endif ) { passed_type = nominal_type = build_pointer_type (passed_type); @@ -2361,7 +2359,6 @@ assign_parm_find_entry_rtl (struct assig if (MUST_PASS_IN_STACK (data->promoted_mode, data->passed_type)) entry_parm = 0; -#ifdef FUNCTION_ARG_PARTIAL_NREGS if (entry_parm) { int partial; @@ -2404,7 +2401,6 @@ assign_parm_find_entry_rtl (struct assig all->extra_pretend_bytes = all->pretend_args_size; } } -#endif locate_and_pad_parm (data->promoted_mode, data->passed_type, in_regs, entry_parm ? data->partial : 0, current_function_decl, @@ -2849,7 +2845,6 @@ assign_parm_setup_reg (struct assign_par data->stack_parm = NULL; } -#ifdef FUNCTION_ARG_CALLEE_COPIES /* If we are passed an arg by reference and it is our responsibility to make a copy, do it now. PASSED_TYPE and PASSED mode now refer to the pointer, not the @@ -2894,7 +2889,6 @@ assign_parm_setup_reg (struct assign_par did_conversion = true; } } -#endif /* FUNCTION_ARG_CALLEE_COPIES */ /* Mark the register as eliminable if we did no conversion and it was copied from memory at a fixed offset, and the arg pointer was not [-- Attachment #3: Type: text/plain, Size: 188 bytes --] -- Alexandre Oliva http://www.ic.unicamp.br/~oliva/ Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org} Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org} ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2004-07-08 16:58 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2004-07-08 0:10 function.c has unprotected call to FUNCTION_ARG_PASS_BY_REFERENCE Alexandre Oliva 2004-07-08 1:06 ` Richard Henderson 2004-07-08 6:57 ` Alexandre Oliva 2004-07-08 7:17 ` Richard Henderson 2004-07-08 18:33 ` Alexandre Oliva
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).