diff --git a/tcc.h b/tcc.h
index 52baf581..a0b4894e 100644
--- a/tcc.h
+++ b/tcc.h
@@ -326,7 +326,6 @@
 typedef struct TokenSym {
     struct TokenSym *hash_next;
     struct Sym *sym_define; /* direct pointer to define */
-    struct Sym *sym_define_stack; /* direct pointer to a push_macro stack */
     struct Sym *sym_label; /* direct pointer to label */
     struct Sym *sym_struct; /* direct pointer to structure */
     struct Sym *sym_identifier; /* direct pointer to identifier */
diff --git a/tccasm.c b/tccasm.c
index f67c1a65..87ec1757 100644
--- a/tccasm.c
+++ b/tccasm.c
@@ -305,9 +305,6 @@ static void asm_free_labels(TCCState *st)
         }
         /* remove label */
         table_ident[s->v - TOK_IDENT]->sym_label = NULL;
-        if (s->asm_label) {
-            tcc_free(s->asm_label);
-        }
         sym_free(s);
     }
     st->asm_labels = NULL;
diff --git a/tccgen.c b/tccgen.c
index 103c955f..5275b47b 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -152,6 +152,7 @@ static inline Sym *sym_malloc(void)
 ST_INLN void sym_free(Sym *sym)
 {
     sym->next = sym_free_first;
+    tcc_free(sym->asm_label);
     sym_free_first = sym;
 }
 
diff --git a/tccpp.c b/tccpp.c
index b26dbeec..77d40d56 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -222,7 +222,6 @@ static TokenSym *tok_alloc_new(TokenSym **pts, const char *str, int len)
     table_ident[i] = ts;
     ts->tok = tok_ident++;
     ts->sym_define = NULL;
-    ts->sym_define_stack = NULL;
     ts->sym_label = NULL;
     ts->sym_struct = NULL;
     ts->sym_identifier = NULL;
@@ -1447,37 +1446,6 @@ static void pragma_parse(TCCState *s1)
         } else {
             tcc_warning("#pragma comment(lib) is ignored");
         }
-    } else if ((tok == TOK_push_macro) || (tok == TOK_pop_macro)) {
-            int push_macro = (tok == TOK_push_macro);
-            next();
-            skip('(');
-            if (tok != TOK_STR) {
-                expect("\"");
-            } else {
-                int len = strlen((char *)tokc.cstr->data);
-                tcc_open_bf(s1, "<push_pop_macro>", len);
-                memcpy(file->buffer, tokc.cstr->data, len);
-                ch = file->buf_ptr[0];
-                next_nomacro();
-                if (tok >= TOK_IDENT) {
-                    Sym *s = table_ident[tok - TOK_IDENT]->sym_define;
-                    Sym *ss = table_ident[tok - TOK_IDENT]->sym_define_stack;
-                    if (push_macro) {
-                        if (s) {
-                            s->prev_tok = ss;
-                            table_ident[tok - TOK_IDENT]->sym_define_stack = s;
-                        }
-                    } else {
-                        if (ss) {
-                            table_ident[tok - TOK_IDENT]->sym_define = ss;
-                            table_ident[tok - TOK_IDENT]->sym_define_stack = ss->prev_tok;
-                        }
-                    }
-                }
-                tcc_close();
-            }
-            next();
-            skip(')');
     } else if (tok == TOK_once) {
         add_cached_include(s1, file->filename, TOK_once);
     } else {
diff --git a/tcctok.h b/tcctok.h
index 3de3ae2d..4db9d1c7 100644
--- a/tcctok.h
+++ b/tcctok.h
@@ -155,8 +155,6 @@
 #endif
      DEF(TOK_comment, "comment")
      DEF(TOK_lib, "lib")
-     DEF(TOK_push_macro, "push_macro")
-     DEF(TOK_pop_macro, "pop_macro")
      DEF(TOK_once, "once")
 
 /* builtin functions or variables */
diff --git a/tests/tests2/77_push_pop_macro.c b/tests/tests2/77_push_pop_macro.c
deleted file mode 100644
index 1f0b1bc4..00000000
--- a/tests/tests2/77_push_pop_macro.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-
-int main()
-{
-    #define abort "111"
-    printf("abort = %s\n", abort);
-
-    #pragma push_macro("abort")
-    #undef abort
-    #define abort "222"
-    printf("abort = %s\n", abort);
-
-    #pragma push_macro("abort")
-    #undef abort
-    #define abort "333"
-    printf("abort = %s\n", abort);
-
-    #pragma pop_macro("abort")
-    printf("abort = %s\n", abort);
-
-    #pragma pop_macro("abort")
-    printf("abort = %s\n", abort);
-}
diff --git a/tests/tests2/77_push_pop_macro.expect b/tests/tests2/77_push_pop_macro.expect
deleted file mode 100644
index d8a55305..00000000
--- a/tests/tests2/77_push_pop_macro.expect
+++ /dev/null
@@ -1,5 +0,0 @@
-abort = 111
-abort = 222
-abort = 333
-abort = 222
-abort = 111
diff --git a/tests/tests2/Makefile b/tests/tests2/Makefile
index 87daf7b5..a5a18fb5 100644
--- a/tests/tests2/Makefile
+++ b/tests/tests2/Makefile
@@ -95,8 +95,7 @@ TESTS =	\
  73_arm64.test \
  74_nocode_wanted.test \
  75_array_in_struct_init.test \
- 76_dollars_in_identifiers.test \
- 77_push_pop_macro.test
+ 76_dollars_in_identifiers.test
 
 # 34_array_assignment.test -- array assignment is not in C standard