--- ./dwarfinfo/dwarfdump.c.org	2006-09-07 17:39:11.000000000 +0900
+++ ./dwarfinfo/dwarfdump.c	2006-09-07 17:41:00.000000000 +0900
@@ -50,8 +50,6 @@ $Header: /plroot/cmplrs.src/v7.4.5m/.RCS
 #include "dwarf_incl.h"
 extern char *optarg;
 
-#define COMPLETED 0
-#define FAILED 1
 #define BYTES_PER_INSTRUCTION 4
 
 static void print_infos(Dwarf_Debug dbg);
@@ -134,15 +132,15 @@ dwarfinfo()
 
     if (setjmp(jmpbuf)) {
 	if (check_error)
-	    return FAILED;
+	    return FALSE;
 	else
-	    return COMPLETED;
+	    return TRUE;
     }
 
     (void) elf_version(EV_NONE);
     if (elf_version(EV_CURRENT) == EV_NONE) {
 	(void) fprintf(stderr, "%s: libelf.a out of date.\n", CMDNAME);
-	return FAILED;
+	return FALSE;
     }
 
 #ifdef DEBUG
@@ -152,7 +150,7 @@ dwarfinfo()
     if (dwarf_info.vmlinux_fd == -1) {
 	fprintf(stderr, "Can't open %s\n",
 		file_name);
-	return (FAILED);
+	return (TRUE);
     }
 #endif
 
@@ -195,9 +193,9 @@ dwarfinfo()
 	write (1, &dwarf_info, sizeof(struct dwarf_info));
 #endif
     if (check_error)
-	return FAILED;
+	return FALSE;
     else
-	return COMPLETED;
+	return TRUE;
 }
 
 /*
--- ./makedumpfile.h.org	2006-09-07 17:28:13.000000000 +0900
+++ ./makedumpfile.h	2006-09-07 17:36:59.000000000 +0900
@@ -145,6 +145,33 @@ isAnon(unsigned long mapping)
 #define SYMBOL(X)		(symbol_table.X)
 
 /*
+ * for structure
+ */
+#define NOT_FOUND_STRUCTURE	(-1)
+#define FAILED_DWARFINFO	(-2)
+#define SIZE(X)			(size_table.X)
+#define OFFSET(X)		(offset_table.X)
+#define GET_STRUCTURE_SIZE	get_structure_size
+#define GET_MEMBER_OFFSET	get_member_offset
+#define SIZE_INIT(X, Y, F) \
+do { \
+	if ((SIZE(X) = GET_STRUCTURE_SIZE(Y, F)) == FAILED_DWARFINFO) \
+		return FALSE; \
+} while (0)
+#define OFFSET_INIT(X, Y, Z, F) \
+do { \
+	if ((OFFSET(X) = GET_MEMBER_OFFSET(Y, Z, DWARF_INFO_MAX, F)) \
+	     == FAILED_DWARFINFO) \
+		return FALSE; \
+} while (0)
+#define OFFSET_INIT_NONAME(X, Y, S, F) \
+do { \
+	if ((OFFSET(X) = (GET_MEMBER_OFFSET(Y, NULL, 0, F) + S)) \
+	     == FAILED_DWARFINFO) \
+		return FALSE; \
+} while (0)
+
+/*
  * kernel version
  */
 #define VERSION_2_6_15		(15)
