1*14675a02SAndroid Build Coastguard Worker /* 2*14675a02SAndroid Build Coastguard Worker * Copyright 2019 Google LLC 3*14675a02SAndroid Build Coastguard Worker * 4*14675a02SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*14675a02SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*14675a02SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*14675a02SAndroid Build Coastguard Worker * 8*14675a02SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*14675a02SAndroid Build Coastguard Worker * 10*14675a02SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*14675a02SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*14675a02SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*14675a02SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*14675a02SAndroid Build Coastguard Worker * limitations under the License. 15*14675a02SAndroid Build Coastguard Worker */ 16*14675a02SAndroid Build Coastguard Worker #ifndef FCP_BASE_SOURCE_LOCATION_H_ 17*14675a02SAndroid Build Coastguard Worker #define FCP_BASE_SOURCE_LOCATION_H_ 18*14675a02SAndroid Build Coastguard Worker 19*14675a02SAndroid Build Coastguard Worker namespace fcp { 20*14675a02SAndroid Build Coastguard Worker 21*14675a02SAndroid Build Coastguard Worker #if (__clang_major__ >= 9) || (__GNUC__ >= 7) 22*14675a02SAndroid Build Coastguard Worker // Using non-standard builtin extensions of gcc and clang to capture call-site 23*14675a02SAndroid Build Coastguard Worker // location 24*14675a02SAndroid Build Coastguard Worker #define FCP_HAS_SOURCE_LOCATION 25*14675a02SAndroid Build Coastguard Worker #define FCP_BUILTIN_LINE() __builtin_LINE() 26*14675a02SAndroid Build Coastguard Worker #define FCP_BUILTIN_FILE() __builtin_FILE() 27*14675a02SAndroid Build Coastguard Worker #else 28*14675a02SAndroid Build Coastguard Worker // If compiler feature unavailable replace with stub values 29*14675a02SAndroid Build Coastguard Worker #define FCP_BUILTIN_LINE() (0) 30*14675a02SAndroid Build Coastguard Worker #define FCP_BUILTIN_FILE() ("<unknown_source>") 31*14675a02SAndroid Build Coastguard Worker 32*14675a02SAndroid Build Coastguard Worker #endif 33*14675a02SAndroid Build Coastguard Worker 34*14675a02SAndroid Build Coastguard Worker class SourceLocationImpl { 35*14675a02SAndroid Build Coastguard Worker public: 36*14675a02SAndroid Build Coastguard Worker static constexpr SourceLocationImpl current( 37*14675a02SAndroid Build Coastguard Worker // Builtins _must_ be referenced from default arguments, so they get 38*14675a02SAndroid Build Coastguard Worker // evaluated at the callsite. 39*14675a02SAndroid Build Coastguard Worker int line = FCP_BUILTIN_LINE(), 40*14675a02SAndroid Build Coastguard Worker const char* file_name = FCP_BUILTIN_FILE()) { 41*14675a02SAndroid Build Coastguard Worker return SourceLocationImpl(line, file_name); 42*14675a02SAndroid Build Coastguard Worker } line()43*14675a02SAndroid Build Coastguard Worker constexpr int line() const { return line_; } file_name()44*14675a02SAndroid Build Coastguard Worker constexpr const char* file_name() const { return file_name_; } 45*14675a02SAndroid Build Coastguard Worker 46*14675a02SAndroid Build Coastguard Worker private: SourceLocationImpl(int line,const char * file_name)47*14675a02SAndroid Build Coastguard Worker constexpr SourceLocationImpl(int line, const char* file_name) 48*14675a02SAndroid Build Coastguard Worker : line_(line), file_name_(file_name) {} 49*14675a02SAndroid Build Coastguard Worker int line_; 50*14675a02SAndroid Build Coastguard Worker const char* file_name_; 51*14675a02SAndroid Build Coastguard Worker }; 52*14675a02SAndroid Build Coastguard Worker 53*14675a02SAndroid Build Coastguard Worker using SourceLocation = SourceLocationImpl; 54*14675a02SAndroid Build Coastguard Worker 55*14675a02SAndroid Build Coastguard Worker } // namespace fcp 56*14675a02SAndroid Build Coastguard Worker 57*14675a02SAndroid Build Coastguard Worker #endif // FCP_BASE_SOURCE_LOCATION_H_ 58