47 #ifndef USE_STANDARD_TYPES
48 # define USE_STANDARD_TYPES
53 #ifdef OWN_ERROR_PACKAGE
58 #define Is_True(x,y) (0)
59 #define ERRORS_INCLUDED
77 #define USE_DST_INTERNALS
88 #if defined(BACK_END) || defined(BUILD_WNPREFETCH)
103 #define DOUBLE_ALIGNED(sz) (((sz) % 8) == 0 ? (sz) : (sz)+(8-((sz)%8)))
104 #define ERROR_VALUE -1
108 #if defined(Is_True_On) || defined(DEBUG_IR)
115 printf(
"last_node at %p, opcode = %s\n",
121 #define ERROR_RETURN Error_Return_Func()
123 #define ERROR_RETURN ERROR_VALUE
127 template <
class Shdr>
131 for (
INT i = 1; i <
n; ++i) {
132 if (shdr[i].sh_type == type && shdr[i].sh_info == info)
142 if (handle == 0 || handle == (
void *)(
ERROR_VALUE)) {
151 #ifndef __ALWAYS_USE_64BIT_ELF__
155 ((
char *) handle + ehdr->
e_shoff);
164 ((
char *) handle + eh->
e_shoff);
179 #if defined(Is_True_On) || defined(DEBUG_IR)
180 #define CHECK_INPUT_FILES
183 #ifdef CHECK_INPUT_FILES
185 #define CONVERT_OFFSET(typ, fld) \
186 if ((INTPTR)(fld) >= size) return ERROR_RETURN; \
187 else (fld) = (typ)(base + (INTPTR)(fld))
191 #define CONVERT_OFFSET(typ, fld) \
192 (fld) = (typ)(base + (INTPTR)(fld))
194 #endif // CHECK_INPUT_FILES
209 const char *base = (
char *) handle + shdr.
offset;
216 if (gsymtab->size <
sizeof(gsymtab) ||
222 if (gsymtab->header[i].offset + gsymtab->header[i].size > size)
227 const char *addr = base + hdr.
offset;
311 const char *base = (
char *) handle + shdr.
offset +
317 if (lsymtab->
size <
sizeof(lsymtab) ||
332 const char *addr = base + hdr.
offset;
403 #if defined(Is_True_On) || defined(DEBUG_IR)
415 #if defined(BACK_END)
425 if (wn == (
WN *) -1) {
441 register WN **wn_ptr;
444 wn_ptr = &
WN_kid(node, 0);
445 for (i = 0; i < cnt; i++, wn_ptr++) {
447 if (wn == (
WN *) -1) {
460 if (wn == (
WN *) -1) {
467 if (wn == (
WN *) -1) {
479 register INT32 *last_id_ptr;
482 if (map_id > *last_id_ptr) {
483 *last_id_ptr = map_id;
503 typename ELF::Elf_Ehdr* ehdr = (
typename ELF::Elf_Ehdr*) baseaddr;
508 if (ehdr->e_type !=
ET_IR
509 || ehdr->e_shentsize !=
sizeof(
typename ELF::Elf_Shdr)) {
521 if (ehdr->e_shstrndx >= ehdr->e_shnum) {
524 if (ehdr->e_shoff >= size ||
525 ehdr->e_shoff + ehdr->e_shnum *
sizeof(
typename ELF::Elf_Shdr) > size) {
528 typename ELF::Elf_Shdr* shdr =
529 (
typename ELF::Elf_Shdr *) (baseaddr + ehdr->e_shoff);
530 if ((
long) shdr & (
ALIGNOF(
typename ELF::Elf_Shdr) - 1)) {
533 return tag.Elf_class();
548 #ifndef __ALWAYS_USE_64BIT_ELF__
563 typename ELF::Elf_Ehdr* ehdr = (
typename ELF::Elf_Ehdr*) baseaddr;
564 typename ELF::Elf_Shdr* shdr =
565 (
typename ELF::Elf_Shdr*) (baseaddr + ehdr->e_shoff);
569 if (shdr[ehdr->e_shstrndx].sh_offset >= size ||
570 shdr[ehdr->e_shstrndx].sh_offset +
571 shdr[ehdr->e_shstrndx].sh_size > size)
574 char* shstrtab = baseaddr + shdr[ehdr->e_shstrndx].sh_offset;
576 for (
INT i = 1; i < ehdr->e_shnum; i++) {
577 if (shdr[i].sh_offset >= size ||
578 shdr[i].sh_offset + shdr[i].sh_size > size)
580 if (shdr[i].sh_name >= shdr[ehdr->e_shstrndx].sh_size)
582 if (shdr[i].sh_link >= ehdr->e_shnum)
584 if (shdr[i].sh_addralign & (shdr[i].sh_addralign - 1))
586 if (shdr[i].sh_addralign > 1 &&
587 (
long)(baseaddr + shdr[i].sh_offset) & ((shdr[i].sh_addralign - 1)))
592 strcmp (shstrtab + shdr[i].sh_name,
ELF_COMMENT) == 0) {
593 register char *p = baseaddr + shdr[i].sh_offset;
594 register char *eob = p + shdr[i].sh_size - 1;
595 register int match = 0;
602 if (strncmp (
"WHIRL:", p, 6) == 0) {
603 strcpy (file_revision, p);
624 register char **argv;
641 *argv = base + offset;
658 #ifndef __ALWAYS_USE_64BIT_ELF__
681 struct stat stat_buf;
682 register char *map_addr;
684 fd = open (filename, O_RDONLY);
688 if (fstat (fd, &stat_buf) != 0)
691 map_addr = (
char *) mmap (0, stat_buf.st_size, PROT_READ|PROT_WRITE,
701 file_revision)) <= 0) {
702 munmap (map_addr, stat_buf.st_size);
703 return (
void *) (st);
707 *mapped_size = stat_buf.st_size;
717 if (shdr.
offset == 0)
return 0;
751 if (file_name == 0) {
758 return read_file (file_name, mapped_size, file_revision);
779 base = (
char *) handle + shdr.
offset;
799 base = (
char *) handle + shdr.
offset;
838 register char *section_base, *tree_base;
855 if (offset + size > shdr.
size) {
860 section_base = (
char *) handle + shdr.
offset;
861 tree_base = section_base + offset;
865 wn = (
WN *) (tree_base + first_node);
904 if (shdr.
offset == 0)
return 0;
906 baseaddr = (
char *) handle + shdr.
offset;
910 *argv = (
char **) (baseaddr +
sizeof(
Elf64_Word));
926 char *base, *ptr, *blk;
932 base = (
char *) handle + shdr.
offset;
936 ptr = base + size -
sizeof(
mINT32);
937 num_blocks = *(
INT32*) ptr;
939 ptr -= (num_blocks *
sizeof(block_header));
942 FOREACH_DST_BLOCK(j) {
943 blk = ((DST_Type *)
Current_DST)->dst_blocks[j].offset;
944 if (blk == (
char *)-1) {
948 ((DST_Type *)
Current_DST)->dst_blocks[j].offset = blk;
956 #if defined(BACK_END) || defined(IR_TOOLS)
980 if (offset + size >= shdr.
size) {
996 #if defined(BACK_END) || defined(BUILD_WNPREFETCH)
1002 char *cur_addr, *end_addr, *tree_base;
1020 if (offset + size >= shdr.
size) {
1026 tree_base = (
char *) handle + shdr.
offset +
1029 cur_addr = (
char *)handle + shdr.
offset + offset;
1030 end_addr = cur_addr + size;
1044 node = (
WN *)(tree_base + node_offset);
1091 template<
class MAP_ENTRY_TYPE>
1095 INT32 subsection_type,
1101 char *cur_addr, *end_addr, *tree_base;
1118 if (offset + size >= shdr.
size) {
1124 tree_base = (
char *) handle + shdr.
offset +
1127 cur_addr = (
char *)handle + shdr.
offset + offset;
1128 end_addr = cur_addr + size;
1131 MAP_ENTRY_TYPE map_value;
1141 cur_addr = (
char *)
ir_b_align ((off_t) cur_addr,
1142 sizeof(MAP_ENTRY_TYPE),
1144 map_value = * (MAP_ENTRY_TYPE *) cur_addr;
1145 cur_addr +=
sizeof(MAP_ENTRY_TYPE);
1147 node = (
WN *) (tree_base + node_offset);
1153 if (cur_addr > end_addr)
1166 INT32 subsection_type,
1170 value_map, (
INT32) 0);
1176 INT32 subsection_type,
1180 value_map, (
void *) 0);
1194 if (handle == 0 || handle == (
void *)(-1))
1198 munmap ((
char*)handle, mapped_size);
1202 #ifndef OWN_ERROR_PACKAGE
1215 void **fhandle, off_t *mapped_size)
1218 *ir_input = input_file;
1225 "abi of whirl file doesn't match abi from command-line",
1289 if (pu_tree == (
PU_Info *)-1) {
1293 printf(
"done reading global info\n");
1330 #if defined(BACK_END) || defined(BUILD_WNPREFETCH)