rjmccall added a comment.

Thanks, the comments help a lot.



================
Comment at: lib/CodeGen/CGObjCGNU.cpp:439
+                             ArrayRef<llvm::Constant *> IvarOffsets,
+                             ArrayRef<llvm::Constant *> IvarAlign,
+                             ArrayRef<Qualifiers::ObjCLifetime> IvarOwnership);
----------------
theraven wrote:
> DHowett-MSFT wrote:
> > While we're here, is there value in storing the ivar size in layout as 
> > well, so that the runtime doesn't need to calculate it from the distance to 
> > the next ivar/end of the instance?
> Normally the runtime calculates it from the type encoding, if it's required.  
> I agree that it might be nice to have though.  Do you have strong feelings 
> about needing it in the 2.0 ABI?  The looser coupling means that it would be 
> easy to add in the 2.1 ABI if we want it later.  Are you seeing cases where 
> the runtime is calculating it incorrectly because of insufficient information 
> in the type encoding, or where calculating it is causing performance problems?
The distance between ivar offsets wouldn't be correct anyway because of 
alignment padding.  A set-ivar function might be able to get away with copying 
too many bytes from an input buffer (although I wouldn't recommend it!), but a 
get-ivar function definitely should not copy too many bytes into an output 
buffer.

And all that's assuming that the runtime promises not to reorder ivars 
dynamically.  I don't know what the GNU runtime says about that.  (Static 
reordering is fine, since the runtime can reasonably demand that the compiler 
emit ivars in layout order.)


================
Comment at: lib/CodeGen/CGObjCGNU.cpp:1065
+      }
+    }
+    auto *ObjCStrGV =
----------------
Seems much more reasonable, thanks.


================
Comment at: lib/CodeGen/CGObjCGNU.cpp:1067
+    auto *ObjCStrGV =
+      Fields.finishAndCreateGlobal(isNamed ? StringName : ".objc_string",
+          Align, false, isNamed ? llvm::GlobalValue::LinkOnceODRLinkage :
----------------
Micro-optimization: I'm pretty sure the type of this ternary is an r-value 
`std::string`, which means copying the string in either case; if you explicitly 
build a StringRef from StringName, the ternary will instead construct a 
StringRef and you'll avoid those unnecessary copies.


================
Comment at: lib/CodeGen/CGObjCGNU.cpp:1069
+          Align, false, isNamed ? llvm::GlobalValue::LinkOnceODRLinkage :
+          llvm::GlobalValue::PrivateLinkage);
+    ObjCStrGV->setSection(ConstantStringSection);
----------------
The indentation here is a little misleading; I'd suggest aligning the two cases 
of the ternary operator.


================
Comment at: lib/CodeGen/CGObjCGNU.cpp:1172
+    if (isWeak) {
+      // Placeholder for the real symbol.
+      ClassSymbol->setInitializer(new llvm::GlobalVariable(TheModule,
----------------
I would suggest clarifying in what sense this is a placeholder.  Does the 
runtime recognize it specially?  If so, how?  Is it replaced statically by a 
later pass in IRGen?


Repository:
  rC Clang

https://reviews.llvm.org/D46052



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to