@@ -3576,18 +3576,35 @@ void PPCAIXAsmPrinter::emitGlobalIFunc(Module &M, const GlobalIFunc &GI) {
35763576 return ;
35773577 }
35783578
3579- // lwz 12, L..foo_desc(2)
35803579 auto FnDescTOCEntryType = getTOCEntryTypeForLinkage (GI.getLinkage ());
3581- auto *FnDescTOCEntrySym =
3582- lookUpOrCreateTOCEntry (CurrentFnDescSym, FnDescTOCEntryType);
3583- auto *Exp = MCSymbolRefExpr::create (FnDescTOCEntrySym, OutContext);
3584- // Exp = getTOCEntryLoadingExprForXCOFF(MOSymbol, Exp, VK);// TODO: need this?
3585- // need this uncommented
3586- OutStreamer->emitInstruction (MCInstBuilder (IsPPC64 ? PPC::LD : PPC::LWZ)
3587- .addReg (PPC::X12)
3588- .addExpr (Exp)
3589- .addReg (PPC::X2),
3590- *Subtarget);
3580+ auto *FnDescTOCEntrySym = lookUpOrCreateTOCEntry (CurrentFnDescSym, FnDescTOCEntryType);
3581+
3582+ if (TM.getCodeModel () == CodeModel::Large) {
3583+ // addis 12, L..foo_desc@u(2)
3584+ // lwz 12, L..foo_desc@l(12)
3585+ auto *Exp_U = symbolWithSpecifier (FnDescTOCEntrySym, PPC::S_U);
3586+ OutStreamer->emitInstruction (MCInstBuilder (PPC::ADDIS)
3587+ .addReg (PPC::X12)
3588+ .addReg (PPC::X2)
3589+ .addExpr (Exp_U),
3590+ *Subtarget);
3591+ auto *Exp_L = symbolWithSpecifier (FnDescTOCEntrySym, PPC::S_L);
3592+ OutStreamer->emitInstruction (MCInstBuilder (IsPPC64 ? PPC::LD : PPC::LWZ)
3593+ .addReg (PPC::X12)
3594+ .addExpr (Exp_L)
3595+ .addReg (PPC::X12),
3596+ *Subtarget);
3597+ } else {
3598+ // lwz 12, L..foo_desc(2)
3599+ auto *Exp = MCSymbolRefExpr::create (FnDescTOCEntrySym, OutContext);
3600+ // Exp = getTOCEntryLoadingExprForXCOFF(MOSymbol, Exp, VK);
3601+ // TODO: do we need to uncomment this?
3602+ OutStreamer->emitInstruction (MCInstBuilder (IsPPC64 ? PPC::LD : PPC::LWZ)
3603+ .addReg (PPC::X12)
3604+ .addExpr (Exp)
3605+ .addReg (PPC::X2),
3606+ *Subtarget);
3607+ }
35913608 // lwz 11, 8(12)
35923609 OutStreamer->emitInstruction (MCInstBuilder (IsPPC64 ? PPC::LD : PPC::LWZ)
35933610 .addReg (PPC::X11)
0 commit comments