[clang] 4ace600 - [OpaquePtr] Remove uses of CreateStructGEP() without element type

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 20 12:48:52 PDT 2021


On Tue, Jul 20, 2021 at 11:52 AM Nikita Popov <nikita.ppv at gmail.com> wrote:

> On Tue, Jul 20, 2021 at 8:27 PM David Blaikie <dblaikie at gmail.com> wrote:
>
>> Any chance some of this series of patches could have test coverage
>> included? (like small clang test cases that exercise only a narrow part of
>> the codegen & works with force-opaque-pointers due to these changes?)
>>
>
> I think we're still pretty far away from any meaningful opaque pointer
> testing with clang. We need at least https://reviews.llvm.org/D103465 to
> land to support even basic cases.
>
> I just ran a quick test, and while an empty main() works under -mllvm
> -force-opaque-pointers,
>

That seems like something we could test/start things along, but yeah -
presumably that's always worked (by not having any pointers at all), so
isn't interesting.


> you get an assertion as soon as you try to dereference a pointer.
>

*nod* Just ran some tests too - having parameters (including pointer
parameters, such as "int main(int argc, char** argv) { }") work OK, but
yeah, soon as you try to access any variable (global or local), it trips up.

Thanks for the thoughts.


>
> Nikita
>
>
>> On Sat, Jul 17, 2021 at 9:48 AM Nikita Popov via cfe-commits <
>> cfe-commits at lists.llvm.org> wrote:
>>
>>>
>>> Author: Nikita Popov
>>> Date: 2021-07-17T18:48:21+02:00
>>> New Revision: 4ace6008f2fde781c1bedc7515e6380e449cb56a
>>>
>>> URL:
>>> https://github.com/llvm/llvm-project/commit/4ace6008f2fde781c1bedc7515e6380e449cb56a
>>> DIFF:
>>> https://github.com/llvm/llvm-project/commit/4ace6008f2fde781c1bedc7515e6380e449cb56a.diff
>>>
>>> LOG: [OpaquePtr] Remove uses of CreateStructGEP() without element type
>>>
>>> Remove uses of to-be-deprecated API.
>>>
>>> Added:
>>>
>>>
>>> Modified:
>>>     clang/lib/CodeGen/CGBlocks.cpp
>>>     clang/lib/CodeGen/CGObjCGNU.cpp
>>>
>>> Removed:
>>>
>>>
>>>
>>>
>>> ################################################################################
>>> diff  --git a/clang/lib/CodeGen/CGBlocks.cpp
>>> b/clang/lib/CodeGen/CGBlocks.cpp
>>> index 769501a036e6..f39a56f81d41 100644
>>> --- a/clang/lib/CodeGen/CGBlocks.cpp
>>> +++ b/clang/lib/CodeGen/CGBlocks.cpp
>>> @@ -1375,7 +1375,7 @@ static llvm::Constant
>>> *buildGlobalBlock(CodeGenModule &CGM,
>>>      llvm::IRBuilder<> b(llvm::BasicBlock::Create(CGM.getLLVMContext(),
>>> "entry",
>>>            Init));
>>>      b.CreateAlignedStore(CGM.getNSConcreteGlobalBlock(),
>>> -                         b.CreateStructGEP(literal, 0),
>>> +                         b.CreateStructGEP(literal->getValueType(),
>>> literal, 0),
>>>                           CGM.getPointerAlign().getAsAlign());
>>>      b.CreateRetVoid();
>>>      // We can't use the normal LLVM global initialisation array,
>>> because we
>>>
>>> diff  --git a/clang/lib/CodeGen/CGObjCGNU.cpp
>>> b/clang/lib/CodeGen/CGObjCGNU.cpp
>>> index 9e47dbf7bdf1..3f361f4e7931 100644
>>> --- a/clang/lib/CodeGen/CGObjCGNU.cpp
>>> +++ b/clang/lib/CodeGen/CGObjCGNU.cpp
>>> @@ -945,7 +945,8 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
>>>    /// Generate the name of a symbol for a reference to a class.
>>> Accesses to
>>>    /// classes should be indirected via this.
>>>
>>> -  typedef std::pair<std::string, std::pair<llvm::Constant*, int>>
>>> EarlyInitPair;
>>> +  typedef std::pair<std::string, std::pair<llvm::GlobalVariable*, int>>
>>> +      EarlyInitPair;
>>>    std::vector<EarlyInitPair> EarlyInitList;
>>>
>>>    std::string SymbolForClassRef(StringRef Name, bool isWeak) {
>>> @@ -1096,7 +1097,7 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
>>>          }
>>>        }
>>>      }
>>> -    auto *ObjCStrGV =
>>> +    llvm::GlobalVariable *ObjCStrGV =
>>>        Fields.finishAndCreateGlobal(
>>>            isNamed ? StringRef(StringName) : ".objc_string",
>>>            Align, false, isNamed ? llvm::GlobalValue::LinkOnceODRLinkage
>>> @@ -1107,7 +1108,7 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
>>>        ObjCStrGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
>>>      }
>>>      if (CGM.getTriple().isOSBinFormatCOFF()) {
>>> -      std::pair<llvm::Constant*, int> v{ObjCStrGV, 0};
>>> +      std::pair<llvm::GlobalVariable*, int> v{ObjCStrGV, 0};
>>>        EarlyInitList.emplace_back(Sym, v);
>>>      }
>>>      llvm::Constant *ObjCStr = llvm::ConstantExpr::getBitCast(ObjCStrGV,
>>> IdTy);
>>> @@ -1654,9 +1655,10 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
>>>        for (const auto &lateInit : EarlyInitList) {
>>>          auto *global = TheModule.getGlobalVariable(lateInit.first);
>>>          if (global) {
>>> +          llvm::GlobalVariable *GV = lateInit.second.first;
>>>            b.CreateAlignedStore(
>>>                global,
>>> -              b.CreateStructGEP(lateInit.second.first,
>>> lateInit.second.second),
>>> +              b.CreateStructGEP(GV->getValueType(), GV,
>>> lateInit.second.second),
>>>                CGM.getPointerAlign().getAsAlign());
>>>          }
>>>        }
>>> @@ -1938,7 +1940,7 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
>>>      // struct objc_property_list *properties
>>>      classFields.add(GeneratePropertyList(OID, classDecl));
>>>
>>> -    auto *classStruct =
>>> +    llvm::GlobalVariable *classStruct =
>>>        classFields.finishAndCreateGlobal(SymbolForClass(className),
>>>          CGM.getPointerAlign(), false,
>>> llvm::GlobalValue::ExternalLinkage);
>>>
>>> @@ -1949,12 +1951,12 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
>>>      if (IsCOFF) {
>>>        // we can't import a class struct.
>>>        if (OID->getClassInterface()->hasAttr<DLLExportAttr>()) {
>>> -
>>> cast<llvm::GlobalValue>(classStruct)->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
>>> +
>>> classStruct->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
>>>
>>>  cast<llvm::GlobalValue>(classRefSymbol)->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
>>>        }
>>>
>>>        if (SuperClass) {
>>> -        std::pair<llvm::Constant*, int> v{classStruct, 1};
>>> +        std::pair<llvm::GlobalVariable*, int> v{classStruct, 1};
>>>          EarlyInitList.emplace_back(std::string(SuperClass->getName()),
>>>                                     std::move(v));
>>>        }
>>>
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210720/c6b293af/attachment.html>


More information about the cfe-commits mailing list