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