87 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
/*===-- attributes.c - tool for testing libLLVM and llvm-c API ------------===*\
 | 
						|
|*                                                                            *|
 | 
						|
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
 | 
						|
|* Exceptions.                                                                *|
 | 
						|
|* See https://llvm.org/LICENSE.txt for license information.                  *|
 | 
						|
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 | 
						|
|*                                                                            *|
 | 
						|
|*===----------------------------------------------------------------------===*|
 | 
						|
|*                                                                            *|
 | 
						|
|* This file implements the --test-attributes and --test-callsite-attributes  *|
 | 
						|
|* commands in llvm-c-test.                                                   *|
 | 
						|
|*                                                                            *|
 | 
						|
\*===----------------------------------------------------------------------===*/
 | 
						|
 | 
						|
#include "llvm-c-test.h"
 | 
						|
 | 
						|
#include <assert.h>
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
int llvm_test_function_attributes(void) {
 | 
						|
  LLVMEnablePrettyStackTrace();
 | 
						|
 | 
						|
  LLVMModuleRef M = llvm_load_module(false, true);
 | 
						|
 | 
						|
  LLVMValueRef F = LLVMGetFirstFunction(M);
 | 
						|
  while (F) {
 | 
						|
    // Read attributes
 | 
						|
    int Idx, ParamCount;
 | 
						|
    for (Idx = LLVMAttributeFunctionIndex, ParamCount = LLVMCountParams(F);
 | 
						|
         Idx <= ParamCount; ++Idx) {
 | 
						|
      int AttrCount = LLVMGetAttributeCountAtIndex(F, Idx);
 | 
						|
      LLVMAttributeRef *Attrs = 0;
 | 
						|
      if (AttrCount) {
 | 
						|
        Attrs =
 | 
						|
            (LLVMAttributeRef *)malloc(AttrCount * sizeof(LLVMAttributeRef));
 | 
						|
        assert(Attrs);
 | 
						|
      }
 | 
						|
      LLVMGetAttributesAtIndex(F, Idx, Attrs);
 | 
						|
      free(Attrs);
 | 
						|
    }
 | 
						|
    F = LLVMGetNextFunction(F);
 | 
						|
  }
 | 
						|
 | 
						|
  LLVMDisposeModule(M);
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int llvm_test_callsite_attributes(void) {
 | 
						|
  LLVMEnablePrettyStackTrace();
 | 
						|
 | 
						|
  LLVMModuleRef M = llvm_load_module(false, true);
 | 
						|
 | 
						|
  LLVMValueRef F = LLVMGetFirstFunction(M);
 | 
						|
  while (F) {
 | 
						|
    LLVMBasicBlockRef BB;
 | 
						|
    for (BB = LLVMGetFirstBasicBlock(F); BB; BB = LLVMGetNextBasicBlock(BB)) {
 | 
						|
      LLVMValueRef I;
 | 
						|
      for (I = LLVMGetFirstInstruction(BB); I; I = LLVMGetNextInstruction(I)) {
 | 
						|
        if (LLVMIsACallInst(I)) {
 | 
						|
          // Read attributes
 | 
						|
          int Idx, ParamCount;
 | 
						|
          for (Idx = LLVMAttributeFunctionIndex,
 | 
						|
              ParamCount = LLVMCountParams(F);
 | 
						|
               Idx <= ParamCount; ++Idx) {
 | 
						|
            int AttrCount = LLVMGetCallSiteAttributeCount(I, Idx);
 | 
						|
            LLVMAttributeRef *Attrs = 0;
 | 
						|
            if (AttrCount) {
 | 
						|
              Attrs = (LLVMAttributeRef *)malloc(
 | 
						|
                  AttrCount * sizeof(LLVMAttributeRef));
 | 
						|
              assert(Attrs);
 | 
						|
            }
 | 
						|
            LLVMGetCallSiteAttributes(I, Idx, Attrs);
 | 
						|
            free(Attrs);
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    F = LLVMGetNextFunction(F);
 | 
						|
  }
 | 
						|
 | 
						|
  LLVMDisposeModule(M);
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 |