Changeset 94814 in webkit


Ignore:
Timestamp:
Sep 8, 2011 3:52:04 PM (13 years ago)
Author:
oliver@apple.com
Message:

Use bump allocator for initial property storage
https://bugs.webkit.org/show_bug.cgi?id=67494

Reviewed by Geoffrey Garen.

../../../../Volumes/Data/git/WebKit/OpenSource/Source/JavaScriptCore:

Use a bump allocator for initial allocation of property storage,
and promote to fastMalloc memory only if it survives a GC pass.

Comes out as a 1% win on v8, and is a useful step on the way to
GC allocation of all property storage.

(JSC::Heap::collect):

  • heap/Heap.h:

(JSC::Heap::allocatePropertyStorage):
(JSC::Heap::inPropertyStorageNursery):

  • heap/MarkedBlock.h:
  • heap/NewSpace.cpp:

(JSC::NewSpace::NewSpace):

  • heap/NewSpace.h:

(JSC::NewSpace::resetPropertyStorageNursery):
(JSC::NewSpace::allocatePropertyStorage):
(JSC::NewSpace::inPropertyStorageNursery):

  • jit/JITStubs.cpp:

(JSC::DEFINE_STUB_FUNCTION):

  • runtime/JSObject.cpp:

(JSC::JSObject::allocatePropertyStorage):

  • runtime/JSObject.h:

(JSC::JSObject::isUsingInlineStorage):
(JSC::JSObject::JSObject):
(JSC::JSObject::propertyStorage):
(JSC::JSObject::~JSObject):
(JSC::JSObject::putDirectInternal):
(JSC::JSObject::putDirectWithoutTransition):
(JSC::JSObject::putDirectFunctionWithoutTransition):
(JSC::JSObject::transitionTo):
(JSC::JSObject::visitChildrenDirect):

  • runtime/StorageBarrier.h: Added.

(JSC::StorageBarrier::StorageBarrier):
(JSC::StorageBarrier::set):
(JSC::StorageBarrier::operator->):
(JSC::StorageBarrier::operator*):
(JSC::StorageBarrier::operator[]):
(JSC::StorageBarrier::get):

../../../../Volumes/Data/git/WebKit/OpenSource/Source/WebCore:

Add a forwarding header.

  • ForwardingHeaders/runtime/StorageBarrier.h: Added.
