leonardchan created this revision.
Herald added subscribers: pengfei, hiraditya, kristof.beyls.
Herald added a project: All.
leonardchan requested review of this revision.
Herald added projects: clang, LLVM.
Herald added subscribers: llvm-commits, cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D132620

Files:
  clang/lib/CodeGen/CGVTables.cpp
  clang/lib/CodeGen/ItaniumCXXABI.cpp
  llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
  llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
  llvm/lib/Target/AArch64/AArch64TargetObjectFile.h
  llvm/lib/Target/X86/X86TargetObjectFile.h

Index: llvm/lib/Target/X86/X86TargetObjectFile.h
===================================================================
--- llvm/lib/Target/X86/X86TargetObjectFile.h
+++ llvm/lib/Target/X86/X86TargetObjectFile.h
@@ -42,6 +42,7 @@
   public:
     X86ELFTargetObjectFile() {
       PLTRelativeVariantKind = MCSymbolRefExpr::VK_PLT;
+      SupportIndirectSymViaGOTPCRel = true;
     }
     /// Describe a TLS variable address within debug info.
     const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const override;
Index: llvm/lib/Target/AArch64/AArch64TargetObjectFile.h
===================================================================
--- llvm/lib/Target/AArch64/AArch64TargetObjectFile.h
+++ llvm/lib/Target/AArch64/AArch64TargetObjectFile.h
@@ -21,6 +21,7 @@
 public:
   AArch64_ELFTargetObjectFile() {
     PLTRelativeVariantKind = MCSymbolRefExpr::VK_PLT;
+    SupportIndirectSymViaGOTPCRel = true;
   }
 };
 
Index: llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
===================================================================
--- llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -1425,6 +1425,15 @@
   return SSym;
 }
 
+const MCExpr *TargetLoweringObjectFileELF::getIndirectSymViaGOTPCRel(
+    const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV,
+    int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const {
+  const MCExpr *Res =
+    MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext());
+  const MCExpr *Off = MCConstantExpr::create(Offset, getContext());
+  return MCBinaryExpr::createAdd(Res, Off, getContext());
+}
+
 const MCExpr *TargetLoweringObjectFileMachO::getIndirectSymViaGOTPCRel(
     const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV,
     int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const {
Index: llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
===================================================================
--- llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -1749,8 +1749,10 @@
   // GlobalVariable or Function, i.e., as GlobalValue.
   if (!GV->hasGlobalUnnamedAddr() || !GV->hasInitializer() ||
       !GV->isConstant() || !GV->isDiscardableIfUnused() ||
-      !isa<GlobalValue>(GV->getOperand(0)))
+      !isa<GlobalValue>(GV->getOperand(0))) {
+    //llvm::errs() << "Failed isGOTEquivalentCandidate for " << GV->getName() << "\n";
     return false;
+  }
 
   // To be a got equivalent, at least one of its users need to be a constant
   // expression used by another global variable.
@@ -3172,6 +3174,8 @@
 static void handleIndirectSymViaGOTPCRel(AsmPrinter &AP, const MCExpr **ME,
                                          const Constant *BaseCst,
                                          uint64_t Offset) {
+  //llvm::errs() << "BaseCst:\n"; BaseCst->print(llvm::errs()); llvm::errs() << "\n";
+  //llvm::errs() << "ME: " << (**ME) << "\n";
   // The global @foo below illustrates a global that uses a got equivalent.
   //
   //  @bar = global i32 42
@@ -3193,7 +3197,14 @@
   //  cstexpr := <gotequiv> - <foo> + gotpcrelcst, where
   //    gotpcrelcst := <offset from @foo base> + <cst>
   MCValue MV;
-  if (!(*ME)->evaluateAsRelocatable(MV, nullptr, nullptr) || MV.isAbsolute())
+  if (!(*ME)->evaluateAsRelocatable(MV, nullptr, nullptr)) {
+    //llvm::errs() << "ME not relocatable\n";
+    return;
+  }
+
+  //llvm::errs() << "MV: "; MV.print(llvm::errs()); llvm::errs() << "\n";
+
+  if (MV.isAbsolute())
     return;
   const MCSymbolRefExpr *SymA = MV.getSymA();
   if (!SymA)
@@ -3201,19 +3212,24 @@
 
   // Check that GOT equivalent symbol is cached.
   const MCSymbol *GOTEquivSym = &SymA->getSymbol();
-  if (!AP.GlobalGOTEquivs.count(GOTEquivSym))
+  if (!AP.GlobalGOTEquivs.count(GOTEquivSym)) {
+    //llvm::errs() << "No GlobalGOTEquivs for " << *GOTEquivSym << "\n";
     return;
+  }
 
   const GlobalValue *BaseGV = dyn_cast_or_null<GlobalValue>(BaseCst);
   if (!BaseGV)
     return;
+  //llvm::errs() << "Good BaseGV\n";
 
   // Check for a valid base symbol
   const MCSymbol *BaseSym = AP.getSymbol(BaseGV);
   const MCSymbolRefExpr *SymB = MV.getSymB();
 
-  if (!SymB || BaseSym != &SymB->getSymbol())
+  if (!SymB || BaseSym != &SymB->getSymbol()) {
+    //llvm::errs() << "Bad base symbol\n";
     return;
+  }
 
   // Make sure to match:
   //
@@ -3223,8 +3239,9 @@
   // displacement into the GOTPCREL. We can also can have an extra offset <cst>
   // if the target knows how to encode it.
   int64_t GOTPCRelCst = Offset + MV.getConstant();
-  if (GOTPCRelCst < 0)
-    return;
+  //llvm::errs() << "GOTPCRelCst: " << GOTPCRelCst << "\n";
+  //if (GOTPCRelCst < 0)
+  //  return;
   if (!AP.getObjFileLowering().supportGOTPCRelWithOffset() && GOTPCRelCst != 0)
     return;
 
@@ -3250,6 +3267,7 @@
   const MCSymbol *FinalSym = AP.getSymbol(FinalGV);
   *ME = AP.getObjFileLowering().getIndirectSymViaGOTPCRel(
       FinalGV, FinalSym, MV, Offset, AP.MMI, *AP.OutStreamer);
+  assert(*ME);
 
   // Update GOT equivalent usage information
   --NumUses;
@@ -3261,6 +3279,7 @@
                                    AsmPrinter &AP, const Constant *BaseCV,
                                    uint64_t Offset,
                                    AsmPrinter::AliasMapTy *AliasList) {
+  //llvm::errs() << "CV:\n"; CV->print(llvm::errs()); llvm::errs() << "\n";
   emitGlobalAliasInline(AP, Offset, AliasList);
   uint64_t Size = DL.getTypeAllocSize(CV->getType());
 
Index: llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
===================================================================
--- llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
+++ llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
@@ -110,6 +110,10 @@
                                         const TargetMachine &TM) const override;
 
   MCSection *getSectionForCommandLines() const override;
+
+  const MCExpr *getIndirectSymViaGOTPCRel(
+      const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV,
+      int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const override;
 };
 
 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
Index: clang/lib/CodeGen/ItaniumCXXABI.cpp
===================================================================
--- clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -1716,6 +1716,8 @@
 void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
                                           const CXXRecordDecl *RD) {
   llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
+  //llvm::errs() << "Emitting vtable 1?\n";
+  //VTable->print(llvm::errs()); llvm::errs() << "\n";
   if (VTable->hasInitializer())
     return;
 
@@ -1774,6 +1776,9 @@
     if (!VTable->isDSOLocal())
       CGVT.GenerateRelativeVTableAlias(VTable, VTable->getName());
   }
