174989affSNico Weber // RUN: %clangxx -O0 %s -o %t
274989affSNico Weber // RUN: %env_tool_opts=strip_path_prefix=/TestCases/ %run %t 2>&1 | FileCheck %s
374989affSNico Weber //
474989affSNico Weber // Tests __sanitizer_symbolize_pc.
574989affSNico Weber #include <stdio.h>
674989affSNico Weber #include <sanitizer/common_interface_defs.h>
774989affSNico Weber
874989affSNico Weber int GLOBAL_VAR_ABC;
974989affSNico Weber
SymbolizeSmallBuffer()1074989affSNico Weber void SymbolizeSmallBuffer() {
1174989affSNico Weber char data[] = "abcdef";
12*d83c9005SRainer Orth __sanitizer_symbolize_pc(__sanitizer_return_address(), "%p %F %L", data, 0);
1374989affSNico Weber printf("UNCHANGED '%s'\n", data);
14*d83c9005SRainer Orth __sanitizer_symbolize_pc(__sanitizer_return_address(), "%p %F %L", data, 1);
1574989affSNico Weber printf("EMPTY '%s'\n", data);
16*d83c9005SRainer Orth __sanitizer_symbolize_pc(__sanitizer_return_address(), "%p %F %L", data,
1774989affSNico Weber sizeof(data));
1874989affSNico Weber printf("PARTIAL '%s'\n", data);
1974989affSNico Weber }
2074989affSNico Weber
SymbolizeCaller()2174989affSNico Weber void SymbolizeCaller() {
2274989affSNico Weber char data[100];
23*d83c9005SRainer Orth __sanitizer_symbolize_pc(__sanitizer_return_address(), "%p %F %L", data,
2474989affSNico Weber sizeof(data));
2574989affSNico Weber printf("FIRST_FORMAT %s\n", data);
26*d83c9005SRainer Orth __sanitizer_symbolize_pc(__sanitizer_return_address(),
2774989affSNico Weber "FUNC:%f LINE:%l FILE:%s", data, sizeof(data));
2874989affSNico Weber printf("SECOND_FORMAT %s\n", data);
29*d83c9005SRainer Orth __sanitizer_symbolize_pc(__sanitizer_return_address(),
3074989affSNico Weber "LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
3174989affSNico Weber "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
3274989affSNico Weber "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
3374989affSNico Weber "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
3474989affSNico Weber "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONG"
35*d83c9005SRainer Orth "FUNC:%f LINE:%l FILE:%s",
36*d83c9005SRainer Orth data, sizeof(data));
3774989affSNico Weber printf("LONG_FORMAT %s\n", data);
3874989affSNico Weber }
3974989affSNico Weber
40*d83c9005SRainer Orth struct s {
41*d83c9005SRainer Orth int i;
42*d83c9005SRainer Orth };
43*d83c9005SRainer Orth
SymbolizeSRet()44*d83c9005SRainer Orth struct s SymbolizeSRet() {
45*d83c9005SRainer Orth char data[100];
46*d83c9005SRainer Orth __sanitizer_symbolize_pc(__sanitizer_return_address(),
47*d83c9005SRainer Orth "FUNC:%f LINE:%l FILE:%s", data, sizeof(data));
48*d83c9005SRainer Orth printf("SRET: %s\n", data);
49*d83c9005SRainer Orth struct s s = {1};
50*d83c9005SRainer Orth return s;
51*d83c9005SRainer Orth }
52*d83c9005SRainer Orth
SymbolizeData()5374989affSNico Weber void SymbolizeData() {
5474989affSNico Weber char data[100];
5574989affSNico Weber __sanitizer_symbolize_global(&GLOBAL_VAR_ABC, "%g %s:%l", data, sizeof(data));
5674989affSNico Weber printf("GLOBAL: %s\n", data);
5774989affSNico Weber }
5874989affSNico Weber
main()5974989affSNico Weber int main() {
6074989affSNico Weber // CHECK: UNCHANGED 'abcdef'
6174989affSNico Weber // CHECK: EMPTY ''
6274989affSNico Weber // CHECK: PARTIAL '0x{{.*}}'
6374989affSNico Weber SymbolizeSmallBuffer();
6474989affSNico Weber
6574989affSNico Weber // CHECK: FIRST_FORMAT 0x{{.*}} in main symbolize_pc.cpp:[[@LINE+2]]
6674989affSNico Weber // CHECK: SECOND_FORMAT FUNC:main LINE:[[@LINE+1]] FILE:symbolize_pc.cpp
6774989affSNico Weber SymbolizeCaller();
6874989affSNico Weber
69*d83c9005SRainer Orth struct s s;
70*d83c9005SRainer Orth // CHECK: SRET: FUNC:main LINE:[[@LINE+1]] FILE:symbolize_pc.cpp
71*d83c9005SRainer Orth s = SymbolizeSRet();
72*d83c9005SRainer Orth
7374989affSNico Weber // CHECK: GLOBAL: GLOBAL_VAR_ABC
7474989affSNico Weber SymbolizeData();
7574989affSNico Weber }
76