// Get description from variable or from declared type, or NULL. const char * getDescription(ModelDescription* md, ScalarVariable* sv) { const char* value = getString(sv, att_description); Type* type; if (value) return value; // found // search declared type, if any type = getDeclaredType(md, getString(sv->typeSpec, att_declaredType)); return type ? getString(type, att_description) : NULL; }
const char* getString2(ModelDescription* md, void* tp, Att a) { Type* type; const char* value = getString(tp, a); if (value) return value; // found // search declared type, if any type = getDeclaredType(md, getString(tp, att_declaredType)); return type ? getString(type->typeSpec, a) : NULL; }
// Get attribute value from scalar variable given by vr and type, // incl. default value provided by declared type, if any. const char * getVariableAttributeString(ModelDescription* md, fmiValueReference vr, Elm type, Att a){ const char* value; //const char* declaredType; Type* tp; ScalarVariable* sv = getVariable(md, vr, type); if (!sv) return NULL; value = getString(sv->typeSpec, a); if (value) return value; // found // search declared type, if any tp = getDeclaredType(md, getString(sv->typeSpec, att_declaredType)); return tp ? getString(tp->typeSpec, a) : NULL; }
/// HandleArgument - This is invoked by the target-independent code for each /// argument type passed into the function. It potentially breaks down the /// argument and invokes methods on the client that indicate how its pieces /// should be handled. This handles things like decimating structures into /// their fields. void DefaultABI::HandleArgument(tree type, std::vector<const Type*> &ScalarElts, Attributes *Attributes) { unsigned Size = 0; bool DontCheckAlignment = false; const Type *Ty = ConvertType(type); // Figure out if this field is zero bits wide, e.g. {} or [0 x int]. Do // not include variable sized fields here. std::vector<const Type*> Elts; if (Ty->isVoidTy()) { // Handle void explicitly as an opaque type. const Type *OpTy = OpaqueType::get(getGlobalContext()); C.HandleScalarArgument(OpTy, type); ScalarElts.push_back(OpTy); } else if (isPassedByInvisibleReference(type)) { // variable size -> by-ref. const Type *PtrTy = Ty->getPointerTo(); C.HandleByInvisibleReferenceArgument(PtrTy, type); ScalarElts.push_back(PtrTy); } else if (Ty->isVectorTy()) { if (LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS(type)) { PassInIntegerRegisters(type, ScalarElts, 0, false); } else if (LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR(type)) { C.HandleByValArgument(Ty, type); if (Attributes) { *Attributes |= Attribute::ByVal; *Attributes |= Attribute::constructAlignmentFromInt(LLVM_BYVAL_ALIGNMENT(type)); } } else { C.HandleScalarArgument(Ty, type); ScalarElts.push_back(Ty); } } else if (LLVM_TRY_PASS_AGGREGATE_CUSTOM(type, ScalarElts, C.getCallingConv(), &C)) { // Nothing to do. } else if (Ty->isSingleValueType()) { C.HandleScalarArgument(Ty, type); ScalarElts.push_back(Ty); } else if (LLVM_SHOULD_PASS_AGGREGATE_AS_FCA(type, Ty)) { C.HandleFCAArgument(Ty, type); } else if (LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(type, Ty, C.getCallingConv(), Elts)) { if (!LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(Elts, ScalarElts, C.isShadowReturn(), C.getCallingConv())) PassInMixedRegisters(Ty, Elts, ScalarElts); else { C.HandleByValArgument(Ty, type); if (Attributes) { *Attributes |= Attribute::ByVal; *Attributes |= Attribute::constructAlignmentFromInt(LLVM_BYVAL_ALIGNMENT(type)); } } } else if (LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(type, Ty)) { C.HandleByValArgument(Ty, type); if (Attributes) { *Attributes |= Attribute::ByVal; *Attributes |= Attribute::constructAlignmentFromInt(LLVM_BYVAL_ALIGNMENT(type)); } } else if (LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS(type, &Size, &DontCheckAlignment)) { PassInIntegerRegisters(type, ScalarElts, Size, DontCheckAlignment); } else if (isZeroSizedStructOrUnion(type)) { // Zero sized struct or union, just drop it! ; } else if (TREE_CODE(type) == RECORD_TYPE) { for (tree Field = TYPE_FIELDS(type); Field; Field = TREE_CHAIN(Field)) if (TREE_CODE(Field) == FIELD_DECL) { const tree Ftype = getDeclaredType(Field); const Type *FTy = ConvertType(Ftype); unsigned FNo = GET_LLVM_FIELD_INDEX(Field); assert(FNo != ~0U && "Case not handled yet!"); // Currently, a bvyal type inside a non-byval struct is a zero-length // object inside a bigger object on x86-64. This type should be // skipped (but only when it is inside a bigger object). // (We know there currently are no other such cases active because // they would hit the assert in FunctionPrologArgumentConversion:: // HandleByValArgument.) if (!LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(Ftype, FTy)) { C.EnterField(FNo, Ty); HandleArgument(getDeclaredType(Field), ScalarElts); C.ExitField(); } } } else if (TREE_CODE(type) == COMPLEX_TYPE) { C.EnterField(0, Ty); HandleArgument(TREE_TYPE(type), ScalarElts); C.ExitField(); C.EnterField(1, Ty); HandleArgument(TREE_TYPE(type), ScalarElts); C.ExitField(); } else if ((TREE_CODE(type) == UNION_TYPE) || (TREE_CODE(type) == QUAL_UNION_TYPE)) { HandleUnion(type, ScalarElts); } else if (TREE_CODE(type) == ARRAY_TYPE) { const ArrayType *ATy = cast<ArrayType>(Ty); for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) { C.EnterField(i, Ty); HandleArgument(TREE_TYPE(type), ScalarElts); C.ExitField(); } } else { assert(0 && "unknown aggregate type!"); abort(); } }
virtual bool isType() { return getDeclaredType(); }