Makefile.in (OBJS): Add dwarf2asm.o.

* Makefile.in (OBJS): Add dwarf2asm.o.
	* dwarf2asm.c, dwarf2asm.h: New files.
	* dwarf2out.c (*): Use them.
	(size_of_uleb128, size_of_sleb128): Remove.
	(output_uleb128, output_sleb128): Remove.
	(UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP): Remove.
	(UNALIGNED_DOUBLE_INT_ASM_OP, ASM_BYTE_OP): Remove.
	(UNALIGNED_OFFSET_ASM_OP, UNALIGNED_WORD_ASM_OP): Remove.
	(FDE_LABEL, LINE_NUMBER_BEGIN_LABEL, LINE_NUMBER_END_LABEL): New.
	(ASM_OUTPUT_DWARF_DATA1, ASM_OUTPUT_DWARF_DELTA1): Remove.
	(ASM_OUTPUT_DWARF_DATA2, ASM_OUTPUT_DWARF_DELTA2): Remove.
	(ASM_OUTPUT_DWARF_DATA4, ASM_OUTPUT_DWARF_DELTA4): Remove.
	(ASM_OUTPUT_DWARF_DATA, ASM_OUTPUT_DWARF_DELTA): Remove.
	(ASM_OUTPUT_DWARF_ADDR, ASM_OUTPUT_DWARF_ADDR_DATA): Remove.
	(ASM_OUTPUT_DWARF_ADDR_DELTA, ASM_OUTPUT_DWARF_ADDR_CONST): Remove.
	(ASM_OUTPUT_DWARF_OFFSET4, ASM_OUTPUT_DWARF_OFFSET): Remove.
	(ASM_OUTPUT_DWARF_CONST_DOUBLE): Remove.
	(ASM_OUTPUT_DWARF_NSTRING, ASM_OUTPUT_DWARF_STRING): Remove.
	(dwarf2out_frame_debug): Remove unused variables.
	(output_loc_operands): Don't abort on 8 byte constants if
	host integers are wide enough.
	(output_symbolic_ref): Remove.
	(size_of_die): Don't assume 4 byte host integers.
	(output_line_info): Use ASM_GENERATE_INTERNAL_LABEL for begin
	and end labels.
	(add_const_value_attribute) [CONST_INT]: Verify we're not doing
	something stupid with HOST_WIDE_INT to long truncation.
	[CONST_DOUBLE]: Likewise.

	* config/arm/conix-elf.h (UNALIGNED_WORD_ASM_OP): Remove.
	(ASM_OUTPUT_DWARF2_ADDR_CONST, ASM_OUTPUT_DWARF_ADDR_CONST): Remove.
	* config/arm/unknown-elf.h: Likewise.
	* config/rs6000/aix.h (UNALIGNED_SHORT_ASM_OP): New.
	(UNALIGNED_INT_ASM_OP, UNALIGNED_DOUBLE_INT_ASM_OP): New.
	(ASM_OUTPUT_DWARF_ADDR_VAR, ASM_OUTPUT_DWARF_DELTA_VAR): Remove.
	(ASM_OUTPUT_DWARF_DELTA2, ASM_OUTPUT_DWARF_DELTA4): Remove.
	(ASM_OUTPUT_DWARF_DELTA, ASM_OUTPUT_DWARF_ADDR_DELTA): Remove.
	(ASM_OUTPUT_DWARF_ADDR, ASM_OUTPUT_DWARF_DATA4): Remove.
	(ASM_OUTPUT_DWARF_DATA2, ASM_OUTPUT_DWARF_OFFSET4): Remove.
	(ASM_OUTPUT_DWARF_OFFSET): Remove.
	* config/rs6000/sysv4.h (ASM_OUTPUT_DWARF_ADDR): Remove.
	* config/sparc/sp64-elf.h (UNALIGNED_DOUBLE_INT_ASM_OP): New.
	(UNALIGNED_LONGLONG_ASM_OP, ASM_OUTPUT_DWARF_ADDR): Remove.
	(ASM_OUTPUT_DWARF_ADDR_CONST, ASM_OUTPUT_DWARF_REF): Remove.

From-SVN: r40197
This commit is contained in:
Richard Henderson 2001-03-02 18:17:07 -08:00 committed by Richard Henderson
parent dc76f41ca6
commit 2e4b9b8cc2
10 changed files with 1060 additions and 1291 deletions

