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