} \
while (0)
-#define DECLARE_UNRESOLVED_REFERENCE(NAME) \
- do { extern FILE* asm_out_file; \
- if (asm_out_file) { \
+#define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \
+ do { \
+ if (FILE) { \
if (flag_pic) \
- fprintf (asm_out_file, "\t.lazy_reference "); \
+ fprintf (FILE, "\t.lazy_reference "); \
else \
- fprintf (asm_out_file, "\t.reference "); \
- assemble_name (asm_out_file, NAME); \
- fprintf (asm_out_file, "\n"); \
+ fprintf (FILE, "\t.reference "); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
} \
} while (0)
tree chain;
{
const char *name = IDENTIFIER_POINTER (TREE_VALUE (chain));
- if (! flag_next_runtime)
- {
- tree decl;
- char *string = (char *) alloca (strlen (name) + 30);
- tree exp;
+ char *string = (char *) alloca (strlen (name) + 30);
+ tree decl;
+ tree exp;
- sprintf (string, "%sobjc_class_name_%s",
- (flag_next_runtime ? "." : "__"), name);
+ sprintf (string, "%sobjc_class_name_%s",
+ (flag_next_runtime ? "." : "__"), name);
- /* Make a decl for this name, so we can use its address in a tree. */
- decl = build_decl (VAR_DECL, get_identifier (string), char_type_node);
- DECL_EXTERNAL (decl) = 1;
- TREE_PUBLIC (decl) = 1;
+#ifdef ASM_DECLARE_UNRESOLVED_REFERENCE
+ if (flag_next_runtime)
+ {
+ ASM_DECLARE_UNRESOLVED_REFERENCE (asm_out_file, string);
+ return;
+ }
+#endif
- pushdecl (decl);
- rest_of_decl_compilation (decl, 0, 0, 0);
+ /* Make a decl for this name, so we can use its address in a tree. */
+ decl = build_decl (VAR_DECL, get_identifier (string), char_type_node);
+ DECL_EXTERNAL (decl) = 1;
+ TREE_PUBLIC (decl) = 1;
+
+ pushdecl (decl);
+ rest_of_decl_compilation (decl, 0, 0, 0);
- /* Make following constant read-only (why not)? */
- readonly_data_section ();
+ /* Make following constant read-only, but only for GNU runtime. */
+ if (!flag_next_runtime)
+ readonly_data_section ();
- exp = build1 (ADDR_EXPR, string_type_node, decl);
+ exp = build1 (ADDR_EXPR, string_type_node, decl);
- /* Align the section properly. */
- assemble_constant_align (exp);
+ /* Align the section properly. */
+ assemble_constant_align (exp);
- /* Inform the assembler about this new external thing. */
- assemble_external (decl);
+ /* Inform the assembler about this new external thing. */
+ assemble_external (decl);
- /* Output a constant to reference this address. */
- output_constant (exp, int_size_in_bytes (string_type_node));
- }
- else
- {
- /* This overreliance on our assembler (i.e. lack of portability)
- should be dealt with at some point. The GNU strategy (above)
- won't work either, but it is a start. */
- char *string = (char *) alloca (strlen (name) + 30);
- sprintf (string, ".reference .objc_class_name_%s", name);
- assemble_asm (my_build_string (strlen (string) + 1, string));
- }
+ /* Output a constant to reference this address. */
+ output_constant (exp, int_size_in_bytes (string_type_node));
}
static void