View File

@ -1,3 +1,50 @@
2001-03-02 Richard Henderson <rth@redhat.com>
* Makefile.in (OBJS): Add dwarf2asm.o.
* dwarf2asm.c, dwarf2asm.h: New files.
* dwarf2out.c (*): Use them.
(size_of_uleb128, size_of_sleb128): Remove.
(output_uleb128, output_sleb128): Remove.
(UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP): Remove.
(UNALIGNED_DOUBLE_INT_ASM_OP, ASM_BYTE_OP): Remove.
(UNALIGNED_OFFSET_ASM_OP, UNALIGNED_WORD_ASM_OP): Remove.
(FDE_LABEL, LINE_NUMBER_BEGIN_LABEL, LINE_NUMBER_END_LABEL): New.
(ASM_OUTPUT_DWARF_DATA1, ASM_OUTPUT_DWARF_DELTA1): Remove.
(ASM_OUTPUT_DWARF_DATA2, ASM_OUTPUT_DWARF_DELTA2): Remove.
(ASM_OUTPUT_DWARF_DATA4, ASM_OUTPUT_DWARF_DELTA4): Remove.
(ASM_OUTPUT_DWARF_DATA, ASM_OUTPUT_DWARF_DELTA): Remove.
(ASM_OUTPUT_DWARF_ADDR, ASM_OUTPUT_DWARF_ADDR_DATA): Remove.
(ASM_OUTPUT_DWARF_ADDR_DELTA, ASM_OUTPUT_DWARF_ADDR_CONST): Remove.
(ASM_OUTPUT_DWARF_OFFSET4, ASM_OUTPUT_DWARF_OFFSET): Remove.
(ASM_OUTPUT_DWARF_CONST_DOUBLE): Remove.
(ASM_OUTPUT_DWARF_NSTRING, ASM_OUTPUT_DWARF_STRING): Remove.
(dwarf2out_frame_debug): Remove unused variables.
(output_loc_operands): Don't abort on 8 byte constants if
host integers are wide enough.
(output_symbolic_ref): Remove.
(size_of_die): Don't assume 4 byte host integers.
(output_line_info): Use ASM_GENERATE_INTERNAL_LABEL for begin
and end labels.
(add_const_value_attribute) [CONST_INT]: Verify we're not doing
something stupid with HOST_WIDE_INT to long truncation.
[CONST_DOUBLE]: Likewise.
* config/arm/conix-elf.h (UNALIGNED_WORD_ASM_OP): Remove.
(ASM_OUTPUT_DWARF2_ADDR_CONST, ASM_OUTPUT_DWARF_ADDR_CONST): Remove.
* config/arm/unknown-elf.h: Likewise.
* config/rs6000/aix.h (UNALIGNED_SHORT_ASM_OP): New.
(UNALIGNED_INT_ASM_OP, UNALIGNED_DOUBLE_INT_ASM_OP): New.
(ASM_OUTPUT_DWARF_ADDR_VAR, ASM_OUTPUT_DWARF_DELTA_VAR): Remove.
(ASM_OUTPUT_DWARF_DELTA2, ASM_OUTPUT_DWARF_DELTA4): Remove.
(ASM_OUTPUT_DWARF_DELTA, ASM_OUTPUT_DWARF_ADDR_DELTA): Remove.
(ASM_OUTPUT_DWARF_ADDR, ASM_OUTPUT_DWARF_DATA4): Remove.
(ASM_OUTPUT_DWARF_DATA2, ASM_OUTPUT_DWARF_OFFSET4): Remove.
(ASM_OUTPUT_DWARF_OFFSET): Remove.
* config/rs6000/sysv4.h (ASM_OUTPUT_DWARF_ADDR): Remove.
* config/sparc/sp64-elf.h (UNALIGNED_DOUBLE_INT_ASM_OP): New.
(UNALIGNED_LONGLONG_ASM_OP, ASM_OUTPUT_DWARF_ADDR): Remove.
(ASM_OUTPUT_DWARF_ADDR_CONST, ASM_OUTPUT_DWARF_REF): Remove.
2001-03-02 John David Anglin <dave@hiauly1.hia.nrc.ca>
* cselib.c (hash_rtx): Cast enums to unsigned int.

View File

