[cfe-dev] question regarding the C++ test case under LLVM test

Jonathan Roelofs via cfe-dev cfe-dev at lists.llvm.org
Wed Sep 21 07:06:42 PDT 2016



On 9/20/16 6:16 PM, Lin, Jin wrote:
>
>
> -----Original Message----- From: Jonathan Roelofs
> [mailto:jonathan at codesourcery.com] Sent: Tuesday, September 20, 2016
> 3:33 PM To: Lin, Jin <jin.lin at intel.com>; cfe-dev at lists.llvm.org
> Subject: Re: [cfe-dev] question regarding the C++ test case under
> LLVM test
>
>
>
> On 9/20/16 4:15 PM, Lin, Jin wrote:
>> I think a better solution is to extend the utility llvm-lit to
>> process the -target  option. If the target option and the host
>> match, the script will be executed. Otherwise just ignore the test
>> case. What do you think?
>
> That's actually not better.
>
> The problem you're going to run into is that your host system's
> headers are leaking into a target test. Now you have a testcase that
> could pass on one machine, but fail on another (even if they're both
> linux machines). The buildbots are very good at noticing this kind of
> thing because they all run on different host platforms.
>
> If you look through Clang's codegen tests, you'll find that none of
> them include anything from the host system... that is not an
> accident. It was done very purposefully: all of the codegen tests
> should behave precisely the same, no matter what the host platform
> is, and no matter what versions of libc/libm/c++ standard library/etc
> are installed.
>
> There are solutions to the specific questions you're asking (about
> how to prevent a testcase from running on a specific platform), but
> I'm avoiding telling you them because I think they're solving the
> wrong problem (specifically, this is a case of an XY problem:
> http://http://xyproblem.info/).
>
>
> ************* The purpose of my test is to check whether the clang
> generates the new intrinsic for STL containers such as vector.
>
> Here is the LLVM IR of the vector constructor under Linux and
> windows.  We can see that the LLVM IR are different. In order to
> instrument the new Intrinsic correctly, the clang has to call the
> utility getTarget().getTriple().isKnownWindowsMSVCEnvironment() to
> understand the OS and perform different action.

This ^ depends entirely on the '-target' triple, and not at all on the host.

>
> For the STL iterator, it is more complicated. Under Linux it is in
> gnucxx namespace and under Windows it is in std namespace.
>
> Let's assume I create a file with minimal version of std::vector. Now
> the question which version (windows/linux) should I include.  One of
> them will definitely fail if the script is blindly executed under
> Linux and Windows.

Which one you use should depend only on the _target_ triple, and not at 
all on the _host_.

If you want to stick them in the same file, the preprocessor can be a 
good way to do that:

// RUN: %clangxx -target i686-pc-linux-gnu ... -DLINUX_32 | FileCheck %s
// RUN: %clangxx -target x86_64-pc-mingw32 ... -DWIN_32 | FileCheck %s

#if defined(LINUX_32)
   // linux-specific version of the stuff you want to test
#elif defined(WIN_32)
   // windows-specific version of the stuff you want to test
#endif

>
> Do you have any good suggestions?
>
> Thanks,
>
> Jin
>
> Linux version: define linkonce_odr dereferenceable(4) float*
> @_ZNSt6vectorIfSaIfEEixEm(%"class.std::vector"* %this, i64 %__n) #3
> comdat align 2 { entry: %this.addr = alloca %"class.std::vector"*,
> align 8 %__n.addr = alloca i64, align 8 store %"class.std::vector"*
> %this, %"class.std::vector"** %this.addr,align 8, !tbaa !10 store i64
> %__n, i64* %__n.addr, align 8, !tbaa !12 %this1 = load
> %"class.std::vector"*, %"class.std::vector"** %this.addr, align 8 %0
> = bitcast %"class.std::vector"* %this1 to
> %"struct.std::_Vector_base"*  %_M_impl = getelementptr inbounds
> %"struct.std::_Vector_base", %"struct.std::_Vector_base"* %0, i32 0,
> i32 0 %_M_start = getelementptr inbounds
> %"struct.std::_Vector_base<float,  std::allocator<float>
> >::_Vector_impl", %"struct.std::_Vector_base< float,
> std::allocator<float> >::_Vector_impl"* %_M_impl, i32 0, i32 0 %1 =
> call float** @llvm.std.container.ptr.p0p0f32(float**  %_M_start) #1
> %2 = load float*, float** %1, align 8, !tbaa !1 %3 = load i64, i64*
> %__n.addr, align 8, !tbaa !12 %add.ptr = getelementptr inbounds
> float, float* %2, i64 %3 ret float* %add.ptr }
>
>
> Windows version define linkonce_odr dereferenceable(4) float*
> @"\01??A?$vector at MV?$allocator at M@std@@@std@@QEAAAEAM_K at Z"(%"class.std::vector"*
> %this, i64 %_Pos) #0 comdat align 2 { entry: %_Pos.addr = alloca i64,
> align 8 %this.addr = alloca %"class.std::vector"*, align 8 store i64
> %_Pos, i64* %_Pos.addr, align 8, !tbaa !19 store
> %"class.std::vector"* %this, %"class.std::vector"** %this.addr, align
> 8, !tbaa !21 %this1 = load %"class.std::vector"*,
> %"class.std::vector"** %this.addr,  align8 %0 = bitcast
> %"class.std::vector"* %this1 to %"class.std::_Vector_val"* %_Myfirst
> = getelementptr inbounds %"class.std::_Vector_val",
> %"class.std::_Vector_val"* %0, i32 0, i32 0 %1 = call float**
> @llvm.std.container.ptr.p0p0f32(float**  %_Myfirst) #1 %2 = load
> float*, float** %1, align 8, !tbaa !23 %3 = load i64, i64*
> %_Pos.addr, align 8, !tbaa !19 %add.ptr = getelementptr inbounds
> float, float* %2, i64 %3 ret float* %add.ptr
>
>
>
>
>
> Jon
>
>>
>> Thanks,
>>
>> Jin
>>
>
> -- Jon Roelofs jonathan at codesourcery.com CodeSourcery / Mentor
> Embedded
>

-- 
Jon Roelofs
jonathan at codesourcery.com
CodeSourcery / Mentor Embedded


More information about the cfe-dev mailing list