r339128 - [objc-gnustep] Don't emit .guess ivar offset vars.
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 8 04:28:21 PDT 2018
Merged to 7.0 in r339233.
On Tue, Aug 7, 2018 at 2:02 PM, David Chisnall via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: theraven
> Date: Tue Aug 7 05:02:46 2018
> New Revision: 339128
>
> URL: http://llvm.org/viewvc/llvm-project?rev=339128&view=rev
> Log:
> [objc-gnustep] Don't emit .guess ivar offset vars.
>
> These were intended to allow non-fragile and fragile ABI code to be
> mixed, as long as the fragile classes were higher up the hierarchy than
> the non-fragile ones. Unfortunately:
>
> - No one actually wants to do this.
> - Recent versions of Linux's run-time linker break it.
>
> Modified:
> cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=339128&r1=339127&r2=339128&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Tue Aug 7 05:02:46 2018
> @@ -3812,40 +3812,10 @@ llvm::GlobalVariable *CGObjCGNU::ObjCIva
> // is. This allows code compiled with non-fragile ivars to work correctly
> // when linked against code which isn't (most of the time).
> llvm::GlobalVariable *IvarOffsetPointer = TheModule.getNamedGlobal(Name);
> - if (!IvarOffsetPointer) {
> - // This will cause a run-time crash if we accidentally use it. A value of
> - // 0 would seem more sensible, but will silently overwrite the isa pointer
> - // causing a great deal of confusion.
> - uint64_t Offset = -1;
> - // We can't call ComputeIvarBaseOffset() here if we have the
> - // implementation, because it will create an invalid ASTRecordLayout object
> - // that we are then stuck with forever, so we only initialize the ivar
> - // offset variable with a guess if we only have the interface. The
> - // initializer will be reset later anyway, when we are generating the class
> - // description.
> - if (!CGM.getContext().getObjCImplementation(
> - const_cast<ObjCInterfaceDecl *>(ID)))
> - Offset = ComputeIvarBaseOffset(CGM, ID, Ivar);
> -
> - llvm::ConstantInt *OffsetGuess = llvm::ConstantInt::get(Int32Ty, Offset,
> - /*isSigned*/true);
> - // Don't emit the guess in non-PIC code because the linker will not be able
> - // to replace it with the real version for a library. In non-PIC code you
> - // must compile with the fragile ABI if you want to use ivars from a
> - // GCC-compiled class.
> - if (CGM.getLangOpts().PICLevel) {
> - llvm::GlobalVariable *IvarOffsetGV = new llvm::GlobalVariable(TheModule,
> - Int32Ty, false,
> - llvm::GlobalValue::PrivateLinkage, OffsetGuess, Name+".guess");
> - IvarOffsetPointer = new llvm::GlobalVariable(TheModule,
> - IvarOffsetGV->getType(), false, llvm::GlobalValue::LinkOnceAnyLinkage,
> - IvarOffsetGV, Name);
> - } else {
> - IvarOffsetPointer = new llvm::GlobalVariable(TheModule,
> - llvm::Type::getInt32PtrTy(VMContext), false,
> - llvm::GlobalValue::ExternalLinkage, nullptr, Name);
> - }
> - }
> + if (!IvarOffsetPointer)
> + IvarOffsetPointer = new llvm::GlobalVariable(TheModule,
> + llvm::Type::getInt32PtrTy(VMContext), false,
> + llvm::GlobalValue::ExternalLinkage, nullptr, Name);
> return IvarOffsetPointer;
> }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list