Location:
trunk/Source
Files:
2 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r94811 r94814  
     12011-09-08  Oliver Hunt  <oliver@apple.com>
     2
     3        Use bump allocator for initial property storage
     4        https://bugs.webkit.org/show_bug.cgi?id=67494
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Use a bump allocator for initial allocation of property storage,
     9        and promote to fastMalloc memory only if it survives a GC pass.
     10
     11        Comes out as a 1% win on v8, and is a useful step on the way to
     12        GC allocation of all property storage.
     13
     14        * JavaScriptCore.exp:
     15        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
     16        * JavaScriptCore.xcodeproj/project.pbxproj:
     17        * heap/Heap.cpp:
     18        (JSC::Heap::collect):
     19        * heap/Heap.h:
     20        (JSC::Heap::allocatePropertyStorage):
     21        (JSC::Heap::inPropertyStorageNursery):
     22        * heap/MarkedBlock.h:
     23        * heap/NewSpace.cpp:
     24        (JSC::NewSpace::NewSpace):
     25        * heap/NewSpace.h:
     26        (JSC::NewSpace::resetPropertyStorageNursery):
     27        (JSC::NewSpace::allocatePropertyStorage):
     28        (JSC::NewSpace::inPropertyStorageNursery):
     29        * jit/JITStubs.cpp:
     30        (JSC::DEFINE_STUB_FUNCTION):
     31        * runtime/JSObject.cpp:
     32        (JSC::JSObject::allocatePropertyStorage):
     33        * runtime/JSObject.h:
     34        (JSC::JSObject::isUsingInlineStorage):
     35        (JSC::JSObject::JSObject):
     36        (JSC::JSObject::propertyStorage):
     37        (JSC::JSObject::~JSObject):
     38        (JSC::JSObject::putDirectInternal):
     39        (JSC::JSObject::putDirectWithoutTransition):
     40        (JSC::JSObject::putDirectFunctionWithoutTransition):
     41        (JSC::JSObject::transitionTo):
     42        (JSC::JSObject::visitChildrenDirect):
     43        * runtime/StorageBarrier.h: Added.
     44        (JSC::StorageBarrier::StorageBarrier):
     45        (JSC::StorageBarrier::set):
     46        (JSC::StorageBarrier::operator->):
     47        (JSC::StorageBarrier::operator*):
     48        (JSC::StorageBarrier::operator[]):
     49        (JSC::StorageBarrier::get):
     50
    1512011-09-08  Sam Weinig  <sam@webkit.org>
    252
  • trunk/Source/JavaScriptCore/GNUmakefile.list.am

    r94701 r94814  
    418418        Source/JavaScriptCore/runtime/SmallStrings.cpp \
    419419        Source/JavaScriptCore/runtime/SmallStrings.h \
     420        Source/JavaScriptCore/runtime/StorageBarrier.h \
    420421        Source/JavaScriptCore/runtime/StrictEvalActivation.cpp \
    421422        Source/JavaScriptCore/runtime/StrictEvalActivation.h \
  • trunk/Source/JavaScriptCore/JavaScriptCore.exp

    r94811 r94814  
    216216__ZN3JSC22objectConstructorTableE
    217217__ZN3JSC23AbstractSamplingCounter4dumpEv
     218__ZN3JSC23AbstractSamplingCounter30s_abstractSamplingCounterChainE
    218219__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateE
    219220__ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE
     
    321322__ZN3JSC8JSObject21getPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE
    322323__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_16WriteBarrierBaseINS_7UnknownEEE
    323 __ZN3JSC8JSObject23allocatePropertyStorageEmm
     324__ZN3JSC8JSObject23allocatePropertyStorageERNS_12JSGlobalDataEmm
    324325__ZN3JSC8JSObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE
    325326__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE
  • trunk/Source/JavaScriptCore/JavaScriptCore.gypi

    r94701 r94814  
    115115            'runtime/ScopeChain.h',
    116116            'runtime/SmallStrings.h',
     117            'runtime/StorageBarrier.h',
    117118            'runtime/StringObject.h',
    118119            'runtime/StringObjectThatMasqueradesAsUndefined.h',
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def

    r94811 r94814  
    6060    ?addStaticGlobals@JSGlobalObject@JSC@@IAEXPAUGlobalPropertyInfo@12@H@Z
    6161    ?allocate@Heap@JSC@@QAEPAXAAUSizeClass@NewSpace@2@@Z
    62     ?allocatePropertyStorage@JSObject@JSC@@QAEXII@Z
     62    ?allocatePropertyStorage@JSObject@JSC@@QAEXAAVJSGlobalData@2@II@Z
    6363    ?allocateSlowCase@Heap@JSC@@AAEPAXAAUSizeClass@NewSpace@2@@Z
    6464    ?append@StringBuilder@WTF@@QAEXPBDI@Z
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r94802 r94814  
    417417                A76C51761182748D00715B05 /* JSInterfaceJIT.h in Headers */ = {isa = PBXBuildFile; fileRef = A76C51741182748D00715B05 /* JSInterfaceJIT.h */; };
    418418                A76F54A313B28AAB00EF2BCE /* JITWriteBarrier.h in Headers */ = {isa = PBXBuildFile; fileRef = A76F54A213B28AAB00EF2BCE /* JITWriteBarrier.h */; };
     419                A781E359141970C700094D90 /* StorageBarrier.h in Headers */ = {isa = PBXBuildFile; fileRef = A781E358141970C700094D90 /* StorageBarrier.h */; settings = {ATTRIBUTES = (Private, ); }; };
    419420                A784A26111D16622005776AC /* ASTBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A7EE7411B98B8D0065A14F /* ASTBuilder.h */; };
    420421                A784A26211D16622005776AC /* JSParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7A7EE7511B98B8D0065A14F /* JSParser.cpp */; };
     
    11831184                A76C51741182748D00715B05 /* JSInterfaceJIT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSInterfaceJIT.h; sourceTree = "<group>"; };
    11841185                A76F54A213B28AAB00EF2BCE /* JITWriteBarrier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITWriteBarrier.h; sourceTree = "<group>"; };
     1186                A781E358141970C700094D90 /* StorageBarrier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageBarrier.h; sourceTree = "<group>"; };
    11851187                A791EF260F11E07900AE1F68 /* JSByteArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSByteArray.h; sourceTree = "<group>"; };
    11861188                A791EF270F11E07900AE1F68 /* JSByteArray.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSByteArray.cpp; sourceTree = "<group>"; };
     
    21052107                                93303FE80E6A72B500786E6A /* SmallStrings.cpp */,
    21062108                                93303FEA0E6A72C000786E6A /* SmallStrings.h */,
     2109                                A781E358141970C700094D90 /* StorageBarrier.h */,
    21072110                                A730B6111250068F009D25B1 /* StrictEvalActivation.cpp */,
    21082111                                A730B6101250068F009D25B1 /* StrictEvalActivation.h */,
     
    27492752                                BC66BAE413F492CC00C23FAE /* Compiler.h in Headers */,
    27502753                                A7BC0C82140608B000B1BB71 /* CheckedArithmetic.h in Headers */,
     2754                                A781E359141970C700094D90 /* StorageBarrier.h in Headers */,
    27512755                        );
    27522756                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/JavaScriptCore/heap/Heap.cpp

    r94522 r94814  
    691691    size_t proportionalBytes = 2 * size();
    692692    m_newSpace.setHighWaterMark(max(proportionalBytes, m_minBytesPerCycle));
    693 
     693    m_newSpace.resetPropertyStorageNursery();
    694694    JAVASCRIPTCORE_GC_END();
    695695
  • trunk/Source/JavaScriptCore/heap/Heap.h

    r94522 r94814  
    9292        void collectAllGarbage();
    9393
     94        inline void* allocatePropertyStorage(size_t);
     95        inline bool inPropertyStorageNursery(void*);
     96
    9497        void reportExtraMemoryCost(size_t cost);
    9598
     
    164167
    165168        static void writeBarrierSlowCase(const JSCell*, JSCell*);
    166        
     169
    167170#if ENABLE(LAZY_BLOCK_FREEING)
    168171        void waitForRelativeTimeWhileHoldingLock(double relative);
     
    360363    }
    361364
     365    inline void* Heap::allocatePropertyStorage(size_t bytes)
     366    {
     367        ASSERT(!(bytes % sizeof(JSValue)));
     368        if (bytes >= NewSpace::PropertyStorageNurserySize)
     369            return 0;
     370        if (void* result = m_newSpace.allocatePropertyStorage(bytes))
     371            return result;
     372        collect(DoNotSweep);
     373        return m_newSpace.allocatePropertyStorage(bytes);
     374    }
     375   
     376    inline bool Heap::inPropertyStorageNursery(void* ptr)
     377    {
     378        return m_newSpace.inPropertyStorageNursery(ptr);
     379    }
     380
    362381} // namespace JSC
    363382
  • trunk/Source/JavaScriptCore/heap/MarkedBlock.h

    r94461 r94814  
    4949
    5050    static const size_t KB = 1024;
     51    static const size_t MB = 1024 * 1024;
    5152   
    5253    // A marked block is a page-aligned container for heap-allocated objects.
  • trunk/Source/JavaScriptCore/heap/NewSpace.cpp

    r94522 r94814  
    3333
    3434NewSpace::NewSpace(Heap* heap)
    35     : m_waterMark(0)
     35    : m_propertyStorageNursery(static_cast<char*>(fastMalloc(PropertyStorageNurserySize)))
     36    , m_propertyStorageAllocationPoint(m_propertyStorageNursery)
     37    , m_waterMark(0)
    3638    , m_highWaterMark(0)
    3739    , m_heap(heap)
  • trunk/Source/JavaScriptCore/heap/NewSpace.h

    r94522 r94814  
    4747    public:
    4848        static const size_t maxCellSize = 1024;
     49        static const size_t PropertyStorageNurserySize = 4 * MB;
    4950
    5051        struct SizeClass {
     
    6465        SizeClass& sizeClassFor(size_t);
    6566        void* allocate(SizeClass&);
     67        inline void* allocatePropertyStorage(size_t);
     68        inline bool inPropertyStorageNursery(void* ptr);
     69        inline void resetPropertyStorageNursery();
     70       
    6671        void resetAllocator();
    6772
     
    9297        SizeClass m_preciseSizeClasses[preciseCount];
    9398        SizeClass m_impreciseSizeClasses[impreciseCount];
     99        char* m_propertyStorageNursery;
     100        char* m_propertyStorageAllocationPoint;
    94101        size_t m_waterMark;
    95102        size_t m_highWaterMark;
     
    161168    }
    162169
     170    inline void NewSpace::resetPropertyStorageNursery()
     171    {
     172        m_propertyStorageAllocationPoint = m_propertyStorageNursery;
     173    }
     174   
     175    inline void* NewSpace::allocatePropertyStorage(size_t size)
     176    {
     177        char* result = m_propertyStorageAllocationPoint;
     178        if (size > PropertyStorageNurserySize)
     179            CRASH();
     180        m_propertyStorageAllocationPoint += size;
     181        if (static_cast<size_t>(m_propertyStorageAllocationPoint - m_propertyStorageNursery) > PropertyStorageNurserySize) {
     182            m_propertyStorageAllocationPoint = result;
     183            return 0;
     184        }
     185        return result;
     186    }
     187
     188    inline bool NewSpace::inPropertyStorageNursery(void* ptr)
     189    {
     190        char* addr = static_cast<char*>(ptr);
     191        return static_cast<size_t>(addr - m_propertyStorageNursery) < PropertyStorageNurserySize;
     192    }
     193   
    163194    template <typename Functor> inline typename Functor::ReturnType NewSpace::forEachBlock(Functor& functor)
    164195    {
  • trunk/Source/JavaScriptCore/jit/JITStubs.cpp

    r94701 r94814  
    14821482    ASSERT(baseValue.isObject());
    14831483    JSObject* base = asObject(baseValue);
    1484     base->allocatePropertyStorage(oldSize, newSize);
     1484    base->allocatePropertyStorage(*stackFrame.globalData, oldSize, newSize);
    14851485
    14861486    return base;
  • trunk/Source/JavaScriptCore/runtime/JSObject.cpp

    r94599 r94814  
    595595}
    596596
    597 void JSObject::allocatePropertyStorage(size_t oldSize, size_t newSize)
     597void JSObject::allocatePropertyStorage(JSGlobalData& globalData, size_t oldSize, size_t newSize)
    598598{
    599599    ASSERT(newSize > oldSize);
     
    601601    // It's important that this function not rely on m_structure, since
    602602    // we might be in the middle of a transition.
    603     bool wasInline = (oldSize < JSObject::baseExternalStorageCapacity);
    604 
    605     PropertyStorage oldPropertyStorage = m_propertyStorage;
    606     PropertyStorage newPropertyStorage = new WriteBarrierBase<Unknown>[newSize];
     603    PropertyStorage newPropertyStorage = 0;
     604    if (globalData.heap.inPropertyStorageNursery(m_propertyStorage.get())) {
     605        newPropertyStorage = static_cast<PropertyStorage>(globalData.heap.allocatePropertyStorage(newSize * sizeof(WriteBarrierBase<Unknown>)));
     606        if (!newPropertyStorage || !globalData.heap.inPropertyStorageNursery(m_propertyStorage.get())) {
     607            // If allocation failed because it's too big, or it triggered a GC
     608            // that promoted us to old space, we need to allocate our property
     609            // storage in old space.
     610            newPropertyStorage = new WriteBarrierBase<Unknown>[newSize];
     611        }
     612    } else
     613        newPropertyStorage = new WriteBarrierBase<Unknown>[newSize];
     614
     615    PropertyStorage oldPropertyStorage = m_propertyStorage.get();
     616    ASSERT(newPropertyStorage);
    607617
    608618    for (unsigned i = 0; i < oldSize; ++i)
    609619       newPropertyStorage[i] = oldPropertyStorage[i];
    610620
    611     if (!wasInline)
     621    if (!isUsingInlineStorage() && !globalData.heap.inPropertyStorageNursery(m_propertyStorage.get()))
    612622        delete [] oldPropertyStorage;
    613623
    614     m_propertyStorage = newPropertyStorage;
     624    m_propertyStorage.set(globalData, this, newPropertyStorage);
    615625}
    616626
  • trunk/Source/JavaScriptCore/runtime/JSObject.h

    r94811 r94814  
    3232#include "PutPropertySlot.h"
    3333#include "ScopeChain.h"
     34#include "StorageBarrier.h"
    3435#include "Structure.h"
    3536#include "JSGlobalData.h"
     
    6970    };
    7071
    71     typedef WriteBarrierBase<Unknown>* PropertyStorage;
    72     typedef const WriteBarrierBase<Unknown>* ConstPropertyStorage;
    73 
    7472    class JSObject : public JSCell {
    7573        friend class BatchedTransitionOptimizer;
     
    219217        bool isExtensible() { return m_structure->isExtensible(); }
    220218
    221         void allocatePropertyStorage(size_t oldSize, size_t newSize);
    222         bool isUsingInlineStorage() const { return static_cast<const void*>(m_propertyStorage) == static_cast<const void*>(this + 1); }
     219        void allocatePropertyStorage(JSGlobalData&, size_t oldSize, size_t newSize);
     220        bool isUsingInlineStorage() const { return static_cast<const void*>(m_propertyStorage.get()) == static_cast<const void*>(this + 1); }
    223221
    224222        void* addressOfPropertyAtOffset(size_t offset)
     
    292290        JSObject(VPtrStealingHackType, PropertyStorage inlineStorage)
    293291            : JSCell(VPtrStealingHack)
    294             , m_propertyStorage(inlineStorage)
     292            , m_propertyStorage(inlineStorage, StorageBarrier::Unchecked)
    295293        {
    296294        }
     
    306304        void isString();
    307305       
    308         ConstPropertyStorage propertyStorage() const { return m_propertyStorage; }
    309         PropertyStorage propertyStorage() { return m_propertyStorage; }
     306        ConstPropertyStorage propertyStorage() const { return m_propertyStorage.get(); }
     307        PropertyStorage propertyStorage() { return m_propertyStorage.get(); }
    310308
    311309        const WriteBarrierBase<Unknown>* locationForOffset(size_t offset) const
     
    328326        Structure* createInheritorID(JSGlobalData&);
    329327
    330         PropertyStorage m_propertyStorage;
     328        StorageBarrier m_propertyStorage;
    331329        WriteBarrier<Structure> m_inheritorID;
    332330    };
     
    462460inline JSObject::JSObject(JSGlobalData& globalData, Structure* structure, PropertyStorage inlineStorage)
    463461    : JSCell(globalData, structure)
    464     , m_propertyStorage(inlineStorage)
     462    , m_propertyStorage(globalData, this, inlineStorage)
    465463{
    466464}
     
    468466inline JSObject::~JSObject()
    469467{
    470     if (!isUsingInlineStorage())
    471         delete [] m_propertyStorage;
     468    if (!isUsingInlineStorage() && !Heap::heap(this)->inPropertyStorageNursery(m_propertyStorage.get()))
     469        delete [] m_propertyStorage.get();
    472470}
    473471
     
    662660        offset = m_structure->addPropertyWithoutTransition(globalData, propertyName, attributes, specificFunction);
    663661        if (currentCapacity != m_structure->propertyStorageCapacity())
    664             allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
     662            allocatePropertyStorage(globalData, currentCapacity, m_structure->propertyStorageCapacity());
    665663
    666664        ASSERT(offset < m_structure->propertyStorageCapacity());
     
    676674    if (Structure* structure = Structure::addPropertyTransitionToExistingStructure(m_structure.get(), propertyName, attributes, specificFunction, offset)) {   
    677675        if (currentCapacity != structure->propertyStorageCapacity())
    678             allocatePropertyStorage(currentCapacity, structure->propertyStorageCapacity());
     676            allocatePropertyStorage(globalData, currentCapacity, structure->propertyStorageCapacity());
    679677
    680678        ASSERT(offset < structure->propertyStorageCapacity());
     
    726724
    727725    if (currentCapacity != structure->propertyStorageCapacity())
    728         allocatePropertyStorage(currentCapacity, structure->propertyStorageCapacity());
     726        allocatePropertyStorage(globalData, currentCapacity, structure->propertyStorageCapacity());
    729727
    730728    ASSERT(offset < structure->propertyStorageCapacity());
     
    787785    size_t offset = m_structure->addPropertyWithoutTransition(globalData, propertyName, attributes, 0);
    788786    if (currentCapacity != m_structure->propertyStorageCapacity())
    789         allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
     787        allocatePropertyStorage(globalData, currentCapacity, m_structure->propertyStorageCapacity());
    790788    putDirectOffset(globalData, offset, value);
    791789}
     
    796794    size_t offset = m_structure->addPropertyWithoutTransition(globalData, propertyName, attributes, value);
    797795    if (currentCapacity != m_structure->propertyStorageCapacity())
    798         allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
     796        allocatePropertyStorage(globalData, currentCapacity, m_structure->propertyStorageCapacity());
    799797    putDirectOffset(globalData, offset, value);
    800798}
     
    803801{
    804802    if (m_structure->propertyStorageCapacity() != newStructure->propertyStorageCapacity())
    805         allocatePropertyStorage(m_structure->propertyStorageCapacity(), newStructure->propertyStorageCapacity());
     803        allocatePropertyStorage(globalData, m_structure->propertyStorageCapacity(), newStructure->propertyStorageCapacity());
    806804    setStructure(globalData, newStructure);
    807805}
     
    894892
    895893    PropertyStorage storage = propertyStorage();
     894    if (Heap::heap(this)->inPropertyStorageNursery(storage)) {
     895        m_propertyStorage.set(new WriteBarrierBase<Unknown>[structure()->propertyStorageCapacity()], StorageBarrier::Unchecked);
     896        if (structure()->propertyStorageCapacity() > m_structure->propertyStorageSize())
     897            ASSERT(!storage[m_structure->propertyStorageSize()]);
     898        memcpy(m_propertyStorage.get(), storage, m_structure->propertyStorageSize() * sizeof(WriteBarrierBase<Unknown>));
     899    }
    896900    size_t storageSize = m_structure->propertyStorageSize();
    897901    visitor.appendValues(storage, storageSize);
  • trunk/Source/WebCore/ChangeLog

    r94813 r94814  
     12011-09-08  Oliver Hunt  <oliver@apple.com>
     2
     3        Use bump allocator for initial property storage
     4        https://bugs.webkit.org/show_bug.cgi?id=67494
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Add a forwarding header.
     9
     10        * ForwardingHeaders/runtime/StorageBarrier.h: Added.
     11
    1122011-09-08  Roland Steiner  <rolandsteiner@chromium.org>
    213
Note: See TracChangeset for help on using the changeset viewer.