Author: Archibald Elliott Date: 2022-01-07T13:07:30Z New Revision: 3aec4b3d348d69e6c1ead7cba54677b855293983
URL: https://github.com/llvm/llvm-project/commit/3aec4b3d348d69e6c1ead7cba54677b855293983 DIFF: https://github.com/llvm/llvm-project/commit/3aec4b3d348d69e6c1ead7cba54677b855293983.diff LOG: Revert "Unaligned Access Warning Added" This reverts commits: - 2cd2600abaf3c604889b77ab408fdf89d7a21c48 - 11c67e5a4e99f51ec66c9781710f81955cfd5e24 Due to test failures on Windows. Added: Modified: clang/include/clang/Basic/DiagnosticASTKinds.td clang/include/clang/Basic/DiagnosticGroups.td clang/lib/AST/RecordLayoutBuilder.cpp clang/lib/Driver/ToolChains/Arch/AArch64.cpp clang/lib/Driver/ToolChains/Arch/AArch64.h clang/lib/Driver/ToolChains/Arch/ARM.cpp clang/lib/Driver/ToolChains/Clang.cpp Removed: clang/test/Sema/test-wunaligned-access.c clang/test/Sema/test-wunaligned-access.cpp ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticASTKinds.td b/clang/include/clang/Basic/DiagnosticASTKinds.td index d870a9f06592a..d788c85179142 100644 --- a/clang/include/clang/Basic/DiagnosticASTKinds.td +++ b/clang/include/clang/Basic/DiagnosticASTKinds.td @@ -590,9 +590,4 @@ def warn_padded_struct_size : Warning< InGroup<Padded>, DefaultIgnore; def warn_unnecessary_packed : Warning< "packed attribute is unnecessary for %0">, InGroup<Packed>, DefaultIgnore; - -// -Wunaligned-access -def warn_unaligned_access : Warning< - "field %1 within its parent %0 has an alignment greater than its parent " - "this may be caused by %0 being packed and can lead to unaligned accesses">, InGroup<UnalignedAccess>, DefaultIgnore; } diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index bc4bb17b271d8..c0642efaee4eb 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -542,7 +542,6 @@ def ExplicitInitializeCall : DiagGroup<"explicit-initialize-call">; def OrderedCompareFunctionPointers : DiagGroup<"ordered-compare-function-pointers">; def Packed : DiagGroup<"packed">; def Padded : DiagGroup<"padded">; -def UnalignedAccess : DiagGroup<"unaligned-access">; def PessimizingMove : DiagGroup<"pessimizing-move">; def ReturnStdMove : DiagGroup<"return-std-move">; diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 8d2fe4660a3cd..3e39ec1c718d1 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2021,7 +2021,6 @@ void ItaniumRecordLayoutBuilder::LayoutField(const FieldDecl *D, CharUnits UnpackedFieldAlign = !DefaultsToAIXPowerAlignment ? FieldAlign : PreferredAlign; CharUnits UnpackedFieldOffset = FieldOffset; - CharUnits OriginalFieldAlign = UnpackedFieldAlign; if (FieldPacked) { FieldAlign = CharUnits::One(); @@ -2106,22 +2105,6 @@ void ItaniumRecordLayoutBuilder::LayoutField(const FieldDecl *D, // Remember max struct/class ABI-specified alignment. UnadjustedAlignment = std::max(UnadjustedAlignment, FieldAlign); UpdateAlignment(FieldAlign, UnpackedFieldAlign, PreferredAlign); - - // For checking the alignment of inner fields against - // the alignment of its parent record. - if (const RecordDecl *RD = D->getParent()) { - // Check if packed attribute or pragma pack is present. - if (RD->hasAttr<PackedAttr>() || !MaxFieldAlignment.isZero()) - if (FieldAlign < OriginalFieldAlign) - if (D->getType()->isRecordType()) { - // If the offset is a multiple of the alignment of - // the type, raise the warning. - // TODO: Takes no account the alignment of the outer struct - if (FieldOffset % OriginalFieldAlign != 0) - Diag(D->getLocation(), diag::warn_unaligned_access) - << Context.getTypeDeclType(RD) << D->getName(); - } - } } void ItaniumRecordLayoutBuilder::FinishLayout(const NamedDecl *D) { diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp index 89a77a368ef02..9ffb5d73b2aad 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -221,7 +221,6 @@ getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, void aarch64::getAArch64TargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, - llvm::opt::ArgStringList &CmdArgs, std::vector<StringRef> &Features, bool ForAS) { Arg *A; @@ -465,16 +464,10 @@ void aarch64::getAArch64TargetFeatures(const Driver &D, if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, options::OPT_munaligned_access)) { - if (A->getOption().matches(options::OPT_mno_unaligned_access)) { + if (A->getOption().matches(options::OPT_mno_unaligned_access)) Features.push_back("+strict-align"); - if (!ForAS) - CmdArgs.push_back("-Wunaligned-access"); - } - } else if (Triple.isOSOpenBSD()) { + } else if (Triple.isOSOpenBSD()) Features.push_back("+strict-align"); - if (!ForAS) - CmdArgs.push_back("-Wunaligned-access"); - } if (Args.hasArg(options::OPT_ffixed_x1)) Features.push_back("+reserve-x1"); diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.h b/clang/lib/Driver/ToolChains/Arch/AArch64.h index 0cdc2ec725e02..d47c402d4a42d 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.h +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.h @@ -22,7 +22,6 @@ namespace aarch64 { void getAArch64TargetFeatures(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args, - llvm::opt::ArgStringList &CmdArgs, std::vector<llvm::StringRef> &Features, bool ForAS); diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp index 1055d7800b63e..4013cf230026b 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -769,12 +769,10 @@ void arm::getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, } // Kernel code has more strict alignment requirements. - if (KernelOrKext) { + if (KernelOrKext) Features.push_back("+strict-align"); - if (!ForAS) - CmdArgs.push_back("-Wunaligned-access"); - } else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, - options::OPT_munaligned_access)) { + else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, + options::OPT_munaligned_access)) { if (A->getOption().matches(options::OPT_munaligned_access)) { // No v6M core supports unaligned memory access (v6M ARM ARM A3.2). if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m) @@ -783,11 +781,8 @@ void arm::getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, // access either. else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline) D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base"; - } else { + } else Features.push_back("+strict-align"); - if (!ForAS) - CmdArgs.push_back("-Wunaligned-access"); - } } else { // Assume pre-ARMv6 doesn't support unaligned accesses. // @@ -806,23 +801,14 @@ void arm::getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, int VersionNum = getARMSubArchVersionNumber(Triple); if (Triple.isOSDarwin() || Triple.isOSNetBSD()) { if (VersionNum < 6 || - Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m) { + Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m) Features.push_back("+strict-align"); - if (!ForAS) - CmdArgs.push_back("-Wunaligned-access"); - } } else if (Triple.isOSLinux() || Triple.isOSNaCl() || Triple.isOSWindows()) { - if (VersionNum < 7) { + if (VersionNum < 7) Features.push_back("+strict-align"); - if (!ForAS) - CmdArgs.push_back("-Wunaligned-access"); - } - } else { + } else Features.push_back("+strict-align"); - if (!ForAS) - CmdArgs.push_back("-Wunaligned-access"); - } } // llvm does not support reserving registers in general. There is support diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 5f4e6cb6dc496..d4afefcb24a98 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -346,8 +346,7 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, case llvm::Triple::aarch64: case llvm::Triple::aarch64_32: case llvm::Triple::aarch64_be: - aarch64::getAArch64TargetFeatures(D, Triple, Args, CmdArgs, Features, - ForAS); + aarch64::getAArch64TargetFeatures(D, Triple, Args, Features, ForAS); break; case llvm::Triple::x86: case llvm::Triple::x86_64: diff --git a/clang/test/Sema/test-wunaligned-access.c b/clang/test/Sema/test-wunaligned-access.c deleted file mode 100644 index 092345e85874b..0000000000000 --- a/clang/test/Sema/test-wunaligned-access.c +++ /dev/null @@ -1,476 +0,0 @@ -// RUN: %clang_cc1 %s -verify -fsyntax-only -Wunaligned-access -// expected-no-diagnostics -// Set 1 -struct T1 { - char a; - int b; -}; - -struct __attribute__((packed)) U1 { - char a; - struct T1 b; - int c; -}; - -struct __attribute__((packed)) U2 { - char a; - struct T1 b __attribute__((aligned(2))); - int c; -}; - -struct __attribute__((packed)) U3 { - char a; - struct T1 b __attribute__((aligned(4))); - int c; -}; - -struct __attribute__((aligned(2))) U4 { - char a; - struct T1 b; - int c; -}; - -struct U5 { - char a; - struct T1 b; - int c; -}; - -struct U6 { - char a; - int b; - struct T1 c __attribute__((aligned(2))); -}; - -struct __attribute__((packed)) U7 { - short a; - short b; - char c; - struct T1 d; -}; - -struct U8 { - short a; - short b; - char c; - struct T1 d; -}; - -struct __attribute__((packed)) U9 { - short a; - short b; - char c; - struct T1 d __attribute__((aligned(4))); -}; - -struct __attribute__((packed)) U10 { - short a; - short b; - char c; - struct T1 d __attribute__((aligned(2))); -}; - -struct __attribute__((aligned(2))) U11 { - short a; - short b; - char c; - struct T1 d; -}; - -// Set 2 -#pragma pack(push, 1) - -struct U12 { - char a; - struct T1 b; - int c; -}; - -struct __attribute__((packed)) U13 { - char a; - struct T1 b; - int c; -}; - -struct __attribute__((packed)) U14 { - char a; - struct T1 b __attribute__((aligned(4))); - int c; -}; - -struct __attribute__((aligned(2))) U15 { - char a; - struct T1 b; - int c; -}; - -struct U16 { - char a; - char b; - short c; - struct T1 d; -}; - -struct U17 { - char a; - char b; - short c; - struct T1 d __attribute__((aligned(4))); -}; - -struct __attribute__((packed)) U18 { - char a; - short b; - struct T1 c __attribute__((aligned(4))); -}; - -struct __attribute__((aligned(4))) U19 { - char a; - struct T1 b; - int c; -}; - -struct __attribute__((aligned(4))) U20 { - char a[4]; - struct T1 b; - int c; -}; - -struct U21 { - char a; - short c; - struct T1 d; -}; - -struct U22 { - char a; - short c; - struct T1 d __attribute__((aligned(4))); -}; - -#pragma pack(pop) - -// Set 3 - -struct __attribute__((packed)) U23 { - char a; - struct T1 b; - int c; -}; - -struct U24 { - char a; - struct T1 b; - int c; -}; - -struct U25 { - char a; - char b; - short c; - struct T1 d; -}; - -#pragma pack(push, 1) - -struct U26 { - char a; - char b; - short c; - struct T1 d; -}; - -#pragma pack(pop) - -// Set 4 - -struct __attribute__((packed)) T2 { - char a; - struct T1 b; -}; - -struct T3 { - char a; - struct T1 b; -}; - -struct __attribute__((packed)) U27 { - char a; - struct T2 b; - int c; -}; - -struct U28 { - char a; - char _p[2]; - struct T2 b; - int c; -}; - -struct U29 { - char a; - struct T3 b; - int c; -}; - -struct __attribute__((packed)) U30 { - char a; - struct T3 b; - int c; -}; - -struct __attribute__((packed)) U31 { - char a; - struct T2 b __attribute__((aligned(4))); -}; - -struct __attribute__((packed)) U32 { - char a; - char b; - char c; - char d; - struct T3 e; -}; - -struct __attribute__((packed)) U33 { - char a; - char b; - char c; - char d; - struct T2 e __attribute__((aligned(4))); -}; - -struct __attribute__((packed)) U34 { - char a; - struct T1 b __attribute__((packed)); - struct T2 c; -}; - -struct __attribute__((packed)) U35 { - char a; - struct T4 { - char b; - struct T1 c; - } d; -}; - -// Set 5 - -#pragma pack(push, 1) -struct T5 { - char a; - struct T1 b; -}; -#pragma pack(pop) - -#pragma pack(push, 1) -struct U36 { - char a; - struct T5 b; - int c; -}; - -struct U37 { - char a; - struct T3 b; - int c; -}; -#pragma pack(pop) -struct U38 { - char a; - struct T5 b __attribute__((aligned(4))); - int c; -}; - -struct U39 { - char a; -#pragma pack(push, 4) - struct T5 b; -#pragma pack(pop) - int c; -}; - -// Set 6 - -struct __attribute__((packed)) A1 { - char a; - struct T1 b; -}; - -struct A2 { - char a; - struct T1 b; -}; - -struct __attribute__((packed)) A3 { - char a; - struct T1 b __attribute__((aligned(4))); -}; - -#pragma pack(push, 1) -struct A4 { - char a; - struct T1 b; -}; - -struct A5 { - char a; - struct T1 b __attribute__((aligned(4))); -}; -#pragma pack(pop) - -struct __attribute__((packed)) A6 { - struct T1 a; -}; - -struct A7 { - char a; - struct T1 b __attribute__((packed)); -}; - -struct A8 { - char a; - char b; - short c; - struct T1 d; -}; - -struct A9 { - char a; - struct T2 b; -}; - -struct A10 { - char a; - struct T2 b __attribute__((aligned(4))); -}; - -struct __attribute__((packed)) A11 { - char a; - struct T2 b; -}; - -struct __attribute__((packed)) U40 { - char a; - struct A1 b; - int c; -}; - -struct __attribute__((packed)) U41 { - char a; - struct A3 b; - int c; -}; - -#pragma pack(push, 1) -struct U42 { - char a; - struct A1 b; - int c; -}; -#pragma pack(pop) - -struct __attribute__((packed)) U43 { - char a; - struct A9 b; - int c; -}; - -struct __attribute__((packed)) U44 { - char a; - struct A10 b; - int c; -}; - -#pragma pack(push, 1) - -struct U45 { - char a; - struct A10 b; - int c; -}; - -#pragma pack(pop) - -struct __attribute__((packed)) U46 { - char a; - struct A2 b; - int c; -}; - -struct __attribute__((packed)) U47 { - char a; - struct A8 b; - int c; -}; - -#pragma pack(push, 1) -struct U48 { - char a; - struct A8 b; - int c; -}; -#pragma pack(pop) - -struct U49 { - char a; - struct A11 b; - int c; -}; - -struct U50 { - char a; - struct A1 b; - int c; -}; - -struct U1 s1; -struct U2 s2; -struct U3 s3; -struct U4 s4; -struct U5 s5; -struct U6 s6; -struct U7 s7; -struct U8 s8; -struct U9 s9; -struct U10 s10; -struct U11 s11; -struct U12 s12; -struct U13 s13; -struct U14 s14; -struct U15 s15; -struct U16 s16; -struct U17 s17; -struct U18 s18; -struct U19 s19; -struct U20 s20; -struct U21 s21; -struct U22 s22; -struct U23 s23; -struct U24 s24; -struct U25 s25; -struct U26 s26; -struct U27 s27; -struct U28 s28; -struct U29 s29; -struct U30 s30; -struct U31 s31; -struct U32 s32; -struct U33 s33; -struct U34 s34; -struct U35 s35; -struct U36 s36; -struct U37 s37; -struct U38 s38; -struct U39 s39; -struct U40 s40; -struct U41 s41; -struct U42 s42; -struct U43 s43; -struct U44 s44; -struct U45 s45; -struct U46 s46; -struct U47 s47; -struct U48 s48; -struct U49 s49; -struct U50 s50; diff --git a/clang/test/Sema/test-wunaligned-access.cpp b/clang/test/Sema/test-wunaligned-access.cpp deleted file mode 100644 index 0a8f7ee3c5c05..0000000000000 --- a/clang/test/Sema/test-wunaligned-access.cpp +++ /dev/null @@ -1,285 +0,0 @@ -// RUN: %clang_cc1 %s -verify -fsyntax-only -Wunaligned-access - -// Packed-Unpacked Tests (No Pragma) - -struct T1 { - char a; - int b; -}; - -struct __attribute__((packed)) U1 // Causes warning -{ - char a; - T1 b; // expected-warning {{field b within its parent 'U1' has an alignment greater than its parent this may be caused by 'U1' being packed and can lead to unaligned accesses}} - int c; -}; - -struct __attribute__((packed)) U2 // No warning -{ - char a; - T1 b __attribute__((aligned(4))); - int c; -}; - -struct __attribute__((packed)) U3 // No warning -{ - char a; - char b; - short c; - T1 d; -}; - -struct __attribute__((packed)) U4 // No warning -{ - T1 a; - int b; -}; - -struct __attribute__((aligned(4), packed)) U5 // Causes warning -{ - char a; - T1 b; // expected-warning {{field b within its parent 'U5' has an alignment greater than its parent this may be caused by 'U5' being packed and can lead to unaligned accesses}} - int c; -}; - -struct __attribute__((aligned(4), packed)) U6 // No warning -{ - char a; - char b; - short c; - T1 d; -}; - -// Packed-Unpacked Tests with Pragma - -#pragma pack(push, 1) - -struct __attribute__((packed)) U7 // Causes warning -{ - char a; - T1 b; // expected-warning {{field b within its parent 'U7' has an alignment greater than its parent this may be caused by 'U7' being packed and can lead to unaligned accesses}} - int c; -}; - -struct __attribute__((packed)) U8 { - char a; - T1 b __attribute__((aligned(4))); // expected-warning {{field b within its parent 'U8' has an alignment greater than its parent this may be caused by 'U8' being packed and can lead to unaligned accesses}} - int c; -}; - -struct __attribute__((aligned(4))) U9 { - char a; - T1 b; // expected-warning {{field b within its parent 'U9' has an alignment greater than its parent this may be caused by 'U9' being packed and can lead to unaligned accesses}} - int c; -}; - -struct U10 { - char a; - T1 b; // expected-warning {{field b within its parent 'U10' has an alignment greater than its parent this may be caused by 'U10' being packed and can lead to unaligned accesses}} - int c; -}; - -#pragma pack(pop) - -// Packed-Packed Tests - -struct __attribute__((packed)) T2 { - char a; - int b; -}; - -struct __attribute__((packed)) U11 { - char a; - T2 b; - int c; -}; - -#pragma pack(push, 1) -struct U12 // No warning -{ - char a; - T2 b; - int c; -}; -#pragma pack(pop) - -// Unpacked-Packed Tests - -struct U13 // No warning -{ - char a; - T2 b; - int c; -}; - -struct U14 // No warning -{ - char a; - T2 b __attribute__((aligned(4))); - int c; -}; - -// Unpacked-Unpacked Test - -struct T3 { - char a; - int b; -}; - -struct U15 // No warning -{ - char a; - T3 b; - int c; -}; - -// Packed-Packed-Unpacked Test (No pragma) - -struct __attribute__((packed)) A1 { - char a; - T1 b; // expected-warning {{field b within its parent 'A1' has an alignment greater than its parent this may be caused by 'A1' being packed and can lead to unaligned accesses}} -}; - -struct __attribute__((packed)) U16 // No warning -{ - char a; - A1 b; - int c; -}; - -struct __attribute__((packed)) A2 // No warning -{ - char a; - T1 b __attribute__((aligned(4))); -}; - -struct __attribute__((packed)) U17 // Caused warning -{ - char a; - A2 b; // expected-warning {{field b within its parent 'U17' has an alignment greater than its parent this may be caused by 'U17' being packed and can lead to unaligned accesses}} - int c; -}; - -// Packed-Unpacked-Packed tests - -struct A3 { - char a; - T2 b; -}; - -struct __attribute__((packed)) U18 { - char a; - A3 b; - int c; -}; - -struct A4 { - char a; - T2 b; - int c; -}; - -#pragma pack(push, 1) -struct U19 // Caused warning -{ - char a; - A4 b; // expected-warning {{field b within its parent 'U19' has an alignment greater than its parent this may be caused by 'U19' being packed and can lead to unaligned accesses}} - int c; -}; -#pragma pack(pop) - -// Packed-Unpacked-Unpacked tests - -struct A5 { - char a; - T1 b; -}; - -struct __attribute__((packed)) U20 // Caused warning -{ - char a; - A5 b; // expected-warning {{field b within its parent 'U20' has an alignment greater than its parent this may be caused by 'U20' being packed and can lead to unaligned accesses}} - int c; -}; - -struct A6 { - char a; - T1 b; -}; - -#pragma pack(push, 1) -struct U21 // Caused warning -{ - char a; - A6 b; // expected-warning {{field b within its parent 'U21' has an alignment greater than its parent this may be caused by 'U21' being packed and can lead to unaligned accesses}} - int c; -}; -#pragma pack(pop) - -// Unpacked-Packed-Packed test - -struct __attribute__((packed)) A7 // No warning -{ - char a; - T2 b; -}; - -struct U22 // No warning -{ - char a; - A7 b; - int c; -}; - -// Unpacked-Packed-Unpacked tests - -struct __attribute__((packed)) A8 // Should cause warning -{ - char a; - T1 b; // expected-warning {{field b within its parent 'A8' has an alignment greater than its parent this may be caused by 'A8' being packed and can lead to unaligned accesses}} -}; - -struct U23 // No warning -{ - char a; - A8 b; - int c; -}; - -struct __attribute__((packed)) A9 // No warning -{ - char a; - T1 b __attribute__((aligned(4))); -}; - -struct U24 // No warning -{ - char a; - A9 b; - int c; -}; - -struct U1 s1; -struct U2 s2; -struct U3 s3; -struct U4 s4; -struct U5 s5; -struct U6 s6; -struct U7 s7; -struct U8 s8; -struct U9 s9; -struct U10 s10; -struct U11 s11; -struct U12 s12; -struct U13 s13; -struct U14 s14; -struct U15 s15; -struct U16 s16; -struct U17 s17; -struct U18 s18; -struct U19 s19; -struct U20 s20; -struct U21 s21; -struct U22 s22; -struct U23 s23; -struct U24 s24; \ No newline at end of file _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits