X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Farch%2Fmicro_asm.py;h=4e5400ceffe8d075ecf935cc64f6b9968aef7184;hb=04e196f4223b5dfd61782edaaac27166a2bfcf3c;hp=32dd79fdf44e7ee749d9e7c899966f1c27a18111;hpb=49490b334af3bc145071a9a81f37012e7693af59;p=gem5.git diff --git a/src/arch/micro_asm.py b/src/arch/micro_asm.py index 32dd79fdf..4e5400cef 100644 --- a/src/arch/micro_asm.py +++ b/src/arch/micro_asm.py @@ -34,10 +34,6 @@ import traceback # get type names from types import * -# Prepend the directory where the PLY lex & yacc modules are found -# to the search path. -sys.path[0:0] = [os.environ['M5_PLY']] - from ply import lex from ply import yacc @@ -55,7 +51,7 @@ class Micro_Container(object): self.micro_classes = {} self.labels = {} - def add_microop(self, microop): + def add_microop(self, mnemonic, microop): self.microops.append(microop) def __str__(self): @@ -140,10 +136,10 @@ def handle_statement(parser, container, statement): raise try: for label in statement.labels: - container.labels[label.name] = microop - if label.extern: - container.externs[label.name] = microop - container.add_microop(microop) + container.labels[label.text] = microop + if label.is_extern: + container.externs[label.text] = microop + container.add_microop(statement.mnemonic, microop) except: print_error("Error adding microop.") raise @@ -242,7 +238,10 @@ def t_params_PARAMS(t): def t_asm_ID(t): r'[A-Za-z_]\w*' t.type = reserved_map.get(t.value, 'ID') - t.lexer.begin('params') + # If the ID is really "extern", we shouldn't start looking for parameters + # yet. The real ID, the label itself, is coming up. + if t.type != 'EXTERN': + t.lexer.begin('params') return t # If there is a label and you're -not- in the assembler (which would be caught @@ -439,6 +438,11 @@ def p_labels_1(t): t[1].append(t[2]) t[0] = t[1] +# labels on lines by themselves are attached to the following instruction. +def p_labels_2(t): + 'labels : labels NEWLINE' + t[0] = t[1] + def p_label_0(t): 'label : ID COLON' label = Label()