[Crash-utility] [PATCH] dis: Consolidate cmd_dis

Aaron Tomlin atomlin at redhat.com
Mon Jul 27 14:40:05 UTC 2015


Hi Dave,

No functionality change (hopefully). This patch is essentially a clean up
in preparation to introduce the "-f" option.

Please let me know your thoughts.

Signed-off-by: Aaron Tomlin <atomlin at redhat.com>
---
 kernel.c | 265 ++++++++++++++++++++++-----------------------------------------
 1 file changed, 91 insertions(+), 174 deletions(-)

diff --git a/kernel.c b/kernel.c
index 73d1983..3107014 100644
--- a/kernel.c
+++ b/kernel.c
@@ -1589,212 +1589,129 @@ cmd_dis(void)
 			return;
 		}
 
-		do_load_module_filter = module_symbol(req->addr, NULL, NULL, 
-			NULL, *gdb_output_radix);
+		req->command = GNU_RESOLVE_TEXT_ADDR;
+		gdb_interface(req);
+		req->flags &= ~GNU_COMMAND_FAILED;
+		if (reverse || req->flags & GNU_FUNCTION_ONLY) {
+			if (sp) {
+				savename = sp->name;
+				if ((sp = next_symbol(NULL, sp)))
+					req->addr2 = sp->value;
+				else
+					error(FATAL, 
+				"unable to determine symbol after %s\n",
+						savename);
+			} else {
+				if ((sp = value_search(req->addr, NULL))
+				     && (sp = next_symbol(NULL, sp)))
+					req->addr2 = sp->value;	
+				else 
+					error(FATAL, dis_err, req->addr);
+			}
+		}
 
