History log of /frameworks/compile/slang/slang_rs_backend.cpp
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
d56a92fc2b1d417ce53d9550548fe1661fa37d40 05-Aug-2014 Tim Murray <timmurray@google.com> Fix two bugs for 64-bit slang.

The first is to handle structs in invoke parameter lists by assuming struct and not struct*. The second is to not cache LLVM types for RS object types because it breaks on 64-bit compilation.

Change-Id: I26d7dd7395ef0146eb84d43cbec5cf8d49d09697
796e7b1400d3f3f7c07496d88bb48129ea925bb9 27-May-2014 Jean-Luc Brouillet <jeanluc@google.com> Remove useless "return;" statements.

More cleanups to follow...

Change-Id: Ib8348255273771c1e9ff07e79bd7fbc8f2795a5b
eca0534a31b6185d6ab758f5e97acd7a4cb21e8e 15-May-2014 Jean-Luc Brouillet <jeanluc@google.com> Add details to the TODO, simplify dummy names

Change-Id: I37451d8217c3d61ea76db377785045edb2d5c4b0
cec9b65aa890dea58e39951900ae13efb8d11703 15-May-2014 Jean-Luc Brouillet <jeanluc@google.com> Move DataType enum out of RSExportPrimitiveDataType.

It applies to more than just Primitives and should not have been in there.

Change-Id: If2b6a9d2a87a05176a74bcf7212f65cf1cdf67fe
ee4016d1247d3fbe50822de279d3da273d8aef4c 11-Apr-2014 Tim Murray <timmurray@google.com> Update Slang for Clang/LLVM 3.5a.

Change-Id: Icd59efa1197098076555c505c31939866e504a83
d3f7527b105d21f1c69d3473eb88a762f2c3ab5a 17-Jan-2014 Jean-Luc Brouillet <jeanluc@google.com> Add ReportErrror/Warning to RSContext.

Remove a lot of boilerplate code by adding error reporting methods to RSContext. There are still a few additional files that could be cleaned. That will be for another CL someday.

Change-Id: I6a261735720227ac87d94dbdea5ce4a7b8ef6cca
48d893dc7794b3cfb74f35955ca763ee4170f9ad 07-Dec-2013 Stephen Hines <srhines@google.com> Support reflection of enums.

Prior versions would just crash when attempting to reflect an enum type.
This patch maps enums to integers for reflection in Java.

Change-Id: I5b278d670564ceb606a6b96804f76a798bedc89c
5ac0c0bd054b8aa211b03a69f8d64a29f4984aca 23-Jul-2013 Tobias Grosser <grosser@google.com> Remove dead code trying to write opt-level

The previous commit exposed a piece of dead code, that apperently
tried to store the optimization level in the LLVM module generated
by the slang backend. As it was not functional and there also does
not seem to be a good reason to do so, we remove this code.

No functional change intended.

Change-Id: Ieffb1dc3e48db5aabe6ecab46bd12132161c694d
d460f623328e2b4ebd05bb93910edb471e6e91d6 23-Jul-2013 Tobias Grosser <grosser@google.com> Split HandleTranslationUnitPost in subfunctions

The original function had almost 200 lines. For readability we split
this function into smaller functional units. As the different units
have already been independent, this change just mechanically copies
their code into subfunctions. No functional change is intended.

Change-Id: I47891569231335b6f8674b0f5d05b7d83b13f85b
23c4358f12bd9d0ba7166eceebd683db95a41b3f 10-Jan-2013 Stephen Hines <srhines@google.com> Updates for LLVM merge to r171906 on 20130108.

Change-Id: I4cf3718041d8876d4a23a412b6b4fa4226ec3b50
11274a7324b478ec13e1d10a1b81350b34a65ab1 27-Sep-2012 Stephen Hines <srhines@google.com> Validate FS (and RS) ASTs.

This change adds a new RSCheckAST class that is used to handle validation
of the final AST. The checks include existing RS checks (for accepted types)
and new checks for Filterscript (like disallowing pointers, unions and
> 32 bit types completely). The refactoring also fixes a subtle union bug
that existed in prior versions of llvm-rs-cc. We also add an implicit
pragma for "rs_fp_relaxed" by default on Filterscript.

Bug: 7166741

