[LLVMdev] struct type parament

Haopeng Liu hyliuhp at gmail.com
Wed Jun 3 14:42:31 PDT 2015


It works. Thank you.

Best,
Haopeng

On 6/3/15 10:03 AM, Mehdi Amini wrote:
> Do you really want to map the “source code level” type or does a comparison based on the structural equivalence would be OK?
>
> See:
>
>    /// isLayoutIdentical - Return true if this is layout identical to the
>    /// specified struct.
>    bool isLayoutIdentical(StructType *Other) const;
>
>
>> Mehdi
>
>> On Jun 2, 2015, at 2:30 PM, Haopeng Liu <hyliuhp at gmail.com> wrote:
>>
>> I tried to compare two types. Because of renaming, the comparison result is not as expected. How to deal with renaming while comparing types?
>>
>> Best,
>> Haopeng
>>
>> On 6/2/15 4:09 PM, Mehdi Amini wrote:
>>> Hi Haopeng,
>>>
>>> One more element, I just noticed you are using LTO, I am not sure how it is implemented but my guess is that there is a shared LLVMContext. If multiple files include this structure declaration, I wouldn’t be surprised if it trigger creating the type over and over in the IR.
>>>
>>> Why is it a problem for you by the way? Does the compilation fails in some way?
>>>
>>>>>> Mehdi
>>>
>>>> On Jun 2, 2015, at 1:31 PM, Haopeng Liu <hyliuhp at gmail.com> wrote:
>>>>
>>>> Hi Mehdi,
>>>>
>>>> Thanks for your reply.
>>>>
>>>> It seems caused by random rename because I saw %struct.StructTyName.692.475*, which might be twice renaming.
>>>>
>>>> Does this collision occur because this type is declared more than once?
>>>>
>>>> I encountered this problem when used clang to compile transmission 1.42 (http://download.transmissionbt.com/files/) with configuration: "./configure --disable-gtk". Then in ./third-party/libevent/event.o.ll, you can see the function "event_base_get_method" is an example.
>>>>
>>>> Best,
>>>> Haopeng
>>>>
>>>> On 6/2/15 1:48 PM, Mehdi Amini wrote:
>>>>> Hi,
>>>>>
>>>>> I think this is when a collision is found on the name.
>>>>> I would be interesting to have the full test, it might be that the API is used in a way such that type is constantly re-created even if it already exists, which might be inefficient.
>>>>>
>>>>> See in lib/IR/Type.cpp, StructType::setName(StringRef Name):
>>>>>
>>>>> ...
>>>>>    // While we have a name collision, try a random rename.
>>>>>    if (Entry->getValue()) {
>>>>>      SmallString<64> TempStr(Name);
>>>>>      TempStr.push_back('.');
>>>>>      raw_svector_ostream TmpStream(TempStr);
>>>>>      unsigned NameSize = Name.size();
>>>>>          do {
>>>>>        TempStr.resize(NameSize + 1);
>>>>>        TmpStream.resync();
>>>>>        TmpStream << getContext().pImpl->NamedStructTypesUniqueID++;
>>>>>               Entry = &getContext().pImpl->
>>>>>                   NamedStructTypes.GetOrCreateValue(TmpStream.str());
>>>>>      } while (Entry->getValue());
>>>>>    }
>>>>>
>>>>>
>>>>>>>>>> Mehdi
>>>>>
>>>>>> On Jun 2, 2015, at 11:23 AM, Haopeng Liu <hyliuhp at gmail.com> wrote:
>>>>>>
>>>>>> Hi All,
>>>>>>
>>>>>> I generated the following code with "clang -flto" command.
>>>>>>
>>>>>> void test(struct StruTyName *a) {
>>>>>>     ...
>>>>>> }
>>>>>>
>>>>>> Then the type of test function is "void (%struct.StruTyName.100*)" by calling function::getFunctionType API.
>>>>>>
>>>>>> What's the meaning of number 100?
>>>>>>
>>>>>> Best,
>>>>>> Haopeng
>>>>>> _______________________________________________
>>>>>> LLVM Developers mailing list
>>>>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev





More information about the llvm-dev mailing list