[llvm-commits] [llvm] r120201 - /llvm/trunk/include/llvm/ADT/InMemoryStruct.h

Chris Lattner clattner at apple.com
Sun Nov 28 11:38:48 PST 2010


On Nov 27, 2010, at 12:11 AM, Daniel Dunbar wrote:

> Author: ddunbar
> Date: Sat Nov 27 02:11:02 2010
> New Revision: 120201
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=120201&view=rev
> Log:
> ADT/InMemoryStruct: Add an experimental helper class intended for use in
> situations where on the common path an API can return a pointer to some direct
> memory, but which on an exceptional path may need to return a pointer to a
> temporary struct.

I see that you're using this for cases when you need to do bswap in the macho reader, apparently trying to avoid a copy of the struct when no bswap is needed.

However, I don't see how this is really a win.  You are avoiding a memcpy of a few smallish (~20-40 byte) structs, but this add a lot of complexity, and you have the have the same amount of stack space reserved.

It seems more straight-forward and cleaner to just use structs directly.  Is the complexity this introduces solving a measured performance issue?

-Chris

> 
> Added:
>    llvm/trunk/include/llvm/ADT/InMemoryStruct.h
> 
> Added: llvm/trunk/include/llvm/ADT/InMemoryStruct.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/InMemoryStruct.h?rev=120201&view=auto
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/InMemoryStruct.h (added)
> +++ llvm/trunk/include/llvm/ADT/InMemoryStruct.h Sat Nov 27 02:11:02 2010
> @@ -0,0 +1,77 @@
> +//===- InMemoryStruct.h - Indirect Struct Access Smart Pointer --*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_ADT_INMEMORYSTRUCT_H
> +#define LLVM_ADT_INMEMORYSTRUCT_H
> +
> +#include <cassert>
> +
> +namespace llvm {
> +
> +/// \brief Helper object for abstracting access to an in-memory structure which
> +/// may require some kind of temporary storage.
> +///
> +/// This class is designed to be used for accessing file data structures which
> +/// in the common case can be accessed from a direct pointer to a memory mapped
> +/// object, but which in some cases may require indirect access to a temporary
> +/// structure (which, for example, may have undergone endianness translation).
> +template<typename T>
> +class InMemoryStruct {
> +  typedef T value_type;
> +  typedef value_type &reference;
> +  typedef value_type *pointer;
> +  typedef const value_type &const_reference;
> +  typedef const value_type *const_pointer;
> +
> +  /// \brief The smart pointer target.
> +  value_type *Target;
> +
> +  /// \brief A temporary object which can be used as a target of the smart
> +  /// pointer.
> +  value_type Contents;
> +
> +private:
> +
> +public:
> +  InMemoryStruct() : Target(0) {}
> +  InMemoryStruct(reference Value) : Target(&Contents), Contents(Value) {}
> +  InMemoryStruct(pointer Value) : Target(Value) {}
> +  InMemoryStruct(const InMemoryStruct<T> &Value) { *this = Value; }
> +  
> +  void operator=(const InMemoryStruct<T> &Value) {
> +    if (Value.Target != &Value.Contents) {
> +      Target = Value.Target;
> +    } else {
> +      Target = &Contents;
> +      Contents = Value.Contents;
> +    }
> +  }
> +  
> +  const_reference operator*() const {
> +    assert(Target && "Cannot dereference null pointer");
> +    return *Target;
> +  }
> +  reference operator*() {
> +    assert(Target && "Cannot dereference null pointer");
> +    return *Target;
> +  }
> +
> +  const_pointer operator->() const {
> +    return Target;
> +  }
> +  pointer operator->() {
> +    return Target;
> +  }
> +
> +  operator bool() const { return Target != 0; }
> +};
> +
> +}
> +
> +#endif
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list