Change-Id: Ia077783b4caba0bbd89df2ab3827e9f4d1009eea
cf9a73a4140402c0e9e4fbab27477f22cc7d8e3c 20-Sep-2012 Stephen Hines <srhines@google.com> Fix teardown bug for multiple files without pragma.

This previously caused a segmentation fault in llvm-rs-cc. We were
improperly using the DiagnosticsEngine after we had reset() everything.

Bug: 7202787

Change-Id: Ic8522566ef257e70f16caf34b89f6a8e012908c5
ab5a535b290d898d0c56036f642d823e3472a804 05-Aug-2012 Stephen Hines <srhines@google.com> Add RS-specific check forbidding array parameters in exported functions.


Change-Id: I31f0f2b51026edf450e920a5dd49810f4b191eb0
43730fe3c839af391efe6bdf56b0479860121924 03-Aug-2012 Shih-wei Liao <sliao@google.com> Apply changes to migrate to CLANG-160673-20120724.

Change-Id: I666df2ff91532318883dd48ea1249178b2ebda81
d5a84f6d49d64738e4bb7c9dea7242e48acad959 05-Apr-2012 Stephen Hines <srhines@google.com> Generate an error when exporting RS objects in structs/arrays.


Note that this error triggers when the following conditions are met:
1) We are running with a pre-JB target API.
2) We detect an RS object type inside another composite (struct/array) type.
3) The variable is going to be exported (i.e. non-static).
4) The variable must also be of a non-pointer type, since pointers only
reflect a bind() routine that does not use FieldPacker.

Change-Id: Id7ca47a4affed2a8774d1c9644e11d4ab02ff27f
5bfec8dd08b3bde9ba3b331e2115210b0e910eae 04-Apr-2012 Stephen Hines <srhines@google.com> Revert "Generate an error for exporting rs_objects in structs/arrays."

This reverts commit f5abb503e67587ad89bcec99ed925d4a75448dcd
f5abb503e67587ad89bcec99ed925d4a75448dcd 04-Apr-2012 Stephen Hines <srhines@google.com> Generate an error for exporting rs_objects in structs/arrays.


This is only an error in pre-JB builds that can't support proper ref-counting
within a FieldPacker.

Change-Id: Ib96b5ec2befa48ec44890391e518ad557e9a9117
8004db04a13a3031ca21dc0b2bb8875d5bbd4473 28-Mar-2012 Stephen Hines <srhines@google.com> am 011fed09: am ffbd99c5: Merge "Remove optimization level metadata."

* commit '011fed092c701396c830321e4db4e468af0827e3':
Remove optimization level metadata.
51322a4b764d1416e0b774720f56189a25376445 22-Mar-2012 Stephen Hines <srhines@google.com> Remove optimization level metadata.

This is because a prior change started to store the optimization level in the
bitcode wrapper.

Change-Id: I67983757bbb08b3f544ea15acfe049436885987a
2b8fb64be3047df940a219872b331eb11de2758d 09-Mar-2012 Stephen Hines <srhines@google.com> Removing DataKind completely from llvm-rs-cc.


Change-Id: I76fdb98fa60bd70468d088f9034acf00e443d6c8
e3cb21bc8654181da174ac441acec7726b5a78ec 02-Mar-2012 Jean-Baptiste Queru <jbq@google.com> am fa5209a2: am 9c459f0c: Merge "Enable emission of debugger-friendly bitcode"

* commit 'fa5209a2bd1e10f675a889c60d8d5a589e860d18':
Enable emission of debugger-friendly bitcode
c460b37ffb50819a32c2a8967754b6f784b28263 09-Jan-2012 mkopec1 <mkopec1@intel.com> Enable emission of debugger-friendly bitcode

- Add "-g" flag to llvm-rs-cc in order to emit debug metadata
- Add optimization level parameter -O and tests
- Add lit based tests (use llvm-lit from libbcc/tests/debuginfo)
-- Add README file for lit-tests directory

Change-Id: I5e2f6f9b6f536fa7a10de008b54ac0878cf352a9
7b51b55e4467605a599e868a0dde7cb95c5ab76e 16-Feb-2012 Stephen Hines <srhines@google.com> Export ForEach on non-root functions.


This change also updates expected diagnostics for our existing tests.