@ -733,19 +733,22 @@ C_OBJS = c-parse.o c-lang.o $(C_AND_OBJC_OBJS)
# Language-independent object files.
OBJS = diagnostic.o version.o tree.o print-tree.o stor-layout.o fold-const.o \
function.o stmt.o except.o expr.o calls.o expmed.o explow.o optabs.o real.o \
builtins.o intl.o varasm.o rtl.o print-rtl.o rtlanal.o emit-rtl.o genrtl.o \
dbxout.o sdbout.o dwarfout.o dwarf2out.o xcoffout.o bitmap.o alias.o gcse.o \
integrate.o jump.o cse.o loop.o doloop.o unroll.o flow.o combine.o varray.o \
regclass.o regmove.o local-alloc.o global.o reload.o reload1.o caller-save.o\
insn-peep.o reorg.o haifa-sched.o final.o recog.o reg-stack.o regrename.o \
insn-opinit.o insn-recog.o insn-extract.o insn-output.o insn-emit.o lcm.o \
profile.o insn-attrtab.o $(out_object_file) $(EXTRA_OBJS) convert.o \
mbchar.o splay-tree.o graph.o sbitmap.o resource.o hash.o predict.o \
lists.o ggc-common.o $(GGC) stringpool.o simplify-rtx.o ssa.o bb-reorder.o \
sibcall.o conflict.o timevar.o ifcvt.o dominance.o dependence.o dce.o \
sched-vis.o sched-deps.o sched-rgn.o sched-ebb.o hashtab.o cselib.o params.o
OBJS = \
alias.o bb-reorder.o bitmap.o builtins.o caller-save.o calls.o \
combine.o conflict.o convert.o cse.o cselib.o dbxout.o dce.o \
dependence.o diagnostic.o doloop.o dominance.o dwarf2asm.o dwarf2out.o \
dwarfout.o emit-rtl.o except.o explow.o expmed.o expr.o final.o flow.o \
fold-const.o function.o gcse.o genrtl.o ggc-common.o global.o graph.o \
haifa-sched.o hash.o hashtab.o ifcvt.o insn-attrtab.o insn-emit.o \
insn-extract.o insn-opinit.o insn-output.o insn-peep.o insn-recog.o \
integrate.o intl.o jump.o lcm.o lists.o local-alloc.o loop.o mbchar.o \
optabs.o params.o predict.o print-rtl.o print-tree.o profile.o real.o \
recog.o reg-stack.o regclass.o regmove.o regrename.o reload.o \
reload1.o reorg.o resource.o rtl.o rtlanal.o sbitmap.o sched-deps.o \
sched-ebb.o sched-rgn.o sched-vis.o sdbout.o sibcall.o simplify-rtx.o \
splay-tree.o ssa.o stmt.o stor-layout.o stringpool.o timevar.o tree.o \
unroll.o varasm.o varray.o version.o xcoffout.o \
$(GGC) $(out_object_file) $(EXTRA_OBJS)
BACKEND = toplev.o libbackend.a
@ -1397,7 +1400,9 @@ dwarfout.o : dwarfout.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) dwarf.h \
dwarf2out.o : dwarf2out.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) dwarf2.h \
flags.h insn-config.h reload.h output.h \
hard-reg-set.h $(REGS_H) $(EXPR_H) toplev.h dwarf2out.h varray.h \
$(GGC_H) except.h
$(GGC_H) except.h dwarf2asm.h
dwarf2asm.o : dwarf2asm.c $(CONFIG_H) system.h flags.h $(RTL_H) output.h \
dwarf2asm.h
xcoffout.o : xcoffout.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) xcoffout.h \
flags.h toplev.h output.h dbxout.h $(GGC_H)
emit-rtl.o : emit-rtl.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \

View File

@ -99,23 +99,6 @@ func_ptr __DTOR_END__[1] = { (func_ptr) 0 };
} \
while (0)
/* Don't know how to order these. UNALIGNED_WORD_ASM_OP is in
dwarf2.out. */
#define UNALIGNED_WORD_ASM_OP "\t.4byte\t"
#define ASM_OUTPUT_DWARF2_ADDR_CONST(FILE,ADDR) \
fprintf ((FILE), "%s%s", UNALIGNED_WORD_ASM_OP, ADDR)
#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,RTX) \
do \
{ \
fprintf ((FILE), "%s", UNALIGNED_WORD_ASM_OP); \
output_addr_const ((FILE), (RTX)); \
fputc ('\n', (FILE)); \
} \
while (0)
/* The ARM development system defines __main. */
#define NAME__MAIN "__gccmain"
#define SYMBOL__MAIN __gccmain