+
+  //llvm::errs() << "Emitting vtable 2?\n";
+  //VTable->print(llvm::errs()); llvm::errs() << "\n";
 }
 
 bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField(
@@ -3890,6 +3895,10 @@
   TypeName->setPartition(CGM.getCodeGenOpts().SymbolPartition);
   GV->setPartition(CGM.getCodeGenOpts().SymbolPartition);
 
+  //if (CGM.getItaniumVTableContext().isRelativeLayout()) {
+  //  GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
+  //}
+
   return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
 }
 
Index: clang/lib/CodeGen/CGVTables.cpp
===================================================================
--- clang/lib/CodeGen/CGVTables.cpp
+++ clang/lib/CodeGen/CGVTables.cpp
@@ -640,15 +640,27 @@
   // Examples where there would be no symbol emitted are available_externally
   // and private linkages.
   auto stubLinkage = vtableHasLocalLinkage ? llvm::GlobalValue::InternalLinkage
-                                           : llvm::GlobalValue::ExternalLinkage;
+                                           //: llvm::GlobalValue::ExternalLinkage;
+                                           : llvm::GlobalValue::LinkOnceODRLinkage;
 
   llvm::Constant *target;
   if (auto *func = dyn_cast<llvm::Function>(globalVal)) {
     target = llvm::DSOLocalEquivalent::get(func);
   } else {
+    //if (globalVal->getName() == "_ZTIN6icu_717UObjectE") {
+    //  globalVal->print(llvm::errs());
+    //  llvm::errs() << "\n";
+    //}
+
     llvm::SmallString<16> rttiProxyName(globalVal->getName());
     rttiProxyName.append(".rtti_proxy");
 
+    //if (globalVal->isDeclaration()) {
+    //  // The RTTI component may be externally referenced in this 
+    //} else {
+
+    //}
+
     // The RTTI component may not always be emitted in the same linkage unit as
     // the vtable. As a general case, we can make a dso_local proxy to the RTTI
     // that points to the actual RTTI struct somewhere. This will result in a
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to