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:
parent
dc76f41ca6
commit
2e4b9b8cc2
|
@ -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.
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]"
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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));
|
1478
gcc/dwarf2out.c
1478
gcc/dwarf2out.c
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue