瀏覽代碼

* also register symbols referenced from assembler via asolutevarsyms

git-svn-id: trunk@42307 -
Jonas Maebe 6 年之前
父節點
當前提交
98f55b1d86
共有 1 個文件被更改,包括 57 次插入18 次删除
  1. 57 18
      compiler/rautils.pas

+ 57 - 18
compiler/rautils.pas

@@ -1331,6 +1331,62 @@ end;
                       Symbol table helper routines
 ****************************************************************************}
 
+procedure AddAbsoluteSymRefs(sym: tabsolutevarsym); forward;
+
+procedure MaybeAddSymRef(sym: tsym);
+begin
+  case sym.typ of
+     absolutevarsym:
+       AddAbsoluteSymRefs(tabsolutevarsym(sym));
+     staticvarsym:
+       if not(vo_is_external in tstaticvarsym(sym).varoptions) then
+         cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(sym.mangledname,AT_DATA),tstaticvarsym(sym).vardef,true);
+     procsym:
+       begin
+         { if it's a pure assembler routine, the definition of the symbol will also
+           be in assembler and it can't be removed by the compiler (and if we mark
+           it as used anyway, clang will get into trouble) }
+         if not(po_assembler in tprocdef(tprocsym(sym).ProcdefList[0]).procoptions) and
+            not(po_external in tprocdef(tprocsym(sym).ProcdefList[0]).procoptions) then
+           cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(tprocdef(tprocsym(sym).ProcdefList[0]).mangledname,AT_FUNCTION),tprocdef(tprocsym(sym).ProcdefList[0]),true);
+       end;
+     else
+       ;
+   end;
+end;
+
+procedure AddAbsoluteSymRefs(sym: tabsolutevarsym);
+var
+  symlist: ppropaccesslistitem;
+begin
+  case sym.abstyp of
+    toaddr:
+      ;
+    toasm:
+      begin
+        cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(sym.mangledname,AT_DATA),sym.vardef,true);
+      end;
+    tovar:
+      begin
+        symlist:=tabsolutevarsym(sym).ref.firstsym;
+        repeat
+          case symlist^.sltype of
+            sl_load:
+              MaybeAddSymRef(symlist^.sym);
+            sl_subscript,
+            sl_absolutetype,
+            sl_typeconv,
+            sl_vec:
+              ;
+            else
+              internalerror(2009031401);
+          end;
+          symlist:=symlist^.next;
+        until not assigned(symlist);
+      end;
+  end;
+end;
+
 procedure AsmSearchSym(const s:string;out srsym:tsym;out srsymtable:TSymtable);
 var
   i : integer;
@@ -1393,24 +1449,7 @@ begin
     end;
   { llvm can't catch symbol references from inline assembler blocks }
   if assigned(srsym) then
-    begin
-      case srsym.typ of
-         staticvarsym:
-           if not(vo_is_external in tstaticvarsym(srsym).varoptions) then
-             cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(srsym.mangledname,AT_DATA),tstaticvarsym(srsym).vardef,true);
-         procsym:
-           begin
-             { if it's a pure assembler routine, the definition of the symbol will also
-               be in assembler and it can't be removed by the compiler (and if we mark
-               it as used anyway, clang will get into trouble) }
-             if not(po_assembler in tprocdef(tprocsym(srsym).ProcdefList[0]).procoptions) and
-                not(po_external in tprocdef(tprocsym(srsym).ProcdefList[0]).procoptions) then
-               cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(tprocdef(tprocsym(srsym).ProcdefList[0]).mangledname,AT_FUNCTION),tprocdef(tprocsym(srsym).ProcdefList[0]),true);
-           end;
-         else
-           ;
-      end;
-    end;
+    MaybeAddSymRef(srsym);
 end;