[dfsan] Introduce dfsan_read_label runtime function.
Differential Revision: http://llvm-reviews.chandlerc.com/D1349 llvm-svn: 188319
This commit is contained in:
		
							parent
							
								
									04632f1f16
								
							
						
					
					
						commit
						7da504faa4
					
				| 
						 | 
				
			
			@ -61,6 +61,9 @@ void dfsan_add_label(dfsan_label label, void *addr, size_t size);
 | 
			
		|||
/// value.
 | 
			
		||||
dfsan_label dfsan_get_label(long data);
 | 
			
		||||
 | 
			
		||||
/// Retrieves the label associated with the data at the given address.
 | 
			
		||||
dfsan_label dfsan_read_label(const void *addr, size_t size);
 | 
			
		||||
 | 
			
		||||
/// Retrieves a pointer to the dfsan_label_info struct for the given label.
 | 
			
		||||
const struct dfsan_label_info *dfsan_get_label_info(dfsan_label label);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -120,7 +120,7 @@ dfsan_label __dfsan_union(dfsan_label l1, dfsan_label l2) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
extern "C" SANITIZER_INTERFACE_ATTRIBUTE
 | 
			
		||||
dfsan_label __dfsan_union_load(dfsan_label *ls, size_t n) {
 | 
			
		||||
dfsan_label __dfsan_union_load(const dfsan_label *ls, size_t n) {
 | 
			
		||||
  dfsan_label label = ls[0];
 | 
			
		||||
  for (size_t i = 1; i != n; ++i) {
 | 
			
		||||
    dfsan_label next_label = ls[i];
 | 
			
		||||
| 
						 | 
				
			
			@ -171,6 +171,13 @@ SANITIZER_INTERFACE_ATTRIBUTE dfsan_label dfsan_get_label(long data) {
 | 
			
		|||
  return __dfsan_arg_tls[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SANITIZER_INTERFACE_ATTRIBUTE dfsan_label
 | 
			
		||||
dfsan_read_label(const void *addr, size_t size) {
 | 
			
		||||
  if (size == 0)
 | 
			
		||||
    return 0;
 | 
			
		||||
  return __dfsan_union_load(shadow_for(addr), size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SANITIZER_INTERFACE_ATTRIBUTE
 | 
			
		||||
const struct dfsan_label_info *dfsan_get_label_info(dfsan_label label) {
 | 
			
		||||
  __dfsan_retval_tls = 0;  // Ensures return value is unlabelled in the caller.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,5 +13,8 @@ int main(void) {
 | 
			
		|||
  dfsan_label new_label = dfsan_get_label(i);
 | 
			
		||||
  assert(i_label == new_label);
 | 
			
		||||
 | 
			
		||||
  dfsan_label read_label = dfsan_read_label(&i, sizeof(i));
 | 
			
		||||
  assert(i_label == read_label);
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,5 +34,8 @@ int main(void) {
 | 
			
		|||
  assert(dfsan_has_label(ijk_label, j_label));
 | 
			
		||||
  assert(dfsan_has_label(ijk_label, k_label));
 | 
			
		||||
 | 
			
		||||
  struct { int i, j; } s = { i, j };
 | 
			
		||||
  assert(dfsan_read_label(&s, sizeof(s)) == ij_label);
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue