/*
 * Copyright (C) 2012 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

#include "config.h"

#include "ArrayProfile.h"
#include "CodeBlock.h"
#include "Executable.h"
#include "Heap.h"
#include "Interpreter.h"
#include "JITStubs.h"
#include "JSArray.h"
#include "JSCell.h"
#include "JSFunction.h"
#include "JSGlobalData.h"
#include "JSGlobalObject.h"
#include "JSObject.h"
#include "JSPropertyNameIterator.h"
#include "JSStack.h"
#include "JSString.h"
#include "JSTypeInfo.h"
#include "JSVariableObject.h"
#include "JumpTable.h"
#include "LLIntOfflineAsmConfig.h"
#include "MarkedSpace.h"

#include "Structure.h"
#include "StructureChain.h"
#include "ValueProfile.h"
#include <wtf/text/StringImpl.h>

namespace JSC {

#define OFFLINE_ASM_OFFSETOF(clazz, field) (static_cast<unsigned>(OBJECT_OFFSETOF(clazz, field)))

class LLIntOffsetsExtractor {
public:
    static const unsigned* dummy();
};

const unsigned* LLIntOffsetsExtractor::dummy()
{
#if ENABLE(LLINT)
// This is a file generated by offlineasm/generate_offsets_extractor.rb, and contains code
// to create a table of offsets, sizes, and a header identifying what combination of
// Platform.h macros we have set. We include it inside of a method on LLIntOffsetsExtractor
// because the fields whose offsets we're extracting are mostly private. So we make their
// classes friends with LLIntOffsetsExtractor, and include the header here, to get the C++
// compiler to kindly step aside and yield to our best intentions.
#include "LLIntDesiredOffsets.h"
    return extractorTable;
#else
    return 0;
#endif
}

} // namespace JSC

#if defined (COBALT_WIN)
#undef main
#endif

// This file is built for the target, but parsed by the host.  On
// __LB_ANDROID__ it is getting pulled into the .so, where it conflicts with
// another main().  This file is never run on the host or the target, it's just
// parsed to get the assembly offsets.  So excluding main()
#if !defined(__LB_ANDROID__)

int main(int, char**)
{
    // Out of an abundance of caution, make sure that LLIntOffsetsExtractor::dummy() is live,
    // and the extractorTable is live, too.
    printf("%p\n", JSC::LLIntOffsetsExtractor::dummy());
    return 0;
}

#endif