@@ -206,10 +233,6 @@ struct cache_data {
 
 struct DumpInfo {
 	int		retcd;		     /* return code */
-	int		size_pagedesc;       /* size of page descriptor */
-	int		offset_page_flags;   /* offset of page.flags */
-	int		offset_page__count;  /* offset of page._count */
-	int		offset_page_mapping; /* offset of page.mapping */
 	unsigned long	addr_mem_map;        /* address of symbol mem_map */
 	int		kernel_version;      /* version of first kernel */
 
@@ -281,3 +304,14 @@ struct symbol_table {
 	unsigned long	system_utsname;
 };
 
+struct size_table {
+	long	page;
+};
+
+struct offset_table {
+	struct page {
+		long	flags;
+		long	_count;
+		long	mapping;
+	} page;
+};
--- ./makedumpfile.c.org	2006-09-07 17:28:09.000000000 +0900
+++ ./makedumpfile.c	2006-09-07 17:38:24.000000000 +0900
@@ -25,6 +25,8 @@
 #include "makedumpfile.h"
 
 struct symbol_table	symbol_table;
+struct size_table	size_table;
+struct offset_table	offset_table;
 
 /*
  *  Strip line-ending linefeeds in a string.
@@ -751,51 +753,63 @@ get_symbol_info(struct DumpInfo *info)
 	return TRUE;
 }
 
-int
-get_pagedesc_offset(struct DumpInfo *info)
+/*
+ * Get the size of structure.
+ */
+long
+get_structure_size(char *structname, char *filename)
 {
-	int i;
+	dwarf_info.status = 0;
+	dwarf_info.struct_name = structname;
+	dwarf_info.file_name = filename;
+	dwarf_info.struct_size = NOT_FOUND_STRUCTURE;
+	dwarf_info.no_of_member = 0;
+	dwarf_info.cur_member = DWARF_INFO_MAX;
+
+	if (!dwarfinfo())
+		return FAILED_DWARFINFO;
+
+	return dwarf_info.struct_size;
+}
+
+/*
+ * Get the offset of member.
+ */
+long
+get_member_offset(char *structname, char *membername, int location_member,
+char *filename)
+{
+	dwarf_info.status = 0;
+	dwarf_info.struct_name = structname;
+	dwarf_info.file_name = filename;
+	dwarf_info.struct_size = NOT_FOUND_STRUCTURE;
+	dwarf_info.no_of_member = 1;
+ 	dwarf_info.cur_member = DWARF_INFO_MAX;
+	dwarf_info.member[0].name = membername;
+	dwarf_info.member[0].offset = NOT_FOUND_STRUCTURE;
+	dwarf_info.location_member = location_member;
+
+	if (!dwarfinfo())
+		return FAILED_DWARFINFO;
 
+	return dwarf_info.member[0].offset;
+}
+
+int
+get_structure_info(struct DumpInfo *info)
+{
 	/*
 	 * Get offsets of the page_discriptor's members.
 	 */
+	SIZE_INIT(page, "page", "mm.h");
+	OFFSET_INIT(page.flags, "page", "flags", "mm.h");
+	OFFSET_INIT(page._count, "page", "_count", "mm.h");
 
-	dwarf_info.status = 0;
-	dwarf_info.struct_name = "page";
-	dwarf_info.file_name = "mm.h";
-	dwarf_info.struct_size = 0;
-	dwarf_info.no_of_member = 3;
-	dwarf_info.cur_member = DWARF_INFO_MAX;
-	dwarf_info.member[0].name = "flags";
-	dwarf_info.member[0].offset = -1;
-	dwarf_info.member[1].name = "_count";
-	dwarf_info.member[1].offset = -1;
-	if (info->kernel_version == VERSION_2_6_15) { /* linux-2.6.15 */
-		dwarf_info.location_member = DWARF_INFO_MAX;
-		dwarf_info.member[2].name = "mapping";
-		dwarf_info.member[2].offset = -1;
-	} else {
-		dwarf_info.location_member = 2;
-		dwarf_info.member[2].name = NULL; /* has no name */
-		dwarf_info.member[2].offset = -1;
-	}
-	if (dwarfinfo())
-		return FALSE;
-	for (i = 0; i < dwarf_info.no_of_member; i++)
-		if (dwarf_info.member[i].offset == -1)
-			return FALSE;
-
-	info->size_pagedesc = dwarf_info.struct_size;
-	info->offset_page_flags  = dwarf_info.member[0].offset;
-	info->offset_page__count = dwarf_info.member[1].offset;
-	if (info->kernel_version == VERSION_2_6_15) { /* linux-2.6.15 */
-		/* 'mapping' found. For linux-2.6.15. */
-		info->offset_page_mapping = dwarf_info.member[2].offset;
-	} else {
-		/* 'mapping' is in union. For linux-2.6.16 or after. */
-		info->offset_page_mapping = dwarf_info.member[2].offset
-		+ sizeof(unsigned long);
-	}
+	if (info->kernel_version == VERSION_2_6_15)
+		OFFSET_INIT(page.mapping, "page", "mapping", "mm.h");
+	else
+		OFFSET_INIT_NONAME(page.mapping, "page",
+		   sizeof(unsigned long), "mm.h");
 
 	return TRUE;
 }
@@ -859,28 +873,28 @@ generate_config(struct DumpInfo *info)
 	/*
 	 * write 1st kernel's size of struct page
 	 */
-	if (!get_pagedesc_offset(info))
+	if (!get_structure_info(info))
 		return FALSE;
-	fprintf(info->file_configfile, "%s%d\n", STR_SIZE("page"),
-	    info->size_pagedesc);
+	fprintf(info->file_configfile, "%s%ld\n", STR_SIZE("page"),
+	    SIZE(page));
 
 	/*
 	 * write 1st kernel's offset of page.flags
 	 */
-	fprintf(info->file_configfile, "%s%d\n", STR_OFFSET("page.flags"),
-	    info->offset_page_flags);
+	fprintf(info->file_configfile, "%s%ld\n", STR_OFFSET("page.flags"),
+	    OFFSET(page.flags));
 
 	/*
 	 * write 1st kernel's offset of page._count
 	 */
-	fprintf(info->file_configfile, "%s%d\n", STR_OFFSET("page._count"),
-	    info->offset_page__count);
+	fprintf(info->file_configfile, "%s%ld\n", STR_OFFSET("page._count"),
+	    OFFSET(page._count));
 
 	/*
 	 * write 1st kernel's offset of page.mapping
 	 */
-	fprintf(info->file_configfile, "%s%d\n", STR_OFFSET("page.mapping"),
-	    info->offset_page_mapping);
+	fprintf(info->file_configfile, "%s%ld\n", STR_OFFSET("page.mapping"),
+	    OFFSET(page.mapping));
 
 	return TRUE;
 }
@@ -948,7 +962,7 @@ read_config(struct DumpInfo *info)
 					info->name_configfile, buf);
 				return FALSE;
 			}