View File

@ -103,23 +103,6 @@ rdata_section () \
} \
while (0)
/* Don't know how to order these. UNALIGNED_WORD_ASM_OP is in
dwarf2.out. */
#define UNALIGNED_WORD_ASM_OP "\t.4byte\t"
#define ASM_OUTPUT_DWARF2_ADDR_CONST(FILE,ADDR) \
fprintf ((FILE), "%s%s", UNALIGNED_WORD_ASM_OP, ADDR)
#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,RTX) \
do \
{ \
fprintf ((FILE), "%s", UNALIGNED_WORD_ASM_OP); \
output_addr_const ((FILE), (RTX)); \
fputc ('\n', (FILE)); \
} \
while (0)
/* The ARM development system defines __main. */
#define NAME__MAIN "__gccmain"
#define SYMBOL__MAIN __gccmain

View File

@ -561,48 +561,9 @@ toc_section () \
use '.long' or '.word', but that aligns to a 4-byte boundary which
is not what is required. So we define a million macros... */
#define ASM_OUTPUT_DWARF_ADDR_VAR(FILE, LABEL, LENGTH) \
do { fprintf ((FILE), "\t.vbyte\t%d,", LENGTH); \
assemble_name (FILE, LABEL); \
} while (0)
#define ASM_OUTPUT_DWARF_DELTA_VAR(FILE, LABEL1, LABEL2, LENGTH) \
do { fprintf ((FILE), "\t.vbyte\t%d,", LENGTH); \
assemble_name (FILE, LABEL1); \
fprintf (FILE, "-"); \
assemble_name (FILE, LABEL2); \
} while (0)
#define ASM_OUTPUT_DWARF_DELTA2(FILE, LABEL1, LABEL2) \
ASM_OUTPUT_DWARF_DELTA_VAR (FILE, LABEL1, LABEL2, 2)
#define ASM_OUTPUT_DWARF_DELTA4(FILE, LABEL1, LABEL2) \
ASM_OUTPUT_DWARF_DELTA_VAR (FILE, LABEL1, LABEL2, 4)
#define ASM_OUTPUT_DWARF_DELTA(FILE, LABEL1, LABEL2) \
ASM_OUTPUT_DWARF_DELTA_VAR (FILE, LABEL1, LABEL2, DWARF_OFFSET_SIZE)
#define ASM_OUTPUT_DWARF_ADDR_DELTA(FILE, LABEL1, LABEL2) \
ASM_OUTPUT_DWARF_DELTA_VAR (FILE, LABEL1, LABEL2, \
POINTER_SIZE / BITS_PER_UNIT)
#define ASM_OUTPUT_DWARF_ADDR(FILE, LABEL) \
ASM_OUTPUT_DWARF_ADDR_VAR (FILE, LABEL, POINTER_SIZE / BITS_PER_UNIT)
#define ASM_OUTPUT_DWARF_DATA4(FILE, VALUE) \
fprintf ((FILE), "\t.vbyte\t4,0x%x", (unsigned) (VALUE))
#define ASM_OUTPUT_DWARF_DATA2(FILE, VALUE) \
fprintf ((FILE), "\t.vbyte\t2,0x%x", (unsigned) (VALUE))
#define ASM_OUTPUT_DWARF_OFFSET4(FILE, LABEL) \
ASM_OUTPUT_DWARF_ADDR_VAR (FILE, LABEL, 4)
#define ASM_OUTPUT_DWARF_OFFSET(FILE, LABEL) \
ASM_OUTPUT_DWARF_ADDR_VAR (FILE, LABEL, DWARF_OFFSET_SIZE)
/* dwarf2out keys off this, but we don't have to have a real definition. */
#define UNALIGNED_INT_ASM_OP bite_me
#define UNALIGNED_SHORT_ASM_OP "\t.vbyte\t2,"
#define UNALIGNED_INT_ASM_OP "\t.vbyte\t4,"
#define UNALIGNED_DOUBLE_INT_ASM_OP "\t.vbyte\t8,"
/* Output before instructions. */
#define TEXT_SECTION_ASM_OP "\t.csect .text[PR]"