-		if (!reverse) {
-			req->command = GNU_RESOLVE_TEXT_ADDR;
-			gdb_interface(req);
-                        if ((req->flags & GNU_COMMAND_FAILED) ||
-			    do_load_module_filter ||
-			    (req->flags & GNU_FUNCTION_ONLY)) {
-				req->flags &= ~GNU_COMMAND_FAILED;
-				if (sp) {
-					savename = sp->name;
-                                        if ((sp = next_symbol(NULL, sp)))
-                                                req->addr2 = sp->value;
-					else
-                                		error(FATAL, 
-				        "unable to determine symbol after %s\n",
-                                        		savename);
-				} else {
-					if ((sp = value_search(req->addr, NULL))
-                                             && (sp = next_symbol(NULL, sp)))
-						req->addr2 = sp->value;	
-					else 
-						error(FATAL, dis_err, req->addr);
-				}
-                        }
+		if (reverse) {
+			revtarget = req->addr;
+			if ((sp = value_search(revtarget, NULL)) == NULL)
+				error(FATAL, "cannot resolve address: %lx\n", revtarget);
 
-			do_machdep_filter = machdep->dis_filter(req->addr, NULL, radix);
+			sprintf(buf1, "0x%lx", revtarget);
+			req->addr = sp->value;
+		} else
 			count = 0;
-			open_tmpfile();
+		do_load_module_filter = module_symbol(req->addr, NULL, NULL, 
+			NULL, *gdb_output_radix);
+
+		do_machdep_filter = machdep->dis_filter(req->addr, NULL, radix);
+		open_tmpfile();
 #ifdef OLDWAY
-			req->command = GNU_DISASSEMBLE;
-			req->fp = pc->tmpfile;
-			gdb_interface(req);
+		req->command = GNU_DISASSEMBLE;
+		req->fp = pc->tmpfile;
+		gdb_interface(req);
 #else
-			sprintf(buf1, "x/%ldi 0x%lx",
-                                count_entered && req->count ? req->count : 
+		if (reverse)
+			sprintf(buf5, "x/%ldi 0x%lx",
+				(revtarget - req->addr) ? revtarget - req->addr : 1, 
+				req->addr);
+		else
+			sprintf(buf5, "x/%ldi 0x%lx",
+				count_entered && req->count ? req->count : 
 				req->flags & GNU_FUNCTION_ONLY ? 
 				req->addr2 - req->addr : 1, 
 				req->addr);
-        		gdb_pass_through(buf1, NULL, GNU_RETURN_ON_ERROR);
+		gdb_pass_through(buf5, NULL, GNU_RETURN_ON_ERROR);
 #endif
-			if (req->flags & GNU_COMMAND_FAILED) {
-				close_tmpfile();
-				error(FATAL, dis_err, req->addr);
-			}
+		if (req->flags & GNU_COMMAND_FAILED) {
+			close_tmpfile();
+			error(FATAL, dis_err, req->addr);
+		}
 
-        		rewind(pc->tmpfile);
-        		while (fgets(buf2, BUFSIZE, pc->tmpfile)) {
-				if (STRNEQ(buf2, "Dump of") ||
-				    STRNEQ(buf2, "End of"))
-					continue;
+		rewind(pc->tmpfile);
+		while (fgets(buf2, BUFSIZE, pc->tmpfile)) {
+			if (STRNEQ(buf2, "Dump of") ||
+			    STRNEQ(buf2, "End of"))
+				continue;
 
-				strip_beginning_whitespace(buf2);
+			strip_beginning_whitespace(buf2);
 
-				if (do_load_module_filter)
-					load_module_filter(buf2, LM_DIS_FILTER);
+			if (do_load_module_filter)
+				load_module_filter(buf2, LM_DIS_FILTER);
 
-				if (STRNEQ(buf2, "0x")) 
-					extract_hex(buf2, &curaddr, ':', TRUE);
+			if (STRNEQ(buf2, "0x")) 
+				extract_hex(buf2, &curaddr, ':', TRUE);
 
+			if (!reverse)
 				if ((req->flags & GNU_FUNCTION_ONLY) &&
 				    (curaddr >= req->addr2))
 					break;
 
-				if (do_machdep_filter)
-					machdep->dis_filter(curaddr, buf2, radix);
-
-				if (req->flags & GNU_FUNCTION_ONLY) {
-                                        if (req->flags & 
-                                            GNU_PRINT_LINE_NUMBERS) {
-                                                get_line_number(curaddr, buf3,
-                                                        FALSE);
-                                                if (!STREQ(buf3, buf4)) {
-                                                        print_verbatim(
-                                                            pc->saved_fp, buf3);
-                                                        print_verbatim(
-                                                            pc->saved_fp, "\n");
-                                                        strcpy(buf4, buf3);
-                                                }
-                                        }
-
-                			print_verbatim(pc->saved_fp, buf2); 
-					continue;
-				} else {
-					if (curaddr < req->addr) 
-						continue;
+			if (do_machdep_filter)
+				machdep->dis_filter(curaddr, buf2, radix);
 
-                			if (req->flags & 
-					    GNU_PRINT_LINE_NUMBERS) {
-                        			get_line_number(curaddr, buf3, 
-							FALSE);
-                        			if (!STREQ(buf3, buf4)) {
-                                			print_verbatim(
-							    pc->saved_fp, buf3);
-                                			print_verbatim(
-						            pc->saved_fp, "\n");
-                                			strcpy(buf4, buf3);
-                        			}
-                			} 
-
-                			print_verbatim(pc->saved_fp, buf2);
-
-					if (LASTCHAR(clean_line(buf2)) 
-						!= ':') {
-						if (++count == req->count)
-							break;
-					}
+			if (req->flags & GNU_PRINT_LINE_NUMBERS) {
+				get_line_number(curaddr, buf3,
+					FALSE);
+				if (!STREQ(buf3, buf4)) {
+					print_verbatim(
+					    pc->saved_fp, buf3);
+					print_verbatim(
+					    pc->saved_fp, "\n");
+					strcpy(buf4, buf3);
 				}
-        		}
-			close_tmpfile();
-		}
-        }
-        else if (bug_bytes_entered)
-		return;
-	else cmd_usage(pc->curcmd, SYNOPSIS);
-
-	if (!reverse) {
-		FREEBUF(req->buf);
-		FREEBUF(req);
-		return;
-	}
-
-        revtarget = req->addr;
-        if ((sp = value_search(revtarget, NULL)) == NULL)
-                error(FATAL, "cannot resolve address: %lx\n", revtarget);
-
-        sprintf(buf1, "0x%lx", revtarget);
-
-        open_tmpfile();
-
-        req->addr = sp->value;
-        req->flags |= GNU_FUNCTION_ONLY;
-        req->command = GNU_RESOLVE_TEXT_ADDR;
-        gdb_interface(req);
-        req->flags &= ~GNU_COMMAND_FAILED;
-	savename = sp->name;
-        if ((sp = next_symbol(NULL, sp)))
-                req->addr2 = sp->value;
-        else {
-		close_tmpfile();
-                error(FATAL, "unable to determine symbol after %s\n", savename);
-	}
-
-	do_machdep_filter = machdep->dis_filter(req->addr, NULL, radix);
-#ifdef OLDWAY
-	req->command = GNU_DISASSEMBLE;
-	req->fp = pc->tmpfile;
-	gdb_interface(req);
-#else
-        sprintf(buf5, "x/%ldi 0x%lx",
-        	(revtarget - req->addr) ? revtarget - req->addr : 1, 
-		req->addr);
-        gdb_pass_through(buf5, NULL, GNU_RETURN_ON_ERROR);
-#endif
-        if (req->flags & GNU_COMMAND_FAILED) {
-		close_tmpfile();
-        	error(FATAL, dis_err, req->addr);
-	}
-
-        rewind(pc->tmpfile);
-        while (fgets(buf2, BUFSIZE, pc->tmpfile)) {
-                if (STRNEQ(buf2, "Dump of") || STRNEQ(buf2, "End of"))
-                	continue;
+			}
 
-		strip_beginning_whitespace(buf2);
+			print_verbatim(pc->saved_fp, buf2); 
+			if (reverse) {
+				if (STRNEQ(buf2, buf1)) {
+					if (LASTCHAR(clean_line(buf2)) != ':') 
+						break;
 
-                if (do_load_module_filter)
-                        load_module_filter(buf2, LM_DIS_FILTER);
+					ret = fgets(buf2, BUFSIZE, pc->tmpfile);
 
-                if (STRNEQ(buf2, "0x"))
-                	extract_hex(buf2, &curaddr, ':', TRUE);
+					if (do_load_module_filter)
+						load_module_filter(buf2, LM_DIS_FILTER);
 
-		if (do_machdep_filter)
-			machdep->dis_filter(curaddr, buf2, radix);
+					if (do_machdep_filter) 
+						machdep->dis_filter(curaddr, buf2, radix);
 
-		if (req->flags & GNU_PRINT_LINE_NUMBERS) {
-			get_line_number(curaddr, buf3, FALSE);
-			if (!STREQ(buf3, buf4)) {
-				print_verbatim(pc->saved_fp, buf3);
-				print_verbatim(pc->saved_fp, "\n");
-				strcpy(buf4, buf3);
+					print_verbatim(pc->saved_fp, buf2);
+					break;
+				}
 			}
-		}
 
-                print_verbatim(pc->saved_fp, buf2);
-                if (STRNEQ(buf2, buf1)) {
-                	if (LASTCHAR(clean_line(buf2)) != ':') 
-                        	break;
-
-        		ret = fgets(buf2, BUFSIZE, pc->tmpfile);
-
-                	if (do_load_module_filter)
-                        	load_module_filter(buf2, LM_DIS_FILTER);
-
-			if (do_machdep_filter) 
-				machdep->dis_filter(curaddr, buf2, radix);
-
-                	print_verbatim(pc->saved_fp, buf2);
-			break;
+			if (count_entered && LASTCHAR(clean_line(buf2)) != ':')
+				if (++count == req->count)
+					break;
 		}
+		close_tmpfile();
         }
+        else if (bug_bytes_entered)
+		return;
+	else cmd_usage(pc->curcmd, SYNOPSIS);
 
-        close_tmpfile();
 	FREEBUF(req->buf);
 	FREEBUF(req);
+	return;
 }
 
 /*
-- 
2.4.3




More information about the Crash-utility mailing list