diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-12-06 22:05:01 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-12-06 22:05:01 +0000 |
| commit | 66f433a74644fdb4c87990fb76dbb1cada83f520 (patch) | |
| tree | 591a3f70cb8a6722c3c7731eed99b0cbe55f0d09 /clang/tools | |
| parent | 33fe130e1277937657ea05238bdcedc27569fd8d (diff) | |
| download | bcm5719-llvm-66f433a74644fdb4c87990fb76dbb1cada83f520.tar.gz bcm5719-llvm-66f433a74644fdb4c87990fb76dbb1cada83f520.zip | |
[libclang] API enhancements by Joe Groff!
- Exposes a CXType_Vector type kind for vector types.
- Adds generalized versions of the clang_getArrayElementType and clang_getArraySize functions, named clang_getElementType and clang_getNumElements, which work on array, vector, or complex types.
- Adds additional functions for querying function types. clang_isFunctionTypeVariadic returns true if a function type is variadic. clang_getFunctionCallingConv returns an enumeration value indicating the calling convention of the function type. clang_getNumArgTypes returns the number of static argument types, and clang_getArgType gets the type of an argument.
- Adds a clang_getTypedefDeclUnderlyingType function to get the underlying type from a TypedefDecl cursor.
- Adds a clang_getEnumDeclIntegerType function to get the integer type from an EnumDecl cursor.
- Adds clang_getEnumConstantDeclValue and clang_getEnumConstantDeclUnsignedValue functions to get the value of an EnumConstantDecl as a signed or unsigned long long, respectively.
- Exposes a CXCursor_AsmLabelAttr cursor kind for __asm__("label") attributes.
- Alters clang_getCursorSpelling to return the label value for AsmLabelAttr-kind cursors.
llvm-svn: 145972
Diffstat (limited to 'clang/tools')
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 7 | ||||
| -rw-r--r-- | clang/tools/libclang/CXCursor.cpp | 1 | ||||
| -rw-r--r-- | clang/tools/libclang/CXType.cpp | 188 | ||||
| -rw-r--r-- | clang/tools/libclang/libclang.exports | 10 |
4 files changed, 204 insertions, 2 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index d2b5ba7ce5d..e9a67dbfb5b 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -3012,6 +3012,11 @@ CXString clang_getCursorSpelling(CXCursor C) { return createCXString(AA->getAnnotation()); } + if (C.kind == CXCursor_AsmLabelAttr) { + AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C)); + return createCXString(AA->getLabel()); + } + return createCXString(""); } @@ -3335,6 +3340,8 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return createCXString("attribute(override)"); case CXCursor_AnnotateAttr: return createCXString("attribute(annotate)"); + case CXCursor_AsmLabelAttr: + return createCXString("asm label"); case CXCursor_PreprocessingDirective: return createCXString("preprocessing directive"); case CXCursor_MacroDefinition: diff --git a/clang/tools/libclang/CXCursor.cpp b/clang/tools/libclang/CXCursor.cpp index e9cc372fe0b..b4b9ed9d300 100644 --- a/clang/tools/libclang/CXCursor.cpp +++ b/clang/tools/libclang/CXCursor.cpp @@ -46,6 +46,7 @@ static CXCursorKind GetCursorKind(const Attr *A) { case attr::Final: return CXCursor_CXXFinalAttr; case attr::Override: return CXCursor_CXXOverrideAttr; case attr::Annotate: return CXCursor_AnnotateAttr; + case attr::AsmLabel: return CXCursor_AsmLabelAttr; } return CXCursor_UnexposedAttr; diff --git a/clang/tools/libclang/CXType.cpp b/clang/tools/libclang/CXType.cpp index 0e62e2734b0..8dcef4d1a82 100644 --- a/clang/tools/libclang/CXType.cpp +++ b/clang/tools/libclang/CXType.cpp @@ -85,6 +85,7 @@ static CXTypeKind GetTypeKind(QualType T) { TKCASE(FunctionNoProto); TKCASE(FunctionProto); TKCASE(ConstantArray); + TKCASE(Vector); default: return CXType_Unexposed; } @@ -173,6 +174,74 @@ CXType clang_getCursorType(CXCursor C) { return MakeCXType(QualType(), TU); } +CXType clang_getTypedefDeclUnderlyingType(CXCursor C) { + using namespace cxcursor; + CXTranslationUnit TU = cxcursor::getCursorTU(C); + + if (clang_isDeclaration(C.kind)) { + Decl *D = cxcursor::getCursorDecl(C); + + if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D)) { + QualType T = TD->getUnderlyingType(); + return MakeCXType(T, TU); + } + + return MakeCXType(QualType(), TU); + } + + return MakeCXType(QualType(), TU); +} + +CXType clang_getEnumDeclIntegerType(CXCursor C) { + using namespace cxcursor; + CXTranslationUnit TU = cxcursor::getCursorTU(C); + + if (clang_isDeclaration(C.kind)) { + Decl *D = cxcursor::getCursorDecl(C); + + if (EnumDecl *TD = dyn_cast<EnumDecl>(D)) { + QualType T = TD->getIntegerType(); + return MakeCXType(T, TU); + } + + return MakeCXType(QualType(), TU); + } + + return MakeCXType(QualType(), TU); +} + +long long clang_getEnumConstantDeclValue(CXCursor C) { + using namespace cxcursor; + + if (clang_isDeclaration(C.kind)) { + Decl *D = cxcursor::getCursorDecl(C); + + if (EnumConstantDecl *TD = dyn_cast<EnumConstantDecl>(D)) { + return TD->getInitVal().getSExtValue(); + } + + return LLONG_MIN; + } + + return LLONG_MIN; +} + +unsigned long long clang_getEnumConstantDeclUnsignedValue(CXCursor C) { + using namespace cxcursor; + + if (clang_isDeclaration(C.kind)) { + Decl *D = cxcursor::getCursorDecl(C); + + if (EnumConstantDecl *TD = dyn_cast<EnumConstantDecl>(D)) { + return TD->getInitVal().getZExtValue(); + } + + return ULLONG_MAX; + } + + return ULLONG_MAX; +} + CXType clang_getCanonicalType(CXType CT) { if (CT.kind == CXType_Invalid) return CT; @@ -332,6 +401,7 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) { TKIND(FunctionNoProto); TKIND(FunctionProto); TKIND(ConstantArray); + TKIND(Vector); } #undef TKIND return cxstring::createCXString(s); @@ -341,9 +411,80 @@ unsigned clang_equalTypes(CXType A, CXType B) { return A.data[0] == B.data[0] && A.data[1] == B.data[1];; } +unsigned clang_isFunctionTypeVariadic(CXType X) { + QualType T = GetQualType(X); + if (T.isNull()) + return 0; + + if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>()) + return (unsigned)FD->isVariadic(); + + if (T->getAs<FunctionNoProtoType>()) + return 1; + + return 0; +} + +CXCallingConv clang_getFunctionTypeCallingConv(CXType X) { + QualType T = GetQualType(X); + if (T.isNull()) + return CXCallingConv_Invalid; + + if (const FunctionType *FD = T->getAs<FunctionType>()) { +#define TCALLINGCONV(X) case CC_##X: return CXCallingConv_##X + switch (FD->getCallConv()) { + TCALLINGCONV(Default); + TCALLINGCONV(C); + TCALLINGCONV(X86StdCall); + TCALLINGCONV(X86FastCall); + TCALLINGCONV(X86ThisCall); + TCALLINGCONV(X86Pascal); + TCALLINGCONV(AAPCS); + TCALLINGCONV(AAPCS_VFP); + default: + return CXCallingConv_Unexposed; + } +#undef TCALLINGCONV + } + + return CXCallingConv_Invalid; +} + +unsigned clang_getNumArgTypes(CXType X) { + QualType T = GetQualType(X); + if (T.isNull()) + return UINT_MAX; + + if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>()) { + return FD->getNumArgs(); + } + + if (T->getAs<FunctionNoProtoType>()) { + return 0; + } + + return UINT_MAX; +} + +CXType clang_getArgType(CXType X, unsigned i) { + QualType T = GetQualType(X); + if (T.isNull()) + return MakeCXType(QualType(), GetTU(X)); + + if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>()) { + unsigned numArgs = FD->getNumArgs(); + if (i >= numArgs) + return MakeCXType(QualType(), GetTU(X)); + + return MakeCXType(FD->getArgType(i), GetTU(X)); + } + + return MakeCXType(QualType(), GetTU(X)); +} + CXType clang_getResultType(CXType X) { QualType T = GetQualType(X); - if (!T.getTypePtrOrNull()) + if (T.isNull()) return MakeCXType(QualType(), GetTU(X)); if (const FunctionType *FD = T->getAs<FunctionType>()) @@ -366,7 +507,7 @@ CXType clang_getCursorResultType(CXCursor C) { unsigned clang_isPODType(CXType X) { QualType T = GetQualType(X); - if (!T.getTypePtrOrNull()) + if (T.isNull()) return 0; CXTranslationUnit TU = GetTU(X); @@ -375,6 +516,49 @@ unsigned clang_isPODType(CXType X) { return T.isPODType(AU->getASTContext()) ? 1 : 0; } +CXType clang_getElementType(CXType CT) { + QualType ET = QualType(); + QualType T = GetQualType(CT); + const Type *TP = T.getTypePtrOrNull(); + + if (TP) { + switch (TP->getTypeClass()) { + case Type::ConstantArray: + ET = cast<ConstantArrayType> (TP)->getElementType(); + break; + case Type::Vector: + ET = cast<VectorType> (TP)->getElementType(); + break; + case Type::Complex: + ET = cast<ComplexType> (TP)->getElementType(); + break; + default: + break; + } + } + return MakeCXType(ET, GetTU(CT)); +} + +long long clang_getNumElements(CXType CT) { + long long result = -1; + QualType T = GetQualType(CT); + const Type *TP = T.getTypePtrOrNull(); + + if (TP) { + switch (TP->getTypeClass()) { + case Type::ConstantArray: + result = cast<ConstantArrayType> (TP)->getSize().getSExtValue(); + break; + case Type::Vector: + result = cast<VectorType> (TP)->getNumElements(); + break; + default: + break; + } + } + return result; +} + CXType clang_getArrayElementType(CXType CT) { QualType ET = QualType(); QualType T = GetQualType(CT); diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index cf261c8f783..be74f585080 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -47,6 +47,7 @@ clang_executeOnThread clang_findReferencesInFile clang_findReferencesInFileWithBlock clang_formatDiagnostic +clang_getArgType clang_getArrayElementType clang_getArraySize clang_getCString @@ -96,10 +97,15 @@ clang_getDiagnosticOption clang_getDiagnosticRange clang_getDiagnosticSeverity clang_getDiagnosticSpelling +clang_getElementType +clang_getEnumConstantDeclValue +clang_getEnumConstantDeclUnsignedValue +clang_getEnumDeclIntegerType clang_getExpansionLocation clang_getFile clang_getFileName clang_getFileTime +clang_getFunctionTypeCallingConv clang_getIBOutletCollectionType clang_getIncludedFile clang_getInclusions @@ -109,9 +115,11 @@ clang_getLocationForOffset clang_getNullCursor clang_getNullLocation clang_getNullRange +clang_getNumArgTypes clang_getNumCompletionChunks clang_getNumDiagnostics clang_getNumDiagnosticsInSet +clang_getNumElements clang_getNumOverloadedDecls clang_getOverloadedDecl clang_getOverriddenCursors @@ -134,6 +142,7 @@ clang_getTranslationUnitCursor clang_getTranslationUnitSpelling clang_getTypeDeclaration clang_getTypeKindSpelling +clang_getTypedefDeclUnderlyingType clang_hashCursor clang_IndexAction_create clang_IndexAction_dispose @@ -158,6 +167,7 @@ clang_isCursorDefinition clang_isDeclaration clang_isExpression clang_isFileMultipleIncludeGuarded +clang_isFunctionTypeVariadic clang_isInvalid clang_isPODType clang_isPreprocessing |