View File

@ -871,36 +871,6 @@ do { \
} \
} while (0)
/* This is how to output an assembler line defining an address
constant for the dwarf call unwinding information.
For -mrelocatable, we mark all addresses that need to be fixed up
in the .fixup section. */
#define ASM_OUTPUT_DWARF_ADDR(FILE,LABEL) \
do { \
if (TARGET_RELOCATABLE) \
{ \
char buf[256]; \
\
ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno); \
fixuplabelno++; \
ASM_OUTPUT_LABEL (FILE, buf); \
fprintf (FILE, "\t.%dbyte\t", POINTER_SIZE / BITS_PER_UNIT); \
assemble_name (FILE, LABEL); \
fprintf (FILE, "\n"); \
fprintf (FILE, "\t.section \".fixup\",\"aw\"\n"); \
ASM_OUTPUT_ALIGN (FILE, 2); \
fprintf (FILE, "\t.long\t"); \
assemble_name (FILE, buf); \
fprintf (FILE, "\n\t.previous\n"); \
} \
else \
{ \
fprintf (FILE, "\t.%dbyte\t", POINTER_SIZE / BITS_PER_UNIT); \
assemble_name (FILE, LABEL); \
} \
} while (0)
/* This is the end of what might become sysv4.h. */
/* Allow stabs and dwarf, for now, make stabs the default debugging type,

View File

@ -124,33 +124,6 @@ crtbegin.o%s \
#undef ASM_IDENTIFY_GCC
#define ASM_IDENTIFY_GCC(FILE)
/* Define the names of various pseudo-ops used by the Sparc/svr4 assembler.
??? If ints are 64 bits then UNALIGNED_INT_ASM_OP (defined elsewhere) is
misnamed. These should all refer to explicit sizes (half/word/xword?),
anything other than short/int/long/etc. */
/* Define the names of various pseudo-ops used by the Sparc/svr4 assembler. */
#define UNALIGNED_LONGLONG_ASM_OP "\t.uaxword\t"
/* DWARF stuff. */
#define ASM_OUTPUT_DWARF_ADDR(FILE, LABEL) \
do { \
fprintf ((FILE), "%s", UNALIGNED_LONGLONG_ASM_OP); \
assemble_name ((FILE), (LABEL)); \
fprintf ((FILE), "\n"); \
} while (0)
#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE, RTX) \
do { \
fprintf ((FILE), "%s", UNALIGNED_LONGLONG_ASM_OP); \
output_addr_const ((FILE), (RTX)); \
fputc ('\n', (FILE)); \
} while (0)
/* ??? Not sure if this should be 4 or 8 bytes. 4 works for now. */
#define ASM_OUTPUT_DWARF_REF(FILE, LABEL) \
do { \
fprintf ((FILE), "%s", UNALIGNED_INT_ASM_OP); \
assemble_name ((FILE), (LABEL)); \
fprintf ((FILE), "\n"); \
} while (0)
#define UNALIGNED_DOUBLE_INT_ASM_OP "\t.uaxword\t"

585
gcc/dwarf2asm.c Normal file
View File