Change-Id: I98e12625d121ae20fcb6dcaacf0852c0f239c604
7aff4a0a124209fdf93ecbcd7aed701d39ba094b 09-Dec-2011 Stephen Hines <srhines@google.com> Update error diagnostics.

Change-Id: I8415450504f95cc3ad35866ed884fafc7ee24c90
fa6ef56a6ca3dc3061218a75a7e68e5357fcb82c 25-Nov-2011 Logan Chien <loganchien@google.com> Apply changes to migrate to upstream (Nov 25th 2011).

- HandleTopLevelDecl now returns bool.
- Additional APValue::MemberPointer case for switching.

Change-Id: Ieb7a693f96b07b7659712a3ab0abd200ce7df505
9207a2e495c8363606861e4f034504ec5c153dab 21-Oct-2011 Logan Chien <loganchien@google.com> Apply changes to migrate to LLVM upstream Oct 20th 2011.

- StructType::isAnonymous is renamed to StructType::isLiteral.

- PassManagerBuilder has been moved from
llvm/Support/PassManagerBuilder.h to

- Include llvm/Transforms/IPO.h for llvm::createInternalizePass.

- clang::DiagClient has be renamed to clang::DiagnosticConsumer.
Besides, we have to implement one additional pure virtual method
'clone' for create a clone of slang::DiagnosticBuffer.

- llvm::Linker::LinkModules comes with one additional parameter.
Passing llvm::Linker::DestroySource should be equivalent to
the old code we were using.

- slang::Slang is now derived from clang::ModuleLoader and implemented
loadModule pure virtual method (though we will always return NULL.)

- clang::Preprocessor is taking one additional parameter for

- clang::Diagnostic has been changed. A lot of the method has been
moved to clang::DiagnosticsEngine, and we can no longer 'Report' a
diagnostic from clang::Diagnostic. We have to use
clang::DiagnosticEngine instead.

- llvm::setCodeModel has been removed.

Change-Id: I1f2a4cbeaf61a8ed1d0d635a5a0e1baa90d99d07
688e64b2d56e4218c680b9d6523c5de672f55757 24-Aug-2011 Stephen Hines <srhines@google.com> Generate .rs.dtor() to clean up globals.


Change-Id: I9d1996153fe774a5ce95646a8a2e07aa6e7fa85f
4a4bf92a8add68629a7e6e59ef81c3c3fe603a75 19-Aug-2011 Stephen Hines <srhines@google.com> Don't generate forEach() on pre-ICS target SDK.

Change-Id: I794587d1f79a08aca8cc4f7f20f4012050ab0501
4ccf75e55fe460a8daa49247d7e5a797329c71a6 17-Aug-2011 Stephen Hines <srhines@google.com> Fix up parsing of root() function arguments.


Change-Id: I6ef41ebd237c864e46beee26f5952879d3712819
2e35b136cc2434080fcd682d2f95e53a87675dd4 22-Jul-2011 Stephen Hines <srhines@google.com> Add support for -target-api <n> to llvm-rs-cc.

Change-Id: Ieaef83fae55f84e87a9301b377633ac658a724b6
ab992e59a36a18df49bf4878968ef0598299afd3 20-Jul-2011 Logan Chien <loganchien@google.com> Apply changes to migrate to llvm upstream r135568.

- Remove the const qualifier of llvm::Type and
llvm::PointerType due to the API change.

- Update the relocation model setup code, since
llvm::TargetMachine changes the API.

- Qualify dyn_cast with llvm namespace.

Change-Id: I4820fb86effc3a62569e19a6a8753ba9e960f6b2
a67e4451d0d03b4ab7866b64807d95a8399c73a0 20-Jul-2011 Stephen Hines <srhines@google.com> Remove ArrayRefs!

Change-Id: Ie49fde338437a600384f10c5c7a730691bd0b9a4
7c67e578c760408dba0c2f64da6e074dd8b56fd9 19-Jul-2011 Shih-wei Liao <sliao@google.com> Apply changes to migrate to upstream API.

Change-Id: Ibe6060a0d1c42b9725524de7f4cb95551b711717
d27a74edb932580d224a7186731aa6be098ad02e 14-Jul-2011 Stephen Hines <srhines@google.com> Fix missing slot metadata issue + cleanup ArrayRefs.

Temporary ArrayRefs are very bad (tm). This change converts all temporary
ArrayRefs to be implicitly created where necessary, rather than using explicit
API calls.


