@@ -266,11 +266,24 @@ class GOFFSymbol {
266266 BehavAttrs.setBindingScope (Attr.BindingScope );
267267 BehavAttrs.setAlignment (EDAttr.Alignment );
268268 }
269+
270+ GOFFSymbol (StringRef Name, uint32_t EsdID, uint32_t ParentEsdID,
271+ const GOFF::ERAttr &Attr)
272+ : Name(Name.data(), Name.size()), EsdId(EsdID), ParentEsdId(ParentEsdID),
273+ SymbolType(GOFF::ESD_ST_ExternalReference),
274+ NameSpace(GOFF::ESD_NS_NormalName) {
275+ BehavAttrs.setExecutable (Attr.Executable );
276+ BehavAttrs.setBindingStrength (Attr.BindingStrength );
277+ BehavAttrs.setLinkageType (Attr.Linkage );
278+ BehavAttrs.setAmode (Attr.Amode );
279+ BehavAttrs.setBindingScope (Attr.BindingScope );
280+ }
269281};
270282
271283class GOFFWriter {
272284 GOFFOstream OS;
273285 MCAssembler &Asm;
286+ MCSectionGOFF *RootSD;
274287
275288 void writeHeader ();
276289 void writeSymbol (const GOFFSymbol &Symbol);
@@ -279,16 +292,18 @@ class GOFFWriter {
279292
280293 void defineSectionSymbols (const MCSectionGOFF &Section);
281294 void defineLabel (const MCSymbolGOFF &Symbol);
295+ void defineExtern (const MCSymbolGOFF &Symbol);
282296 void defineSymbols ();
283297
284298public:
285- GOFFWriter (raw_pwrite_stream &OS, MCAssembler &Asm);
299+ GOFFWriter (raw_pwrite_stream &OS, MCAssembler &Asm, MCSectionGOFF *RootSD );
286300 uint64_t writeObject ();
287301};
288302} // namespace
289303
290- GOFFWriter::GOFFWriter (raw_pwrite_stream &OS, MCAssembler &Asm)
291- : OS(OS), Asm(Asm) {}
304+ GOFFWriter::GOFFWriter (raw_pwrite_stream &OS, MCAssembler &Asm,
305+ MCSectionGOFF *RootSD)
306+ : OS(OS), Asm(Asm), RootSD(RootSD) {}
292307
293308void GOFFWriter::defineSectionSymbols (const MCSectionGOFF &Section) {
294309 if (Section.isSD ()) {
@@ -325,12 +340,24 @@ void GOFFWriter::defineSectionSymbols(const MCSectionGOFF &Section) {
325340void GOFFWriter::defineLabel (const MCSymbolGOFF &Symbol) {
326341 MCSectionGOFF &Section = static_cast <MCSectionGOFF &>(Symbol.getSection ());
327342 GOFFSymbol LD (Symbol.getName (), Symbol.getIndex (), Section.getOrdinal (),
328- Section.getEDAttributes ().NameSpace , Symbol.getLDAttributes ());
343+ Section.getEDAttributes ().NameSpace ,
344+ GOFF::LDAttr{false , Symbol.getCodeData (),
345+ Symbol.getBindingStrength (), Symbol.getLinkage (),
346+ GOFF::ESD_AMODE_64, Symbol.getBindingScope ()});
329347 if (Symbol.getADA ())
330348 LD.ADAEsdId = Symbol.getADA ()->getOrdinal ();
349+ LD.Offset = Asm.getSymbolOffset (Symbol);
331350 writeSymbol (LD);
332351}
333352
353+ void GOFFWriter::defineExtern (const MCSymbolGOFF &Symbol) {
354+ GOFFSymbol ER (Symbol.getName (), Symbol.getIndex (), RootSD->getOrdinal (),
355+ GOFF::ERAttr{Symbol.getCodeData (), Symbol.getBindingStrength (),
356+ Symbol.getLinkage (), GOFF::ESD_AMODE_64,
357+ Symbol.getBindingScope ()});
358+ writeSymbol (ER);
359+ }
360+
334361void GOFFWriter::defineSymbols () {
335362 unsigned Ordinal = 0 ;
336363 // Process all sections.
@@ -345,7 +372,10 @@ void GOFFWriter::defineSymbols() {
345372 if (Sym.isTemporary ())
346373 continue ;
347374 auto &Symbol = static_cast <const MCSymbolGOFF &>(Sym);
348- if (Symbol.hasLDAttributes ()) {
375+ if (!Symbol.isDefined ()) {
376+ Symbol.setIndex (++Ordinal);
377+ defineExtern (Symbol);
378+ } else if (Symbol.isInEDSection ()) {
349379 Symbol.setIndex (++Ordinal);
350380 defineLabel (Symbol);
351381 }
@@ -523,7 +553,7 @@ GOFFObjectWriter::GOFFObjectWriter(
523553GOFFObjectWriter::~GOFFObjectWriter () = default ;
524554
525555uint64_t GOFFObjectWriter::writeObject () {
526- uint64_t Size = GOFFWriter (OS, *Asm).writeObject ();
556+ uint64_t Size = GOFFWriter (OS, *Asm, RootSD ).writeObject ();
527557 return Size;
528558}
529559
0 commit comments