Index: gtags/gtags.c
===================================================================
RCS file: /sources/global/global/gtags/gtags.c,v
retrieving revision 1.211
diff -u -p -r1.211 gtags.c
--- gtags/gtags.c	9 Aug 2007 15:43:03 -0000	1.211
+++ gtags/gtags.c	1 Apr 2008 16:50:48 -0000
@@ -697,8 +697,6 @@ updatetags(const char *dbpath, const cha
 		xp->put_gpath = 1;
 		if (vflag)
 			xp->verbose = verbose_updatetags;
-		if (db == GSYMS)
-			xp->skip_assembly = 1;
 		while ((ctags_x = xargs_read(xp)) != NULL) {
 			strlimcpy(tag, strmake(ctags_x, " \t"), sizeof(tag));
 			/*
@@ -796,8 +794,6 @@ createtags(const char *dbpath, const cha
 	xp->put_gpath = 1;
 	if (vflag)
 		xp->verbose = verbose_createtags;
-	if (db == GSYMS)
-		xp->skip_assembly = 1;
 	while ((ctags_x = xargs_read(xp)) != NULL) {
 		char tag[MAXTOKEN], *p;
 
Index: gtags/manual.in
===================================================================
RCS file: /sources/global/global/gtags/manual.in,v
retrieving revision 1.63
diff -u -p -r1.63 manual.in
--- gtags/manual.in	25 Mar 2008 14:59:58 -0000	1.63
+++ gtags/manual.in	1 Apr 2008 16:50:48 -0000
@@ -172,8 +172,6 @@
 	Probably valid only for FreeBSD and Linux kernel source.
 
 	There is no concurrency control about tag files.
-
-	Symbols in Assembly source files are not extracted for @file{GSYMS}.
 @AUTHOR
 	Tama Communications Corporation.
 @HISTORY
Index: gtags-parser/asm_parse.y
===================================================================
RCS file: /sources/global/global/gtags-parser/asm_parse.y,v
retrieving revision 1.10
diff -u -p -r1.10 asm_parse.y
--- gtags-parser/asm_parse.y	18 Mar 2008 03:48:23 -0000	1.10
+++ gtags-parser/asm_parse.y	1 Apr 2008 16:50:48 -0000
@@ -49,13 +49,12 @@
 int yylex(void);
 void asm_initscan(void);
 
+int asm_target;
 const char *asm_input_file;
 STRBUF *asm_symtable;
 
 static void yyerror(const char *);
 
-static int target;
-
 %}
 
 %token ASM_CONST		/* number, string, character */
@@ -84,19 +83,19 @@ input:	/* empty */
 
 line:	ASM_ENTRY '(' ASM_SYMBOL ')' error '\n'
 		{
-			if (target == REF) {
+			if (asm_target == REF) {
 				char *sym = GET_SYM($1);
 
 				if (defined(sym))
 					PUT(sym, @1);
 			}
-			if (target == DEF)
+			if (asm_target == DEF)
 				PUT(GET_SYM($3), @3);
 			strbuf_reset(asm_symtable);
 		}
 	| ASM_CALL ASM_SYMBOL error '\n'
 		{
-			if (target == REF) {
+			if (asm_target == REF) {
 				char *sym = GET_SYM($2);
 
 				if (sym[0] == '_') {
@@ -111,7 +110,7 @@ line:	ASM_ENTRY '(' ASM_SYMBOL ')' error
 		}
 	| ASM_CALL ASM_EXT '(' ASM_SYMBOL ')' error '\n'
 		{
-			if (target == REF) {
+			if (asm_target == REF) {
 				char *sym;
 
 				sym = GET_SYM($2);
@@ -126,37 +125,37 @@ line:	ASM_ENTRY '(' ASM_SYMBOL ')' error
 		}
 	| "#define" ASM_SYMBOL error '\n'
 		{
-			if (target == DEF)
+			if (asm_target == DEF)
 				PUT(GET_SYM($2), @2);
 			strbuf_reset(asm_symtable);
 		}
 	| "#undef" ASM_SYMBOL error '\n'
 		{
-			if (target == DEF)
+			if (asm_target == DEF)
 				PUT(GET_SYM($2), @2);
 			strbuf_reset(asm_symtable);
 		}
 	| ASM_MACRO ASM_SYMBOL error '\n'
 		{
-			if (target == DEF)
+			if (asm_target == DEF)
 				PUT(GET_SYM($2), @2);
 			strbuf_reset(asm_symtable);
 		}
 	| ASM_LABEL ASM_MACRO error '\n'
 		{
-			if (target == DEF)
+			if (asm_target == DEF)
 				PUT(GET_SYM($1), @1);
 			strbuf_reset(asm_symtable);
 		}
 	| ASM_EQU ASM_SYMBOL ',' error '\n'
 		{
-			if (target == DEF)
+			if (asm_target == DEF)
 				PUT(GET_SYM($2), @2);
 			strbuf_reset(asm_symtable);
 		}
 	| ASM_LABEL ASM_EQU error '\n'
 		{
-			if (target == DEF)
+			if (asm_target == DEF)
 				PUT(GET_SYM($1), @1);
 			strbuf_reset(asm_symtable);
 		}
@@ -169,10 +168,7 @@ line:	ASM_ENTRY '(' ASM_SYMBOL ')' error
 void
 assembly(const char *file)
 {
-	/* symbol search doesn't supported. */
-	if (sflag)
-		return;
-	target = (rflag) ? REF : DEF;
+	asm_target = sflag ? SYM : rflag ? REF : DEF;
 
 	if (linetable_open(file) == -1)
 		die("'%s' cannot open.", file);
Index: gtags-parser/asm_scan.l
===================================================================
RCS file: /sources/global/global/gtags-parser/asm_scan.l,v
retrieving revision 1.12
diff -u -p -r1.12 asm_scan.l
--- gtags-parser/asm_scan.l	10 Mar 2008 12:52:15 -0000	1.12
+++ gtags-parser/asm_scan.l	1 Apr 2008 16:50:48 -0000
@@ -32,6 +32,7 @@
 
 #include "asm_parse.h"
 #include "asm_res.h"
+#include "defined.h"
 #include "die.h"
 #include "gctags.h"
 #include "linetable.h"
@@ -56,9 +57,20 @@
 	strbuf_puts0(asm_symtable, LEXTEXT);				\
 } while (0)
 
+#undef PUT
+#define PUT() do {							\
+	if (!nflag) {							\
+		printf("%-16s %4d %-16s ", LEXTEXT, LEXLINENO, asm_input_file);	\
+		linetable_print(stdout, LEXLINENO);			\
+	}								\
+} while (0)
+
+extern int asm_target;
 extern const char *asm_input_file;
 extern STRBUF *asm_symtable;
 
+static int last_directive;
+
 %}
 
 H		0[Xx][0-9A-Fa-f]+
@@ -126,17 +138,28 @@ WORD		{ALPHA}{ALPHANUM}*
 {NUMBER}	{ return ASM_CONST; }
 
 <INITIAL>{
-	^[ \t]*\#[ \t]*define	{ yy_push_state(PREPROCESSOR_LINE); return ASM_DEFINE; }
-	^[ \t]*\#[ \t]*undef	{ yy_push_state(PREPROCESSOR_LINE); return ASM_UNDEF; }
 	^[ \t]*\#[ \t]*{WORD} {
-		if (asm_reserved_sharp(LEXTEXT, LEXLENG)) {
+		last_directive = asm_reserved_sharp(LEXTEXT, LEXLENG);
+		switch (last_directive) {
+		case 0:
+			yy_push_state(CPP_COMMENT);
+			break;
+		case SHARP_DEFINE:
+			yy_push_state(PREPROCESSOR_LINE);
+			return ASM_DEFINE;
+		case SHARP_UNDEF:
+			yy_push_state(PREPROCESSOR_LINE);
+			return ASM_UNDEF;
+		default:
 			yy_push_state(PREPROCESSOR_LINE);
 			return ASM_DIRECTIVE;
-		} else {
-			yy_push_state(CPP_COMMENT);
 		}
 	}
-	^[ \t]*\#		{ yy_push_state(PREPROCESSOR_LINE); return ASM_DIRECTIVE; }
+	^[ \t]*\# {
+		last_directive = 0;
+		yy_push_state(PREPROCESSOR_LINE);
+		return ASM_DIRECTIVE;
+	}
 	call|jsr	{ return ASM_CALL; }
 	\.macro|macro	{ return ASM_MACRO; }
 	\.equ|equ	{ return ASM_EQU; }
@@ -152,6 +175,28 @@ WORD		{ALPHA}{ALPHANUM}*
 }
 
 <PREPROCESSOR_LINE>{
+	{WORD} {
+		switch (last_directive) {
+		case SHARP_IF:
+		case SHARP_ELIF:
+			if (strcmp(LEXTEXT, "defined") == 0)
+				break;
+			/* FALLTHROUGH */
+		case SHARP_IFDEF:
+		case SHARP_IFNDEF:
+			if (asm_target == REF) {
+				if (defined(LEXTEXT))
+					PUT();
+			} else if (asm_target == SYM) {
+				if (!defined(LEXTEXT))
+					PUT();
+			}
+			break;
+		default:
+			ADD_SYM();
+			return ASM_SYMBOL;
+		}
+	}
 	\n		{ yy_pop_state(); return '\n'; }
 }
 