Change-Id: I5ffedc737aee17b529c66ed76e8080c9886c6153
83f0c6261efc8f397fc2509e3862bc6d0eb1e1c4 21-Jun-2011 Shih-wei Liao <sliao@google.com> Apply API changes to migrate to CLANG upstream.

Change-Id: I376a8a24c238c4e27d37c4f846b93e2f6e38d79c
5baf6324a97430016026419deaef246ad75430fc 26-Apr-2011 Stephen Hines <srhines@google.com> Check RS functions (esp. init/root) for validity.

Change-Id: Ice65c8b691550e2d11caf621e0f88c822316601b
78e69cb06b9b0683b2ac9dcafde87b867690ef2f 23-Apr-2011 Stephen Hines <srhines@google.com> Forbid RS objects from being contained in unions.

This change also refactors variable validation in general for RS.

Change-Id: I4527986a07c9cf2babdc5b855cdb1f00e3535d5b
d0b5edd02be5f09c1d8d211f4a06b031a7b66510 19-Apr-2011 Stephen Hines <srhines@google.com> Disallow union copies that contain RS object types

This also cleans up RSObjectRefCount's usage of ASTContext a bit.


Change-Id: I9ca61e27fc5d6eb1befc2da4fe2d157f5936a56f
2bb67db8364162b30e6920baddf6c2e890b3ce79 11-Feb-2011 Stephen Hines <srhines@google.com> Replace struct assignments with rsSetObject calls.

Bug: 3092382
Change-Id: I63f16a7dac02eb348b87a6225944d48faa615899
6e6578a360497f78a181e63d7783422a9c9bfb15 08-Feb-2011 Stephen Hines <srhines@google.com> Add support for assertions in llvm-rs-cc.

Bug: 3430674
Change-Id: I3400238652449cde84275cc2a770f405332d9544
b3a12fe7c18a06f99201dc491a932a90ab7d975c 27-Jan-2011 Stephen Hines <srhines@google.com> Add Slang support for rs_object_slots metadata.

This is added to support proper cleanup of RS resources. We were leaking some
global resources because there was no way to tell which slots to clear.

Change-Id: Ib452facb1b83d1f2aecd9686f46ef726e427161d
b: 3381615
3fd0a94a5cf1656569b1aea07043cc63939dcb46 18-Jan-2011 Stephen Hines <srhines@google.com> Refactor pragma handling (pass everything to LLVM)

Change-Id: Id09d4934af06f0880cd867456218602ce9a9e2de
eb2eec96b5f19778ac1b7aebe6a91bbcb8d4df96 10-Jan-2011 Stephen Hines <srhines@google.com> Fix duplicate destructor issue.

We now explicitly require static variable destructors to be created in
HandleTranslationUnitPre() and global variable destructors to be created
in HandleTopLevelDecl().

Bug: 3092382
Change-Id: If9176c81951edb3430f1ad6ae80f9a06d73f5fd7
96ab06cbe40b2d73c0eb614f814cd761d8962b6b 06-Jan-2011 Stephen Hines <srhines@google.com> Add support for the version pragma.

Change-Id: I62707dcb432093ba50db95e527d55ff781be22a9
dd6206bb61bf8df2ed6b643abe8a29c48a315685 10-Dec-2010 Stephen Hines <srhines@google.com> Arrays of width 3 vector types cannot be exported.

Bug: 3171195
Change-Id: I7deab4ab9c7f8650bce7c597fae2a0dc013f6f71
e5e64432476a44b59c61ded233b1149109c7a7c3 03-Dec-2010 Stephen Hines <srhines@google.com> Improved error messages for structs.

This change also adds two new tests for anonymous structures (both with and
without an associated typedef). I have also updated test.py to support a more
verbose output for dumping the actual test commands that are executed.

Change-Id: Ic1edc8d4e98c2017611430eb581c335146ccc927
c97a333bc84ce8c28c96d07734cbded75c914639 01-Dec-2010 Stephen Hines <srhines@google.com> Improve validation of AST before reflection.

Change-Id: If4b52f3a713ab97145bc31ef42b18d1cc144099a
c808a99831115928b4648f4c8b86dc682594217a 30-Nov-2010 Stephen Hines <srhines@google.com> Add prelim error check for pointers in structs.

