@@ -660,47 +660,67 @@ struct CompilationContext
660660 return externalModuleIndex;
661661 }
662662
663- void addHostSymbol (LinkIndex hostModuleIndex, Identifier symId, void * symPtr)
663+ // Automatically choses to use direct referencing or to use import table to access symbol
664+ // Adds to external symbol table
665+ LinkIndex addHostSymbol (LinkIndex hostModuleIndex, Identifier symId, void * symPtr)
664666 {
665- LinkIndex importedSymbolIndex;
666-
667+ LinkIndex symIndex;
667668 if (canReferenceFromCode(symPtr))
668- {
669- ObjectSymbol importedSymbol = {
670- kind : ObjectSymbolKind.isHost,
671- id : symId,
672- dataPtr : cast (ubyte * )symPtr,
673- sectionOffset : cast (ulong )symPtr,
674- sectionIndex : builtinSections[ObjectSectionType.host],
675- moduleIndex : hostModuleIndex,
676- };
677- importedSymbolIndex = objSymTab.addSymbol(importedSymbol);
678- }
669+ symIndex = addHostSymbolDirect(hostModuleIndex, symId, symPtr);
679670 else
680- {
681- ulong sectionOffset = importBuffer.length;
682- ulong ptr = cast (ulong )symPtr;
683- importBuffer.put(* cast (ubyte [8 ]* )&ptr);
684-
685- ObjectSymbol importedSymbol = {
686- kind : ObjectSymbolKind.isHost,
687- flags : ObjectSymbolFlags.isIndirect,
688- id : symId,
689- sectionOffset : sectionOffset,
690- sectionIndex : builtinSections[ObjectSectionType.imports],
691- moduleIndex : hostModuleIndex,
692- };
693- importedSymbolIndex = objSymTab.addSymbol(importedSymbol);
694- }
695- Identifier modId = objSymTab.getModule(hostModuleIndex).id;
696- externalSymbols.put(arrayArena, ExternalSymbolId (modId, symId), importedSymbolIndex);
671+ symIndex = addHostSymbolIndirect(hostModuleIndex, symId, symPtr);
672+
673+ registerExternalSymbol(hostModuleIndex, symId, symIndex);
674+
675+ return symIndex;
676+ }
677+
678+ // Force host symbol to be accessed directly
679+ private LinkIndex addHostSymbolDirect (LinkIndex hostModuleIndex, Identifier symId, void * symPtr)
680+ {
681+ ObjectSymbol sym = {
682+ kind : ObjectSymbolKind.isHost,
683+ id : symId,
684+ dataPtr : cast (ubyte * )symPtr,
685+ sectionOffset : cast (ulong )symPtr,
686+ sectionIndex : builtinSections[ObjectSectionType.host],
687+ moduleIndex : hostModuleIndex,
688+ };
689+ return objSymTab.addSymbol(sym);
690+ }
691+
692+ // Force host symbol to be accessed through import table
693+ private LinkIndex addHostSymbolIndirect (LinkIndex hostModuleIndex, Identifier symId, void * symPtr)
694+ {
695+ ulong sectionOffset = importBuffer.length;
696+ ubyte * dataPtr = importBuffer.nextPtr;
697+ size_t ptr = cast (size_t )symPtr;
698+ importBuffer.put(* cast (ubyte [size_t .sizeof]* )&ptr);
699+
700+ ObjectSymbol sym = {
701+ kind : ObjectSymbolKind.isHost,
702+ flags : ObjectSymbolFlags.isIndirect | ObjectSymbolFlags.isPointer,
703+ id : symId,
704+ dataPtr : dataPtr,
705+ length : size_t .sizeof,
706+ sectionOffset : sectionOffset,
707+ sectionIndex : builtinSections[ObjectSectionType.imports],
708+ moduleIndex : hostModuleIndex,
709+ };
710+ return objSymTab.addSymbol(sym);
711+ }
712+
713+ private void registerExternalSymbol (LinkIndex moduleIndex, Identifier symId, LinkIndex symIndex)
714+ {
715+ Identifier modId = objSymTab.getModule(moduleIndex).id;
716+ externalSymbols.put(arrayArena, ExternalSymbolId (modId, symId), symIndex);
697717 }
698718
699719 LinkIndex addDllModuleSymbol (LinkIndex dllModuleIndex, Identifier symId)
700720 {
701721 ObjectSymbol importedSymbol = {
702722 kind : ObjectSymbolKind.isImported,
703- flags : ObjectSymbolFlags.isIndirect,
723+ flags : ObjectSymbolFlags.isIndirect | ObjectSymbolFlags.isPointer ,
704724 id : symId,
705725 alignmentPower : 3 , // pointer size
706726 sectionIndex : builtinSections[ObjectSectionType.imports],
@@ -1242,6 +1262,7 @@ void createBuiltinFunctions(CompilationContext* c)
12421262{
12431263 ObjectModule builtinModule = {
12441264 kind : ObjectModuleKind.isHost,
1265+ flags : ObjectModuleFlags.isVerbose,
12451266 id : c.idMap.getOrReg(c, " :builtin" )
12461267 };
12471268 c.builtinModuleIndex = c.objSymTab.addModule(builtinModule);
@@ -1273,19 +1294,7 @@ void createBuiltinFunctions(CompilationContext* c)
12731294 funcNode.state = AstNodeState.type_check_done;
12741295 funcNode.flags |= FuncDeclFlags.isBuiltin;
12751296
1276- ulong sectionOffset = c.importBuffer.length;
1277- ulong ptr = cast (ulong )&builtin_function_stub;
1278- c.importBuffer.put(* cast (ubyte [8 ]* )&ptr);
1279-
1280- ObjectSymbol sym = {
1281- kind : ObjectSymbolKind.isHost,
1282- flags : ObjectSymbolFlags.isIndirect,
1283- id : id,
1284- sectionOffset : sectionOffset,
1285- sectionIndex : c.builtinSections[ObjectSectionType.imports],
1286- moduleIndex : c.builtinModuleIndex,
1287- };
1288- funcNode.backendData.objectSymIndex = c.objSymTab.addSymbol(sym);
1297+ funcNode.backendData.objectSymIndex = c.addHostSymbolIndirect(c.builtinModuleIndex, id, &builtin_function_stub);
12891298
12901299 c.assertf(func == reqIndex,
12911300 " Result AstIndex of builtin node %s (%s) is not equal to required (%s). Creation order must match CommonAstNodes order" ,
0 commit comments