@ -0,0 +1,585 @@
/* Dwarf2 assembler output helper routines.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "flags.h"
#include "rtl.h"
#include "output.h"
#include "dwarf2asm.h"
#include "tm_p.h"
/* How to start an assembler comment. */
#ifndef ASM_COMMENT_START
#define ASM_COMMENT_START ";#"
#endif
/* Definitions of defaults for assembler-dependent names of various
pseudo-ops and section names. These may be overridden in the tm.h
file (if necessary) for a particular assembler. */
#ifdef OBJECT_FORMAT_ELF
#ifndef UNALIGNED_SHORT_ASM_OP
#define UNALIGNED_SHORT_ASM_OP "\t.2byte\t"
#endif
#ifndef UNALIGNED_INT_ASM_OP
#define UNALIGNED_INT_ASM_OP "\t.4byte\t"
#endif
#ifndef UNALIGNED_DOUBLE_INT_ASM_OP
#define UNALIGNED_DOUBLE_INT_ASM_OP "\t.8byte\t"
#endif
#endif /* OBJECT_FORMAT_ELF */
#ifndef ASM_BYTE_OP
#define ASM_BYTE_OP "\t.byte\t"
#endif
/* We don't have unaligned support, let's hope the normal output works for
.debug_frame. But we know it won't work for .debug_info. */
#if !defined(UNALIGNED_INT_ASM_OP) && defined(DWARF2_DEBUGGING_INFO)
#error DWARF2_DEBUGGING_INFO requires UNALIGNED_INT_ASM_OP.
#endif
#ifdef UNALIGNED_INT_ASM_OP
static const char * unaligned_integer_asm_op PARAMS ((int));
static inline const char *
unaligned_integer_asm_op (size)
int size;
{
const char *op;
switch (size)
{
case 1:
op = ASM_BYTE_OP;
break;
case 2:
op = UNALIGNED_SHORT_ASM_OP;
break;
case 4:
op = UNALIGNED_INT_ASM_OP;
break;
case 8:
#ifdef UNALIGNED_DOUBLE_INT_ASM_OP
op = UNALIGNED_DOUBLE_INT_ASM_OP;
break;
#endif
default:
abort ();
}
return op;
}
#endif /* UNALIGNED_INT_ASM_OP */
void
dw2_asm_output_data VPARAMS ((int size, unsigned HOST_WIDE_INT value,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
int size;
unsigned HOST_WIDE_INT value;
const char *comment;
#endif
va_list ap;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
size = va_arg (ap, int);
value = va_arg (ap, unsigned HOST_WIDE_INT);
comment = va_arg (ap, const char *);
#endif
#ifdef UNALIGNED_INT_ASM_OP
fputs (unaligned_integer_asm_op (size), asm_out_file);
fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, value);
#else
assemble_integer (GEN_INT (value), size, 1);
#endif
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
}
fputc ('\n', asm_out_file);
va_end (ap);
}
void
dw2_asm_output_delta VPARAMS ((int size, const char *lab1, const char *lab2,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
int size;
const char *lab1, *lab2;
const char *comment;
#endif
va_list ap;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
size = va_arg (ap, int);
lab1 = va_arg (ap, const char *);
lab2 = va_arg (ap, const char *);
comment = va_arg (ap, const char *);
#endif
#ifdef UNALIGNED_INT_ASM_OP
fputs (unaligned_integer_asm_op (size), asm_out_file);
assemble_name (asm_out_file, lab1);
fputc ('-', asm_out_file);
assemble_name (asm_out_file, lab2);
#else
assemble_integer (gen_rtx_MINUS (smallest_mode_for_size (size, MODE_INT, 0),
gen_rtx_SYMBOL_REF (Pmode, lab1),
gen_rtx_SYMBOL_REF (Pmode, lab2)),
size, 1);
#endif
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
}
fputc ('\n', asm_out_file);
va_end (ap);
}
void
dw2_asm_output_offset VPARAMS ((int size, const char *label,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
int size;
const char *label;
const char *comment;
#endif
va_list ap;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
size = va_arg (ap, int);
label = va_arg (ap, const char *);
comment = va_arg (ap, const char *);
#endif
#ifdef UNALIGNED_INT_ASM_OP
fputs (unaligned_integer_asm_op (size), asm_out_file);
assemble_name (asm_out_file, label);
#else
assemble_integer (gen_rtx_SYMBOL_REF (Pmode, label), size, 1);
#endif
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
}
fputc ('\n', asm_out_file);
va_end (ap);
}
void
dw2_asm_output_pcrel VPARAMS ((int size, const char *label,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
int size;
const char *label;
const char *comment;
#endif
va_list ap;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
size = va_arg (ap, int);
label = va_arg (ap, const char *);
comment = va_arg (ap, const char *);
#endif
#ifdef UNALIGNED_INT_ASM_OP
fputs (unaligned_integer_asm_op (size), asm_out_file);
/* ??? This needs target conditionalization. E.g. the solaris
assembler uses %r_disp32(label). Others don't like "." and
we need to generate a temporary label here. */
assemble_name (asm_out_file, label);
fputc ('-', asm_out_file);
fputc ('.', asm_out_file);
#else
abort ();
#endif
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
}
fputc ('\n', asm_out_file);
va_end (ap);
}
void
dw2_asm_output_addr_rtx VPARAMS ((int size, rtx addr,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
int size;
rtx addr;
const char *comment;
#endif
va_list ap;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
size = va_arg (ap, int);
addr = va_arg (ap, rtx);
comment = va_arg (ap, const char *);
#endif
#ifdef UNALIGNED_INT_ASM_OP
fputs (unaligned_integer_asm_op (size), asm_out_file);
output_addr_const (asm_out_file, addr);
#else
assemble_integer (addr, size, 1);
#endif
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
}
fputc ('\n', asm_out_file);
va_end (ap);
}
void
dw2_asm_output_nstring VPARAMS ((const char *str, size_t orig_len,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
const char *str;
size_t orig_len;
const char *comment;
#endif
va_list ap;
size_t i, len = orig_len;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
str = va_arg (ap, const char *);
len = va_arg (ap, size_t);
comment = va_arg (ap, const char *);
#endif
if (len == (size_t) -1)
len = strlen (str);
if (flag_debug_asm && comment)
{
fputs ("\t.ascii \"", asm_out_file);
for (i = 0; i < len; i++)
{
int c = str[i];
if (c == '\"' || c == '\\')
fputc ('\\', asm_out_file);
if (ISPRINT(c))
fputc (c, asm_out_file);
else
fprintf (asm_out_file, "\\%o", c);
}
fprintf (asm_out_file, "\\0\"\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
fputc ('\n', asm_out_file);
}
else
{
/* If an explicit length was given, we can't assume there
is a null termination in the string buffer. */
if (orig_len == (size_t) -1)
len += 1;
ASM_OUTPUT_ASCII (asm_out_file, str, len);
if (orig_len != (size_t) -1)
fprintf (asm_out_file, "%s0\n", ASM_BYTE_OP);
}
va_end (ap);
}
/* Return the size of an unsigned LEB128 quantity. */
int
size_of_uleb128 (value)
unsigned HOST_WIDE_INT value;
{
int size = 0, byte;
do
{
byte = (value & 0x7f);
value >>= 7;
size += 1;
}
while (value != 0);
return size;
}
/* Return the size of a signed LEB128 quantity. */
int
size_of_sleb128 (value)
HOST_WIDE_INT value;
{
int size = 0, byte;
do
{
byte = (value & 0x7f);
value >>= 7;
size += 1;
}
while (!((value == 0 && (byte & 0x40) == 0)
|| (value == -1 && (byte & 0x40) != 0)));
return size;
}
/* Output an unsigned LEB128 quantity. */
void
dw2_asm_output_data_uleb128 VPARAMS ((unsigned HOST_WIDE_INT value,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
unsigned HOST_WIDE_INT value;
const char *comment;
#endif
va_list ap;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
value = va_arg (ap, unsigned HOST_WIDE_INT);
comment = va_arg (ap, const char *);
#endif
#ifdef HAVE_AS_LEB128
fputs ("\t.uleb128\t", asm_out_file);
fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, value);
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
}
#else
{
unsigned HOST_WIDE_INT work = value;
fputs (ASM_BYTE_OP, asm_out_file);
do
{
int byte = (work & 0x7f);
work >>= 7;
if (work != 0)
/* More bytes to follow. */
byte |= 0x80;
fprintf (asm_out_file, "0x%x", byte);
if (work != 0)
fputc (',', asm_out_file);
}
while (work != 0);
if (flag_debug_asm)
{
fprintf (asm_out_file, "\t%s uleb128 ", ASM_COMMENT_START);
fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, value);
if (comment)
{
fputs ("; ", asm_out_file);
vfprintf (asm_out_file, comment, ap);
}
}
}
#endif
fputc ('\n', asm_out_file);
va_end (ap);
}
/* Output an signed LEB128 quantity. */
void
dw2_asm_output_data_sleb128 VPARAMS ((HOST_WIDE_INT value,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
HOST_WIDE_INT value;
const char *comment;
#endif
va_list ap;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
value = va_arg (ap, HOST_WIDE_INT);
comment = va_arg (ap, const char *);
#endif
#ifdef HAVE_AS_LEB128
fputs ("\t.sleb128\t", asm_out_file);
fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, value);
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
}
#else
{
HOST_WIDE_INT work = value;
int more, byte;
fputs (ASM_BYTE_OP, asm_out_file);
do
{
byte = (work & 0x7f);
/* arithmetic shift */
work >>= 7;
more = !((work == 0 && (byte & 0x40) == 0)
|| (work == -1 && (byte & 0x40) != 0));
if (more)
byte |= 0x80;
fprintf (asm_out_file, "0x%x", byte);
if (more)
fputc (',', asm_out_file);
}
while (more);
if (flag_debug_asm)
{
fprintf (asm_out_file, "\t%s sleb128 ", ASM_COMMENT_START);
fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, value);
if (comment)
{
fputs ("; ", asm_out_file);
vfprintf (asm_out_file, comment, ap);
}
}
}
#endif
fputc ('\n', asm_out_file);
va_end (ap);
}
void
dw2_asm_output_delta_uleb128 VPARAMS ((const char *lab1 ATTRIBUTE_UNUSED,
const char *lab2 ATTRIBUTE_UNUSED,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
const char *lab1, *lab2;
const char *comment;
#endif
va_list ap;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
lab1 = va_arg (ap, const char *);
lab2 = va_arg (ap, const char *);
comment = va_arg (ap, const char *);
#endif
#ifdef HAVE_AS_LEB128
fputs ("\t.uleb128\t", asm_out_file);
assemble_name (asm_out_file, lab1);
fputc ('-', asm_out_file);
assemble_name (asm_out_file, lab2);
#else
abort ();
#endif
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
}
fputc ('\n', asm_out_file);
va_end (ap);
}
void
dw2_asm_output_delta_sleb128 VPARAMS ((const char *lab1 ATTRIBUTE_UNUSED,
const char *lab2 ATTRIBUTE_UNUSED,
const char *comment, ...))
{
#ifndef ANSI_PROTOTYPES
const char *lab1, *lab2;
const char *comment;
#endif
va_list ap;
VA_START (ap, comment);
#ifndef ANSI_PROTOTYPES
lab1 = va_arg (ap, const char *);
lab2 = va_arg (ap, const char *);
comment = va_arg (ap, const char *);
#endif
#ifdef HAVE_AS_LEB128
fputs ("\t.sleb128\t", asm_out_file);
assemble_name (asm_out_file, lab1);
fputc ('-', asm_out_file);
assemble_name (asm_out_file, lab2);
#else
abort ();
#endif
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
vfprintf (asm_out_file, comment, ap);
}
fputc ('\n', asm_out_file);
va_end (ap);
}