Bug: 2954471
Change-Id: Icacf67dd3eeb3dda67e1eae3d54e11f7efa6c680
e639eb5caa2c386b4a60659a4929e8a6141a2cbe 09-Nov-2010 Stephen Hines <srhines@google.com> Improve code style.

Change-Id: I26e043849bce2a4b41ae132fbe0c882f4a6f112f
1bdd4978caabcdc9489bdcb7f1cd6087340699e8 09-Nov-2010 Stephen Hines <srhines@google.com> Add simple destructors to local RS objects.

Change-Id: Ie4aa964840b25c3aa8eed257d4ff0a1e4f6ef22a
4b32ffdfc1ac766f8932e7effbcdf7484e804a8e 06-Nov-2010 Stephen Hines <srhines@google.com> Factor out RSObjectRefCount for destructor work.

Change-Id: Ibdacc9e9f15401680bc54747664e187a05f62e25
cfae0f350e4e0d8f7b4c71780b3f74f58fa23afb 02-Nov-2010 Stephen Hines <srhines@google.com> Process non-static funcs with HandleTopLevelDecl().

Bug: 3092382
This fixes an issue where non-static functions were not properly being
annotated with zero-initializers for all RS object types. It turns out that
HandleTranslationUnit() occurs well after we have generated code for extern
functions (which is how this bug first showed up).

Change-Id: Id752d8baafc161dd7142d340f8aaae62af9be019
b1771ef128b10c4d4575634828006bfba20b1d9c 22-Oct-2010 Zonr Chang <zonr@google.com> Exclude rs_matrixNxN from being RS object type.

rs_matrix{2x2, 3x3, 4x4} (RS matrix type) is very different than RS
object type like rs_allocation. This commit teaches llvm-rs-cc to learn

NOTE: Currenrly RS matrix type + RS object type = RS specific type.
0307eaa71dc1d05582347cacd9209ac1e6100102 21-Oct-2010 Zonr Chang <zonr@google.com> Define the RS type specification.
fcda2352b9e140529f8f3c89f05b10a70c0048b2 20-Oct-2010 Stephen Hines <srhines@google.com> Support for local RS zero initialization.

Change-Id: I785cfc6ee53abb6c88ab5bdba5e7c8c16b8409de
a65ec168e41e3ee9c6e8ac04cde694bbbfc2590a 16-Oct-2010 Zonr Chang <zonr@google.com> Unify type spec by creating rs-spec-gen.

rs-spec-gen (slang_rs_spec_table.cpp) will help llvm-rs-cc to share
the RS spec it used across the other projects. This will makes code
cleaner and therefore easier to add new spec/synchronize the spec
between other project (e.g., libbcc and libRS).

This CL is the first part. It eliminated the needs of
slang_rs_export_element_support.inc and
68fc02ca4a7235e2981be5eee4ad968a9d3928c0 13-Oct-2010 Zonr Chang <zonr@google.com> Add two new APIs in HandleTranslationUnitPre and HandleTranslationUnitPost.

Refer to the comments in slang_backend.h for detail.
c383a500aa59423264811be3874461bf8adbfea0 11-Oct-2010 Zonr Chang <zonr@google.com> Prepend legal announcement in all files.

Release libslang/llvm-rs-cc/llvm-rs-link under Apache 2.0 license.
592a954aae4cb946970b557e94afd5ee453fd57e 07-Oct-2010 Zonr Chang <zonr@google.com> Make --allow-rs-prefix more reasonable.

Now slang only alarms when a function prefixed with 'rs' and was not declared
in one of the RS default headers (including rs_graphics.rsh). Therefore, you
don't need to (and shouldn't) pass this option to slang in general.
7f2f385d3129ba4de82ef56adb9cb4385fd33001 07-Oct-2010 Zonr Chang <zonr@google.com> Rewrite llvm-rs-link a bit. It's now more clean.

Remove -e option from llvm-rs-link. Which means, we always run
internalize pass to hide those symbols which doesn't require to be

Change-Id: I7befd02352957ca087dcba2f097c195e3708c503
3a9ca1f0d6bd8f12c2bb2adea51f95c255996180 06-Oct-2010 Zonr Chang <zonr@google.com> Provide better abstraction of class Slang.

