aboutsummaryrefslogtreecommitdiff
path: root/abi-compliance-checker.pl
diff options
context:
space:
mode:
Diffstat (limited to 'abi-compliance-checker.pl')
-rw-r--r--abi-compliance-checker.pl92
1 files changed, 69 insertions, 23 deletions
diff --git a/abi-compliance-checker.pl b/abi-compliance-checker.pl
index 83a3325..9cfbb24 100644
--- a/abi-compliance-checker.pl
+++ b/abi-compliance-checker.pl
@@ -10419,32 +10419,34 @@ sub isReserved($)
sub isPublic($$)
{
my ($TypePtr, $FieldPos) = @_;
+
return 0 if(not $TypePtr);
return 0 if(not defined $TypePtr->{"Memb"}{$FieldPos});
return 0 if(not defined $TypePtr->{"Memb"}{$FieldPos}{"name"});
- if(not $TypePtr->{"Memb"}{$FieldPos}{"access"})
- { # by name in C language
- # FIXME: add other methods to detect private members
- my $MName = $TypePtr->{"Memb"}{$FieldPos}{"name"};
- if($MName=~/priv|abidata|parent_object/i)
- { # C-styled private data
- return 0;
- }
- if(lc($MName) eq "abi")
- { # ABI information/reserved field
- return 0;
- }
- if(isReserved($MName))
- { # reserved fields
- return 0;
- }
- return 1;
- }
- elsif($TypePtr->{"Memb"}{$FieldPos}{"access"} ne "private")
+
+ my $Access = $TypePtr->{"Memb"}{$FieldPos}{"access"};
+ if($Access eq "private")
{ # by access in C++ language
- return 1;
+ return 0;
}
- return 0;
+
+ # by name in C language
+ # TODO: add other methods to detect private members
+ my $MName = $TypePtr->{"Memb"}{$FieldPos}{"name"};
+ if($MName=~/priv|abidata|parent_object/i)
+ { # C-styled private data
+ return 0;
+ }
+ if(lc($MName) eq "abi")
+ { # ABI information/reserved field
+ return 0;
+ }
+ if(isReserved($MName))
+ { # reserved fields
+ return 0;
+ }
+
+ return 1;
}
sub getVTable_Real($$)
@@ -19763,8 +19765,26 @@ sub getArch_Object($)
return $Arch;
}
}
+ elsif($OStarget=~/macos/)
+ {
+ my $OtoolCmd = get_CmdPath("otool");
+ if(not $OtoolCmd) {
+ exitStatus("Not_Found", "can't find \"otool\"");
+ }
+
+ my $Cmd = $OtoolCmd." -hv -arch all \"$Path\"";
+ my $Out = qx/$Cmd/;
+
+ if($Out=~/X86_64/i) {
+ return "x86_64";
+ }
+ elsif($Out=~/X86/i) {
+ return "x86";
+ }
+ }
else
- { # macos, etc.
+ {
+ exitStatus("Error", "Not implemented yet");
# TODO
}
@@ -19896,9 +19916,26 @@ sub getArch_GCC($)
return $Cache{"getArch_GCC"}{$LibVersion};
}
+ if(not $GCC_PATH) {
+ return undef;
+ }
+
my $Arch = undef;
- if($GCC_PATH)
+ if(my $Target = get_dumpmachine($GCC_PATH))
+ {
+ if($Target=~/x86_64/) {
+ $Arch = "x86_64";
+ }
+ elsif($Target=~/i[3-6]86/) {
+ $Arch = "x86";
+ }
+ elsif($Target=~/\Aarm/i) {
+ $Arch = "arm";
+ }
+ }
+
+ if(not $Arch)
{
writeFile("$TMP_DIR/test.c", "int main(){return 0;}\n");
@@ -21034,6 +21071,15 @@ sub detect_default_paths($)
}
}
+ if($OStarget=~/macos/)
+ {
+ my $Info = `$GCC_PATH --version`;
+
+ if($Info=~/clang/i) {
+ printMsg("WARNING", "doesn't work with clang, please install GCC instead (and select it by -gcc-path option)");
+ }
+ }
+
if($GCC_Ver)
{
my $GccTarget = get_dumpmachine($GCC_PATH);