68
gcc/dwarf2asm.h Normal file
View File

@ -0,0 +1,68 @@
/* Dwarf2 assembler output helper routines.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* ??? Format checking yields "null format string" warnings, which is
the way these routines are signaled that there is no associated
debug information. So the attributes are commented out. */
extern void dw2_asm_output_data PARAMS ((int, unsigned HOST_WIDE_INT,
const char *, ...))
/* ATTRIBUTE_PRINTF_3 */;
extern void dw2_asm_output_delta PARAMS ((int, const char *,
const char *,
const char *, ...))
/* ATTRIBUTE_PRINTF_4 */;
extern void dw2_asm_output_offset PARAMS ((int, const char *,
const char *, ...))
/* ATTRIBUTE_PRINTF_3 */;
extern void dw2_asm_output_pcrel PARAMS ((int, const char *,
const char *, ...))
/* ATTRIBUTE_PRINTF_3 */;
extern void dw2_asm_output_addr_rtx PARAMS ((int, rtx,
const char *, ...))
/* ATTRIBUTE_PRINTF_3 */;
extern void dw2_asm_output_nstring PARAMS ((const char *, size_t,
const char *, ...))
/* ATTRIBUTE_PRINTF_3 */;
extern void dw2_asm_output_data_uleb128 PARAMS ((unsigned HOST_WIDE_INT,
const char *, ...))
/* ATTRIBUTE_PRINTF_2 */;
extern void dw2_asm_output_data_sleb128 PARAMS ((HOST_WIDE_INT,
const char *, ...))
/* ATTRIBUTE_PRINTF_2 */;
extern void dw2_asm_output_delta_uleb128 PARAMS ((const char *, const char *,
const char *, ...))
/* ATTRIBUTE_PRINTF_3 */;
extern void dw2_asm_output_delta_sleb128 PARAMS ((const char *, const char *,
const char *, ...))
/* ATTRIBUTE_PRINTF_3 */;
extern int size_of_uleb128 PARAMS ((unsigned HOST_WIDE_INT));
extern int size_of_sleb128 PARAMS ((HOST_WIDE_INT));

File diff suppressed because it is too large Load Diff