1. Remove the Slang C APIs support (not used by any other programs.)
2. All RS relatives are now in slang_rs_*.cpp.
0da0a7dc51c25943fe31d0bfccbdfee326a3199c 05-Oct-2010 Zonr Chang <zonr@google.com> 1. Rewrite reflection of parameter packet in RSExportFunc. In order to
generate the correct call (i.e., all parameters in the call instruction
must match the target function signature) regardless of ABI, we construct type
of parameter packet directly from target function prototype (which may not be
the same as the one declared in the source since Clang may modified it to
the type which is better supported by the target ABI.)
2. Rewrite reflection of RSExportRecordType to use clang::ASTRecordLayout. This
corrects the reflection of struct type when tail padding and field alignment
involve. This improves stability of RSExportRecordType reflection.
6315f76e3cc6ff2d012d1183a0b030d4ff0dc808 05-Oct-2010 zonr <zonr@google.com> More coding style fixing to improve the readability. No actual semantics
changed. This also makes cpplint happy.
9ef2f785e0cc490af678dfd685995dec787321ff 01-Oct-2010 Shih-wei Liao <sliao@google.com> The Mother-of-All code review:
1. Fix AllowRSPrefix bug
2. Remove member mRS*Pragma in class RSContext
3. No longer only support 2x2, 3x3, 4x4 arrays
4. Fix Export All code for victorhsieh
5. Improve readability and maintainability
6. size_t -> int in calculating padding

Change-Id: I772aebd1440af66a89e2d2e688b193e500f38d69
cecd11d2af5d45d8ba322bed61fb48a99c305528 21-Sep-2010 Shih-wei Liao <sliao@google.com> Fix warnings. Bug fix.

Change-Id: I80934814ae64d11f0edebfa3b131164207f1aca0
1ebc0ca6ffa7effb875883d18205ed4943ab8fc2 14-Sep-2010 Shih-wei Liao <sliao@google.com> Implement the ARM-specific struct layout ABI in exportable functions parameters for rs. Add the ABI-compliant #args when needed.
My old code inadvertently assumed x86 ABIs for structs, but ARM ABI/calling convention is tricky here, compared to x86's. Also, fixed the type promotion problem.
Note that the most portable fix is to add a shim layer in Clang which is a BIG undertaking like PNaCl. Let's put in the potential fix for b/2988615 now.

Change-Id: I1d9fe4d803485b55bb72112ea8e17c1f4a19dd32
f52a620440fa62257dfdcf2583f0f9df5b855c76 11-Sep-2010 Shih-wei Liao <sliao@google.com> Apply changes on slang such that it can work with LLVM/Clang upstream r112364/r112367.

Change-Id: If38da28502a6111b855105c2fceb23fdb0caefa4
4c9f742efa36b1037acc640184681d421aa0f6ba 05-Aug-2010 Shih-wei Liao <sliao@google.com> Right usage of linking. Enable the reuse of the same Slang object across multiple input files.

Change-Id: Id036c300ece9a245437ea2bdd0a9c0da436f558d
1fd8579fe65b13a26cfaad12d056d2fc9b46475a 07-Jul-2010 Kirk Stewart <kstewart@google.com> Add a command-line option to allow function names with the "rs" prefix (--allow-rs-prefix). When not specified, user-defined functions with that prefix will be treated as an error.

Change-Id: Ieefc8bb55d61980241d5392ffb32770a303ce6a7
001fb6dddbf1cc794532eeb6a55f7b500eab1abc 21-Jun-2010 Shih-wei Liao <sliao@google.com> 1. Add comments to clarify (E.g., don't worry. "syntax error will be triggered by predecessor later")
2. Create ASTContext before RSContext creation and pass it to RSContext for using later

Change-Id: I6c11af70f1a13036c560aa34d311808548390864
6b22674f4ef0a6c689c589830f1c44f443520785 11-Jun-2010 Kirk Stewart <kstewart@google.com> Add a check to prevent users from defining function names starting
witih "rs".

Change-Id: I2801d50b11439b37dd875957683bbf180c8df34a
462aefd62cc646d2ff753c1d003ef3cd7bbea262 05-Jun-2010 Shih-wei Liao <sliao@google.com> Initialize slang and Android.mk.

Change-Id: If74da8e54d45511c8c9bb236bcfeec508f4f2439