-			info->size_pagedesc = tmp_ulong;
+			SIZE(page) = tmp_ulong;
 		}
 		if (strncmp(buf, STR_OFFSET("page.flags"), strlen(STR_OFFSET("page.flags"))) == 0) {
 			tmp_ulong = strtoul(buf + strlen(STR_OFFSET("page.flags")),
@@ -959,7 +973,7 @@ read_config(struct DumpInfo *info)
 					info->name_configfile, buf);
 				return FALSE;
 			}
-			info->offset_page_flags = tmp_ulong;
+			OFFSET(page.flags) = tmp_ulong;
 		}
 		if (strncmp(buf, STR_OFFSET("page._count"), strlen(STR_OFFSET("page._count"))) == 0) {
 			tmp_ulong = strtoul(buf + strlen(STR_OFFSET("page._count")),
@@ -970,7 +984,7 @@ read_config(struct DumpInfo *info)
 					info->name_configfile, buf);
 				return FALSE;
 			}
-			info->offset_page__count = tmp_ulong;
+			OFFSET(page._count) = tmp_ulong;
 		}
 		if (strncmp(buf, STR_OFFSET("page.mapping"), strlen(STR_OFFSET("page.mapping"))) == 0) {
 			tmp_ulong = strtoul(buf + strlen(STR_OFFSET("page.mapping")),
@@ -981,7 +995,7 @@ read_config(struct DumpInfo *info)
 					info->name_configfile, buf);
 				return FALSE;
 			}
-			info->offset_page_mapping = tmp_ulong;
+			OFFSET(page.mapping) = tmp_ulong;
 		}
 	}
 	if (!ok_flag || !info->page_size) {
@@ -1033,7 +1047,7 @@ initial(struct DumpInfo *info)
 			return FALSE;
 		if (!check_release(info))
 			return FALSE;
-		if (!get_pagedesc_offset(info))
+		if (!get_structure_info(info))
 			return FALSE;
 	} else {
 		if (!read_config(info))
@@ -1346,7 +1360,7 @@ create_dump_bitmap(struct DumpInfo *info
 		goto out;
 	}
 	if (info->dump_level > DL_EXCLUDE_ZERO &&
-	    (page_cache = g_malloc(info->size_pagedesc*PGMM_CACHED)) == NULL) {
+	    (page_cache = g_malloc(SIZE(page)*PGMM_CACHED)) == NULL) {
 		ERRMSG("Can't allocate memory for the pagedesc cache. %s\n",
 		    strerror(errno));
 		goto out;
@@ -1358,7 +1372,7 @@ create_dump_bitmap(struct DumpInfo *info
 	}
 
 	for (pfn = 0, paddr = 0; pfn < info->max_mapnr;
-	    pfn++, addr_mem_map += info->size_pagedesc,
+	    pfn++, addr_mem_map += SIZE(page),
 	    paddr += info->page_size) {
 
 		if ((pfn != 0) && (pfn%PFN_BUFBITMAP) == 0) {
@@ -1431,13 +1445,13 @@ create_dump_bitmap(struct DumpInfo *info
 
 		if ((pfn % PGMM_CACHED) == 0) {
 			if (!readmem(info, addr_mem_map, page_cache,
-			    info->size_pagedesc * PGMM_CACHED))
+			    SIZE(page) * PGMM_CACHED))
 				goto out;
 		}
-		pcache = page_cache + ((pfn%PGMM_CACHED) * info->size_pagedesc);
-		flags   = ULONG(pcache + info->offset_page_flags);
-		_count  = UINT(pcache + info->offset_page__count);
-		mapping = ULONG(pcache + info->offset_page_mapping);
+		pcache  = page_cache + ((pfn%PGMM_CACHED) * SIZE(page));
+		flags   = ULONG(pcache + OFFSET(page.flags));
+		_count  = UINT(pcache + OFFSET(page._count));
+		mapping = ULONG(pcache + OFFSET(page.mapping));
 
 		/*
 		 * Exclude the cache page without the private page.
