[llvm-dev] Clearing the BSS section

John Criswell via llvm-dev llvm-dev at lists.llvm.org
Fri Aug 28 08:34:37 PDT 2015


On 8/28/15 11:31 AM, devh8h wrote:
> I had thought to use the memset intrinsic, unfortunately I did not 
> succeed to cross compiling compiler-rt on my Mac.

I don't think you need compiler-rt to use the memset intrinsic.  I think 
the code generator will generate efficient inline code for it (though 
I'm not certain).

In any event, Joerg's suggestion of making one external weak sounds a 
lot easier.
:)

Regards,

John Criswell

>
> Regards,
>
> Pierre Molinaro
>
>
>
>> Le 28 août 2015 à 17:22, John Criswell <jtcriswel at gmail.com 
>> <mailto:jtcriswel at gmail.com>> a écrit :
>>
>> On 8/28/15 11:20 AM, devh8h wrote:
>>> It is a very basic "blink-led" program, on a Teensy 3.1. There is no 
>>> operating system. The BSS clear function is called at boot. I would 
>>> write a general BSS clear function, that behaves correctly even if 
>>> the BSS section is empty.
>>
>> I thought it was something like that.
>>
>> Let me know if the memset intrinsic approach works.
>>
>> Regards,
>>
>> John Criswell
>>
>>>
>>> Thank,
>>>
>>> Pierre Molinaro
>>>
>>>> Le 28 août 2015 à 17:00, John Criswell <jtcriswel at gmail.com 
>>>> <mailto:jtcriswel at gmail.com>> a écrit :
>>>>
>>>> On 8/28/15 10:52 AM, devh8h via llvm-dev wrote:
>>>>> Hi,
>>>>>
>>>>> I am writing a function that clears the BSS section on an 
>>>>> Cortex-M4 embedded system.
>>>> I assume that, for some reason, the operating system is not 
>>>> demand-paging in zeroed memory.  Is that correct?
>>>>
>>>>> The LLVM (version 3.7.0rc3) code I had wrote  is :
>>>>> ;------------
>>>>> target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
>>>>> target triple = "thumbv7em-none--eabi"
>>>>>
>>>>> @__bss_start = external global i32
>>>>> @__bss_end   = external global i32
>>>>>
>>>>> define void @clearBSS () nounwind {
>>>>> entry:
>>>>>   br label %bssLoopTest
>>>>>  bssLoopTest:
>>>>>   %p = phi i32* [@__bss_start, %entry], [%p.next, %bssLoop]
>>>>>   %completed = icmp eq i32* %p, @__bss_end
>>>>>   br i1 %completed, label %clearCompleted, label %bssLoop
>>>>>  bssLoop:
>>>>>   store i32 0, i32* %p, align 4
>>>>>   %p.next = getelementptr inbounds i32, i32* %p, i32 1
>>>>>   br label %bssLoopTest
>>>>>  clearCompleted:
>>>>>   ret void
>>>>> }
>>>>> ;------------
>>>>>
>>>>> This code runs. But when I optimize it with :
>>>>> opt -disable-simplify-libcalls -Os -S source.ll -o optimized.ll
>>>>>
>>>>> I get the following code for the @clearBSS function :
>>>>> ;------------
>>>>> define void @clearBSS() nounwind {
>>>>> entry:
>>>>>   br label %bssLoop
>>>>>
>>>>> bssLoop:                                          ; preds = 
>>>>> %entry, %bssLoop
>>>>>   %p1 = phi i32* [ @__bss_start, %entry ], [ %p.next, %bssLoop ]
>>>>>   store i32 0, i32* %p1, align 4
>>>>>   %p.next = getelementptr inbounds i32, i32* %p1, i32 1
>>>>>   %completed = icmp eq i32* %p.next, @__bss_end
>>>>>   br i1 %completed, label %clearCompleted, label %bssLoop
>>>>>
>>>>> clearCompleted:                                   ; preds = %bssLoop
>>>>>   ret void
>>>>> }
>>>>> ;------------
>>>>> The optimizer has transformed the while loop into a repeat until.
>>>>>
>>>>> I think it assumes the two variables @__bss_start and @__bss_end 
>>>>> are distinct. But they are solved at link time, and they are the 
>>>>> same if the BSS section is empty : in this case, the optimized 
>>>>> function fails.
>>>>>
>>>>> Is there a way to prevent the optimizer to assume the two 
>>>>> variables are distinct ? Or what is the proper way to deal with 
>>>>> link time values ?
>>>> Have you tried using the memset intrinsic?  You could case 
>>>> bss_start and bss_end to integers, subtract them to find the 
>>>> length, and then use memset to zero the memory.  I would think 
>>>> memset should work if the length is zero.
>>>>
>>>> Regards,
>>>>
>>>> John Criswell
>>>>
>>>>> Thanks,
>>>>>
>>>>> Pierre Molinaro
>>>>>
>>>>> _______________________________________________
>>>>> LLVM Developers mailing list
>>>>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>>
>>>> -- 
>>>> John Criswell
>>>> Assistant Professor
>>>> Department of Computer Science, University of Rochester
>>>> http://www.cs.rochester.edu/u/criswell
>>>>
>>
>>
>> -- 
>> John Criswell
>> Assistant Professor
>> Department of Computer Science, University of Rochester
>> http://www.cs.rochester.edu/u/criswell
>>
>


-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
http://www.cs.rochester.edu/u/criswell

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150828/dfc4013e/attachment.html>


More information about the llvm-dev mailing list