Commit 6f94a68e by Geoffrey Keating Committed by Geoffrey Keating

darwin-protos.h (machopic_non_lazy_ptr_name): Delete prototype.

	* config/darwin-protos.h (machopic_non_lazy_ptr_name): Delete
	prototype.  Clean up some whitespace.
	* config/darwin.c: Use gen_rtx_FOO (...) rather than
	gen_rtx (FOO, ...).
	(machopic_non_lazy_ptr_name): Make static.
	(name_needs_quotes): Allow '.' and '$' unquoted.
	(machopic_legitimize_pic_address): Improve codegen in dynamic-no-pic
	case.

From-SVN: r72544
parent 42f3a0a0
2003-10-15 Geoffrey Keating <geoffk@apple.com>
* config/darwin-protos.h (machopic_non_lazy_ptr_name): Delete
prototype. Clean up some whitespace.
* config/darwin.c: Use gen_rtx_FOO (...) rather than
gen_rtx (FOO, ...).
(machopic_non_lazy_ptr_name): Make static.
(name_needs_quotes): Allow '.' and '$' unquoted.
(machopic_legitimize_pic_address): Improve codegen in dynamic-no-pic
case.
2003-10-15 Gbor Lki <alga@rgai.hu> 2003-10-15 Gbor Lki <alga@rgai.hu>
* fold-const.c (tree_swap_operands_p): disables * fold-const.c (tree_swap_operands_p): disables
......
...@@ -24,7 +24,6 @@ extern void machopic_validate_stub_or_non_lazy_ptr (const char *, int); ...@@ -24,7 +24,6 @@ extern void machopic_validate_stub_or_non_lazy_ptr (const char *, int);
extern const char *machopic_function_base_name (void); extern const char *machopic_function_base_name (void);
extern void machopic_output_function_base_name (FILE *); extern void machopic_output_function_base_name (FILE *);
extern const char *machopic_non_lazy_ptr_name (const char*);
extern const char *machopic_stub_name (const char*); extern const char *machopic_stub_name (const char*);
extern void machopic_picsymbol_stub_section (void); extern void machopic_picsymbol_stub_section (void);
......
...@@ -45,13 +45,14 @@ Boston, MA 02111-1307, USA. */ ...@@ -45,13 +45,14 @@ Boston, MA 02111-1307, USA. */
static int machopic_data_defined_p (const char *); static int machopic_data_defined_p (const char *);
static void update_non_lazy_ptrs (const char *); static void update_non_lazy_ptrs (const char *);
static void update_stubs (const char *); static void update_stubs (const char *);
static const char *machopic_non_lazy_ptr_name (const char*);
int int
name_needs_quotes (const char *name) name_needs_quotes (const char *name)
{ {
int c; int c;
while ((c = *name++) != '\0') while ((c = *name++) != '\0')
if (! ISIDNUM (c)) if (! ISIDNUM (c) && c != '.' && c != '$')
return 1; return 1;
return 0; return 0;
} }
...@@ -262,7 +263,7 @@ static GTY(()) tree machopic_non_lazy_pointers; ...@@ -262,7 +263,7 @@ static GTY(()) tree machopic_non_lazy_pointers;
either by finding it in our list of pointer names, or by generating either by finding it in our list of pointer names, or by generating
a new one. */ a new one. */
const char * static const char *
machopic_non_lazy_ptr_name (const char *name) machopic_non_lazy_ptr_name (const char *name)
{ {
const char *temp_name; const char *temp_name;
...@@ -446,7 +447,6 @@ machopic_indirect_data_reference (rtx orig, rtx reg) ...@@ -446,7 +447,6 @@ machopic_indirect_data_reference (rtx orig, rtx reg)
if (GET_CODE (orig) == SYMBOL_REF) if (GET_CODE (orig) == SYMBOL_REF)
{ {
const char *name = XSTR (orig, 0); const char *name = XSTR (orig, 0);
int defined = machopic_data_defined_p (name); int defined = machopic_data_defined_p (name);
if (defined && MACHO_DYNAMIC_NO_PIC_P) if (defined && MACHO_DYNAMIC_NO_PIC_P)
...@@ -463,10 +463,10 @@ machopic_indirect_data_reference (rtx orig, rtx reg) ...@@ -463,10 +463,10 @@ machopic_indirect_data_reference (rtx orig, rtx reg)
else if (defined) else if (defined)
{ {
#if defined (TARGET_TOC) || defined (HAVE_lo_sum) #if defined (TARGET_TOC) || defined (HAVE_lo_sum)
rtx pic_base = gen_rtx (SYMBOL_REF, Pmode, rtx pic_base = gen_rtx_SYMBOL_REF (Pmode,
machopic_function_base_name ()); machopic_function_base_name ());
rtx offset = gen_rtx (CONST, Pmode, rtx offset = gen_rtx_CONST (Pmode,
gen_rtx (MINUS, Pmode, orig, pic_base)); gen_rtx_MINUS (Pmode, orig, pic_base));
#endif #endif
#if defined (TARGET_TOC) /* i.e., PowerPC */ #if defined (TARGET_TOC) /* i.e., PowerPC */
...@@ -475,31 +475,30 @@ machopic_indirect_data_reference (rtx orig, rtx reg) ...@@ -475,31 +475,30 @@ machopic_indirect_data_reference (rtx orig, rtx reg)
if (reg == NULL) if (reg == NULL)
abort (); abort ();
emit_insn (gen_rtx (SET, Pmode, hi_sum_reg, emit_insn (gen_rtx_SET (Pmode, hi_sum_reg,
gen_rtx (PLUS, Pmode, pic_offset_table_rtx, gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
gen_rtx (HIGH, Pmode, offset)))); gen_rtx_HIGH (Pmode, offset))));
emit_insn (gen_rtx (SET, Pmode, reg, emit_insn (gen_rtx_SET (Pmode, reg,
gen_rtx (LO_SUM, Pmode, hi_sum_reg, offset))); gen_rtx_LO_SUM (Pmode, hi_sum_reg, offset)));
orig = reg; orig = reg;
#else #else
#if defined (HAVE_lo_sum) #if defined (HAVE_lo_sum)
if (reg == 0) abort (); if (reg == 0) abort ();
emit_insn (gen_rtx (SET, VOIDmode, reg, emit_insn (gen_rtx_SET (VOIDmode, reg,
gen_rtx (HIGH, Pmode, offset))); gen_rtx_HIGH (Pmode, offset)));
emit_insn (gen_rtx (SET, VOIDmode, reg, emit_insn (gen_rtx_SET (VOIDmode, reg,
gen_rtx (LO_SUM, Pmode, reg, offset))); gen_rtx_LO_SUM (Pmode, reg, offset)));
emit_insn (gen_rtx (USE, VOIDmode, emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM)));
orig = gen_rtx (PLUS, Pmode, pic_offset_table_rtx, reg); orig = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, reg);
#endif #endif
#endif #endif
return orig; return orig;
} }
ptr_ref = gen_rtx (SYMBOL_REF, Pmode, ptr_ref = gen_rtx_SYMBOL_REF (Pmode,
machopic_non_lazy_ptr_name (name)); machopic_non_lazy_ptr_name (name));
ptr_ref = gen_rtx_MEM (Pmode, ptr_ref); ptr_ref = gen_rtx_MEM (Pmode, ptr_ref);
...@@ -525,7 +524,7 @@ machopic_indirect_data_reference (rtx orig, rtx reg) ...@@ -525,7 +524,7 @@ machopic_indirect_data_reference (rtx orig, rtx reg)
if (MACHOPIC_PURE && GET_CODE (orig) == CONST_INT) if (MACHOPIC_PURE && GET_CODE (orig) == CONST_INT)
result = plus_constant (base, INTVAL (orig)); result = plus_constant (base, INTVAL (orig));
else else
result = gen_rtx (PLUS, Pmode, base, orig); result = gen_rtx_PLUS (Pmode, base, orig);
if (MACHOPIC_JUST_INDIRECT && GET_CODE (base) == MEM) if (MACHOPIC_JUST_INDIRECT && GET_CODE (base) == MEM)
{ {
...@@ -587,7 +586,7 @@ machopic_indirect_call_target (rtx target) ...@@ -587,7 +586,7 @@ machopic_indirect_call_target (rtx target)
{ {
const char *stub_name = machopic_stub_name (name); const char *stub_name = machopic_stub_name (name);
XEXP (target, 0) = gen_rtx (SYMBOL_REF, mode, stub_name); XEXP (target, 0) = gen_rtx_SYMBOL_REF (mode, stub_name);
RTX_UNCHANGING_P (target) = 1; RTX_UNCHANGING_P (target) = 1;
} }
} }
...@@ -627,7 +626,7 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) ...@@ -627,7 +626,7 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
if (MACHO_DYNAMIC_NO_PIC_P) if (MACHO_DYNAMIC_NO_PIC_P)
pic_base = CONST0_RTX (Pmode); pic_base = CONST0_RTX (Pmode);
else else
pic_base = gen_rtx (SYMBOL_REF, Pmode, machopic_function_base_name ()); pic_base = gen_rtx_SYMBOL_REF (Pmode, machopic_function_base_name ());
if (GET_CODE (orig) == MEM) if (GET_CODE (orig) == MEM)
{ {
...@@ -651,9 +650,9 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) ...@@ -651,9 +650,9 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
emit_insn (gen_macho_high (temp_reg, asym)); emit_insn (gen_macho_high (temp_reg, asym));
mem = gen_rtx_MEM (GET_MODE (orig), mem = gen_rtx_MEM (GET_MODE (orig),
gen_rtx (LO_SUM, Pmode, temp_reg, asym)); gen_rtx_LO_SUM (Pmode, temp_reg, asym));
RTX_UNCHANGING_P (mem) = 1; RTX_UNCHANGING_P (mem) = 1;
emit_insn (gen_rtx (SET, VOIDmode, reg, mem)); emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
#else #else
/* Some other CPU -- WriteMe! but right now there are no other platform that can use dynamic-no-pic */ /* Some other CPU -- WriteMe! but right now there are no other platform that can use dynamic-no-pic */
abort (); abort ();
...@@ -664,36 +663,46 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) ...@@ -664,36 +663,46 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
if (GET_CODE (XEXP (orig, 0)) == SYMBOL_REF if (GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
|| GET_CODE (XEXP (orig, 0)) == LABEL_REF) || GET_CODE (XEXP (orig, 0)) == LABEL_REF)
{ {
rtx offset = gen_rtx (CONST, Pmode, rtx offset = gen_rtx_CONST (Pmode,
gen_rtx (MINUS, Pmode, gen_rtx_MINUS (Pmode,
XEXP (orig, 0), pic_base)); XEXP (orig, 0),
pic_base));
#if defined (TARGET_TOC) /* i.e., PowerPC */ #if defined (TARGET_TOC) /* i.e., PowerPC */
/* Generating a new reg may expose opportunities for /* Generating a new reg may expose opportunities for
common subexpression elimination. */ common subexpression elimination. */
rtx hi_sum_reg = rtx hi_sum_reg = no_new_pseudos ? reg : gen_reg_rtx (SImode);
(reload_in_progress ? reg : gen_reg_rtx (SImode)); rtx mem;
rtx insn;
rtx sum;
emit_insn (gen_rtx (SET, Pmode, hi_sum_reg, sum = gen_rtx_HIGH (Pmode, offset);
gen_rtx (PLUS, Pmode, if (! MACHO_DYNAMIC_NO_PIC_P)
pic_offset_table_rtx, sum = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, sum);
gen_rtx (HIGH, Pmode, offset))));
emit_insn (gen_rtx (SET, VOIDmode, reg,
gen_rtx (MEM, GET_MODE (orig),
gen_rtx (LO_SUM, Pmode,
hi_sum_reg, offset))));
pic_ref = reg;
emit_insn (gen_rtx_SET (Pmode, hi_sum_reg, sum));
mem = gen_rtx_MEM (GET_MODE (orig),
gen_rtx_LO_SUM (Pmode,
hi_sum_reg, offset));
RTX_UNCHANGING_P (mem) = 1;
insn = emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, pic_ref,
REG_NOTES (insn));
pic_ref = reg;
#else #else
emit_insn (gen_rtx (USE, VOIDmode, emit_insn (gen_rtx_USE (VOIDmode,
gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM))); gen_rtx_REG (Pmode,
PIC_OFFSET_TABLE_REGNUM)));
emit_insn (gen_rtx (SET, VOIDmode, reg,
gen_rtx (HIGH, Pmode, emit_insn (gen_rtx_SET (VOIDmode, reg,
gen_rtx (CONST, Pmode, offset)))); gen_rtx_HIGH (Pmode,
emit_insn (gen_rtx (SET, VOIDmode, reg, gen_rtx_CONST (Pmode,
gen_rtx (LO_SUM, Pmode, reg, offset))));
gen_rtx (CONST, Pmode, offset)))); emit_insn (gen_rtx_SET (VOIDmode, reg,
pic_ref = gen_rtx (PLUS, Pmode, gen_rtx_LO_SUM (Pmode, reg,
gen_rtx_CONST (Pmode, offset))));
pic_ref = gen_rtx_PLUS (Pmode,
pic_offset_table_rtx, reg); pic_offset_table_rtx, reg);
#endif #endif
} }
...@@ -707,21 +716,22 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) ...@@ -707,21 +716,22 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
pic = reg; pic = reg;
} }
#if 0 #if 0
emit_insn (gen_rtx (USE, VOIDmode, emit_insn (gen_rtx_USE (VOIDmode,
gen_rtx (REG, Pmode, PIC_OFFSET_TABLE_REGNUM))); gen_rtx_REG (Pmode,
PIC_OFFSET_TABLE_REGNUM)));
#endif #endif
pic_ref = gen_rtx (PLUS, Pmode, pic_ref = gen_rtx_PLUS (Pmode,
pic, pic,
gen_rtx (CONST, Pmode, gen_rtx_CONST (Pmode,
gen_rtx (MINUS, Pmode, gen_rtx_MINUS (Pmode,
XEXP (orig, 0), XEXP (orig, 0),
pic_base))); pic_base)));
} }
#if !defined (TARGET_TOC) #if !defined (TARGET_TOC)
emit_move_insn (reg, pic_ref); emit_move_insn (reg, pic_ref);
pic_ref = gen_rtx (MEM, GET_MODE (orig), reg); pic_ref = gen_rtx_MEM (GET_MODE (orig), reg);
#endif #endif
RTX_UNCHANGING_P (pic_ref) = 1; RTX_UNCHANGING_P (pic_ref) = 1;
} }
...@@ -732,8 +742,9 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) ...@@ -732,8 +742,9 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
if (GET_CODE (orig) == SYMBOL_REF if (GET_CODE (orig) == SYMBOL_REF
|| GET_CODE (orig) == LABEL_REF) || GET_CODE (orig) == LABEL_REF)
{ {
rtx offset = gen_rtx (CONST, Pmode, rtx offset = gen_rtx_CONST (Pmode,
gen_rtx (MINUS, Pmode, orig, pic_base)); gen_rtx_MINUS (Pmode,
orig, pic_base));
#if defined (TARGET_TOC) /* i.e., PowerPC */ #if defined (TARGET_TOC) /* i.e., PowerPC */
rtx hi_sum_reg; rtx hi_sum_reg;
...@@ -747,23 +758,24 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) ...@@ -747,23 +758,24 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
hi_sum_reg = reg; hi_sum_reg = reg;
emit_insn (gen_rtx (SET, Pmode, hi_sum_reg, emit_insn (gen_rtx_SET (Pmode, hi_sum_reg,
(MACHO_DYNAMIC_NO_PIC_P) (MACHO_DYNAMIC_NO_PIC_P)
? gen_rtx (HIGH, Pmode, offset) ? gen_rtx_HIGH (Pmode, offset)
: gen_rtx (PLUS, Pmode, : gen_rtx_PLUS (Pmode,
pic_offset_table_rtx, pic_offset_table_rtx,
gen_rtx (HIGH, Pmode, offset)))); gen_rtx_HIGH (Pmode,
emit_insn (gen_rtx (SET, VOIDmode, reg, offset))));
gen_rtx (LO_SUM, Pmode, emit_insn (gen_rtx_SET (VOIDmode, reg,
gen_rtx_LO_SUM (Pmode,
hi_sum_reg, offset))); hi_sum_reg, offset)));
pic_ref = reg; pic_ref = reg;
RTX_UNCHANGING_P (pic_ref) = 1; RTX_UNCHANGING_P (pic_ref) = 1;
#else #else
emit_insn (gen_rtx (SET, VOIDmode, reg, emit_insn (gen_rtx_SET (VOIDmode, reg,
gen_rtx (HIGH, Pmode, offset))); gen_rtx_HIGH (Pmode, offset)));
emit_insn (gen_rtx (SET, VOIDmode, reg, emit_insn (gen_rtx_SET (VOIDmode, reg,
gen_rtx (LO_SUM, Pmode, reg, offset))); gen_rtx_LO_SUM (Pmode, reg, offset)));
pic_ref = gen_rtx (PLUS, Pmode, pic_ref = gen_rtx_PLUS (Pmode,
pic_offset_table_rtx, reg); pic_offset_table_rtx, reg);
RTX_UNCHANGING_P (pic_ref) = 1; RTX_UNCHANGING_P (pic_ref) = 1;
#endif #endif
...@@ -784,13 +796,13 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) ...@@ -784,13 +796,13 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
pic = reg; pic = reg;
} }
#if 0 #if 0
emit_insn (gen_rtx (USE, VOIDmode, emit_insn (gen_rtx_USE (VOIDmode,
pic_offset_table_rtx)); pic_offset_table_rtx));
#endif #endif
pic_ref = gen_rtx (PLUS, Pmode, pic_ref = gen_rtx_PLUS (Pmode,
pic, pic,
gen_rtx (CONST, Pmode, gen_rtx_CONST (Pmode,
gen_rtx (MINUS, Pmode, gen_rtx_MINUS (Pmode,
orig, pic_base))); orig, pic_base)));
} }
} }
...@@ -837,7 +849,7 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) ...@@ -837,7 +849,7 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
is_complex = 1; is_complex = 1;
} }
else else
pic_ref = gen_rtx (PLUS, Pmode, base, orig); pic_ref = gen_rtx_PLUS (Pmode, base, orig);
if (RTX_UNCHANGING_P (base) && RTX_UNCHANGING_P (orig)) if (RTX_UNCHANGING_P (base) && RTX_UNCHANGING_P (orig))
RTX_UNCHANGING_P (pic_ref) = 1; RTX_UNCHANGING_P (pic_ref) = 1;
...@@ -860,7 +872,7 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) ...@@ -860,7 +872,7 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
{ {
rtx addr = machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, reg); rtx addr = machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, reg);
addr = gen_rtx (MEM, GET_MODE (orig), addr); addr = gen_rtx_MEM (GET_MODE (orig), addr);
RTX_UNCHANGING_P (addr) = RTX_UNCHANGING_P (orig); RTX_UNCHANGING_P (addr) = RTX_UNCHANGING_P (orig);
emit_move_insn (reg, addr); emit_move_insn (reg, addr);
pic_ref = reg; pic_ref = reg;
...@@ -925,7 +937,7 @@ machopic_finish (FILE *asm_out_file) ...@@ -925,7 +937,7 @@ machopic_finish (FILE *asm_out_file)
data_section (); data_section ();
assemble_align (GET_MODE_ALIGNMENT (Pmode)); assemble_align (GET_MODE_ALIGNMENT (Pmode));
assemble_label (lazy_name); assemble_label (lazy_name);
assemble_integer (gen_rtx (SYMBOL_REF, Pmode, sym_name), assemble_integer (gen_rtx_SYMBOL_REF (Pmode, sym_name),
GET_MODE_SIZE (Pmode), GET_MODE_SIZE (Pmode),
GET_MODE_ALIGNMENT (Pmode), 1); GET_MODE_ALIGNMENT (Pmode), 1);
} }
...@@ -1092,7 +1104,6 @@ machopic_output_possible_stub_label (FILE *file, const char *name) ...@@ -1092,7 +1104,6 @@ machopic_output_possible_stub_label (FILE *file, const char *name)
{ {
tree temp; tree temp;
/* Ensure we're looking at a section-encoded name. */ /* Ensure we're looking at a section-encoded name. */
if (name[0] != '!' || (name[1] != 't' && name[1] != 'T')) if (name[0] != '!' || (name[1] != 't' && name[1] != 'T'))
return; return;
...@@ -1281,7 +1292,6 @@ machopic_select_rtx_section (enum machine_mode mode, rtx x, ...@@ -1281,7 +1292,6 @@ machopic_select_rtx_section (enum machine_mode mode, rtx x,
void void
machopic_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED) machopic_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
{ {
if (MACHOPIC_INDIRECT) if (MACHOPIC_INDIRECT)
mod_init_section (); mod_init_section ();
else else
...@@ -1289,7 +1299,6 @@ machopic_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED) ...@@ -1289,7 +1299,6 @@ machopic_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
assemble_align (POINTER_SIZE); assemble_align (POINTER_SIZE);
assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
if (! MACHOPIC_INDIRECT) if (! MACHOPIC_INDIRECT)
fprintf (asm_out_file, ".reference .constructors_used\n"); fprintf (asm_out_file, ".reference .constructors_used\n");
} }
...@@ -1297,7 +1306,6 @@ machopic_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED) ...@@ -1297,7 +1306,6 @@ machopic_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
void void
machopic_asm_out_destructor (rtx symbol, int priority ATTRIBUTE_UNUSED) machopic_asm_out_destructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
{ {
if (MACHOPIC_INDIRECT) if (MACHOPIC_INDIRECT)
mod_term_section (); mod_term_section ();
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment