view gen/metadata.h @ 1479:4f7d50c744ed

Rewrite `StructLiteralExp::toElem` to store individual fields instead of generating a constant to fill the entire struct with a single `store`. This is much more efficient at compile time (fixing #320) and vastly reduces the size of the emitted code. Since LLVM no longer needs to keep the data for all fields in "registers" until the store happens, it should also be more efficient at run time in cases where the fields aren't assigned with constants. There's also some code clean-up by removing duplicated logic.
author Frits van Bommel <fvbommel wxs.nl>
date Sat, 06 Jun 2009 20:16:13 +0200
parents 3297edb697eb
children c88b16d4a13c
line wrap: on
line source

#ifndef LDC_GEN_METADATA_H
#define LDC_GEN_METADATA_H

#include "gen/llvm-version.h"

#if LLVM_REV >= 68420
// Yay, we have metadata!

// The metadata interface is still in flux...
#if LLVM_REV >= 71407
    // MDNode was moved into its own header, and contains Value*s
    #include "llvm/MDNode.h"
    typedef llvm::Value MDNodeField;
    
    // Use getNumElements() and getElement() to access elements.
    inline unsigned MD_GetNumElements(llvm::MDNode* N) {
        return N->getNumElements();
    }
    inline MDNodeField* MD_GetElement(llvm::MDNode* N, unsigned i) {
        return N->getElement(i);
    }
#else
    // MDNode is in Constants.h, and contains Constant*s
    #include "llvm/Constants.h"
    typedef llvm::Constant MDNodeField;
    
    // Use getNumOperands() and getOperand() to access elements.
    inline unsigned MD_GetNumElements(llvm::MDNode* N) {
        return N->getNumOperands();
    }
    inline MDNodeField* MD_GetElement(llvm::MDNode* N, unsigned i) {
        return N->getOperand(i);
    }
#endif

#define USE_METADATA
#define METADATA_LINKAGE_TYPE  llvm::GlobalValue::WeakODRLinkage

// *** Metadata for TypeInfo instances ***
#define TD_PREFIX "llvm.ldc.typeinfo."

/// The fields in the metadata node for a TypeInfo instance.
/// (Its name will be TD_PREFIX ~ <Name of TypeInfo global>)
enum TypeDataFields {
#if LLVM_REV < 71407
    // TD_Confirm is disabled for older revisions due to an LLVM bug when
    // MDNodes contain globals
    // (see http://llvm.org/PR4180 / http://llvm.org/PR4046 )
    TD_Confirm = -1,/// The TypeInfo this node is for.
#else
    TD_Confirm,     /// The TypeInfo this node is for.
#endif
    
    TD_Type,        /// A value of the LLVM type corresponding to this D type
    
    // Must be kept last:
    TD_NumFields    /// The number of fields in TypeInfo metadata
};


// *** Metadata for ClassInfo instances ***
#define CD_PREFIX "llvm.ldc.classinfo."

/// The fields in the metadata node for a ClassInfo instance.
/// (Its name will be CD_PREFIX ~ <Name of ClassInfo global>)
enum ClassDataFields {
    CD_BodyType,    /// A value of the LLVM type corresponding to the class body.
    CD_Finalize,    /// True if this class (or a base class) has a destructor.
    CD_CustomDelete,/// True if this class has an overridden delete operator.
    
    // Must be kept last
    CD_NumFields    /// The number of fields in ClassInfo metadata
};

#endif

#endif