R600/SI build failure on Leopard (Use of C++11)

Hi Christian,

Ryan just reported to me that llvm-3.4 is no longer building on OS X Leopard (https://trac.macports.org/ticket/41548). It seems the issue is with a commit that you made back in April (referenced below) which added this to SIISelLowering.cpp:

  // Adjust the writemask in the node
  std::vector<SDValue> Ops;
  Ops.push_back(DAG.getTargetConstant(NewDmask, MVT::i32));
  for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
    Ops.push_back(Node->getOperand(i));
  Node = (MachineSDNode*)DAG.UpdateNodeOperands(Node, Ops.data(), Ops.size());

That fails with Leopard's libstdc++ STL which does not a data method for std::vector. This method was added in C++11:
http://www.cplusplus.com/reference/vector/vector/

Is llvm-3.4 now requiring a C++11 runtime? If not, can we solve this a different way?

Thanks,
Jeremy

commit 84a775d8e3d5a3765e01db4b454f849ed8be99be
Author: Christian Konig <christian.koenig@amd.com>

    R600/SI: adjust writemask to only the used components
    
    Signed-off-by: Christian König <christian.koenig@amd.com>
    Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
    
    git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179165 91177308-0d34-0410-b5e6-96231b3b80d8

Can't you just use &Ops[0] ?

Can't you just use &Ops[0] ?

Is that safely portable? ie is it required that pre-C++11 std:vector be implemented such that the data is stored contiguously in a realloc'd array?

While I'm not sure anyone would do this (so perhaps the point is moot), it seems that one could use non-contiguous blocks as an implementation detail if allowed by the standard.

Is that safely portable? ie is it required that pre-C++11 std:vector be implemented such that the data is stored contiguously in a realloc'd array?

Yep. Very first paragraph of the std::vector description (23.2.4p1): "
The elements of a vector are stored contiguously, meaning that if v is
a vector<T, Allocator> where T is some type other than bool, then it
obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size()".

Cheers.

Tim.

With std::vector it is indeed guaranteed that the data is stored in continuous memory.

But at this point a "SmallVector<SDValue, 4>" is probably more appropriate anyway and there "data()" is obviously defined.

Just a copy & paste error, should I make a patch for this or does anybody else already did one?

Cheers,
Christian.